我有一个正在检查的核心文件。我只是为可能的原因而感到困惑。这是行为:

extern sampleclas* someobj;
void func()
{
    someobj->MemFuncCall("This is a sample str");
}


我的崩溃是在MemFuncCall内部。但是,当我检查核心文件时,someobj有一个地址,例如abc(此地址已正确初始化且未损坏),与函数stacktrace中的此指针不同:sampleclass :: MemFuncCall(this = xyz,“这是一个示例str“)

我以为这个指针将始终与someobj的地址相同,即abc应该始终等于xyz。
这两个地址可能不同的可能情况是什么???
Fyi,这个程序是单线程的。

最佳答案

有可能的。也许某种缓冲区溢出?也许MemFuncCall的调用约定(或一般的定义)是错误的(编译时使用的标头与编译MemFuncCall时的标头不匹配)。

很难说。
但是由于这是单线程的,所以我将尝试以下技术。通常,在应用程序重新运行之间,应用程序中的内存布局是相同的。因此,在调试器下启动应用程序,立即将其停止,然后在地址0xabc和0xxyz上放置两个内存断点。一旦有人修改了此内存,您就有很大的机会达到断点。也许堆栈跟踪会有所帮助吗?

10-06 14:29