对这种奇怪的崩溃有什么可能的解释?

时间:2009-12-28 20:05:29

标签: c++ debugging

我正在检查核心文件。我只是对可能导致这种情况的原因感到困惑。这是行为:

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

我的崩溃在MemFuncCall中。但是当我检查核心文件时,someobj有一个地址,比如abc(这个地址被正确初始化而没有被破坏),这与函数stacktrace中的这个指针不同:sampleclass :: MemFuncCall(this = xyz,“This is a sample STR“)

我假设这个指针总是和someobj的地址相同,即abc应该总是等于xyz。 这两个地址有什么不同可能的情况??? Fyi,这个应用程序是单线程的。

5 个答案:

答案 0 :(得分:2)

发布优化可能会使调试器中的内容显得非常奇怪。在调试模式(优化关闭)和repo。

中重新编译

另一种可能的解释是,如果MemFuncCall的调用约定(或一般定义)是错误的(在编译的头之间和编译MemFuncCall时之间存在分歧)。不过,你必须努力解决这个问题。

答案 1 :(得分:1)

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

很难说。 但由于这是单线程,我会尝试遵循技术。应用程序重新运行时,应用程序中的内存布局通常是相同的。因此,在调试器下启动应用程序,立即停止它并在地址0xabc和0xxyz上放置两个内存断点。一旦有人修改了这个记忆,你很有可能遇到断点。可能比堆栈跟踪有帮助吗?

答案 2 :(得分:1)

在多重继承的情况下,this指针可以与指向“真实”对象的指针不同:

struct A {
  int a;
  void fa() {  std::cout << "A::this=" << this << std::endl;  }
};

struct B {
  int b;
  void fb() {  std::cout << "B::this=" << this << std::endl;  }
};

struct C : A, B {
};

int main() {
   C obj;
   obj.fa();
   obj.fb();
}

obj.fa()内,this将指向A的{​​{1}}部分,而在obj内,它将指向fb()部分。因此B指针在不同方法中可能有所不同,也与this不同。

作为崩溃的原因,可能是&obj之前被删除且指针不再有效。

答案 3 :(得分:1)

由于指针someobj是在外部定义的,因此编译单元之间可能存在一些不一致。尝试清理所有内容并重建项目

答案 4 :(得分:0)

我能想到的一件事是vtable腐败。