调试分段故障

时间:2013-09-11 14:46:52

标签: c++ debugging segmentation-fault

我有一个c ++程序,可以在gcc(4.8.1),icpc(13.1.3),clang ++(3.3)下编译好,并且运行正常,除了与segfault崩溃的clang ++版本。当我尝试在gdb或lldb调试器中运行它时,我得到地址为0x0的EXC_BAD_ACCESS。崩溃发生在助手类的成员函数中,调试器声称this具有值0x0。但是,如果上升到一个级别,则报告辅助类的指针pimpl具有非空值,并且我可以访问其数据,这看起来非常合理。

这里有一些伪代码(...不是椭圆,但是意思是“一些参数”)

struct helper;

struct foo {
  helper* pimpl;
  foo(...);
  void bar(...);
};

struct helper {
  helper(...);
  void hbar(...)
  {
     // crash here with *this = 0x0 according to debugger
  }
};

foo::foo(...) : pimpl(new helper(...)) {}

void foo::bar(...)
{
  pimpl->hbar(...);  // pimpl NOT 0x0 according to debugger ??!
}

可能出现什么问题我该如何找到?注意:问题是 NOT: “我的代码有什么问题?”

编辑1 也许值得一提的是,传递给helper::hbar()的一些参数已被“编译器优化”,根据调试器,{foo::bar() 1}}),虽然他们在0x0

中有地址helper::hbar()

编辑2 如果我从this中打印出helper::hbar()的值,则不会发生错误。

编辑3 -O0以及-O2发生错误。

编辑4 helper::hbar()的第一个arg是通过const引用获得的。如果我按值改变它,一切正常......那个参数是一个空间矢量,类似于std::array<double,3>

1 个答案:

答案 0 :(得分:0)

一种方法 - 创建一个日志文件,打印pimpl值/某个属于pimpl的变量

pimpl->hbar(...);, 

和里面

pimpl->hbar(...);

比较不同编译器的输出,尝试缩小在开始看到分歧时向日志文件中添加更多输出的问题......