调试难以捉摸的段错误

时间:2014-04-14 21:09:23

标签: c++ debugging segmentation-fault

在尝试以下方法时,调试c ++段错误的最佳方法是什么:

  • 隔离似乎导致问题的代码
  • 在gdb下运行
  • 使用各种工具和选项在valgrind下运行
  • 评论segfaulting行以查看是否仍然发生段错误

编辑:

我找到了我的段错误的来源。想象一下,#pragma pack( push, 1 )行深埋在包含的标题中,没有匹配的#pragma push( pop ),可能是由于#if[n]def MACRO被盲目抛出。

#pragma pack( push, 1 )

#include <set>

int main()
{
    std::set<int> a;
    a.insert( 1 );
    return 0;
}

这个段错误发生在我的机器上,而valgrind只是抱怨无效的读取。我不知道gdb是否知道这是由字节对齐引起的。

1 个答案:

答案 0 :(得分:0)

另一种调试segfaulting程序的方法(让我们希望你使用的是版本控制系统)就是回滚你的提交,直到你的程序不再是segfaulting为止。从那时起,您知道下一次提交是引入segfault的提交。

在我的情况下,段错误是由不匹配的#pragma pack( push, 1 )#pragma pack( pop )引起的。这可能会导致无意义的错误,例如std::set.insert在新分配的std::set上调用时会导致段错误。