在尝试以下方法时,调试c ++段错误的最佳方法是什么:
编辑:
我找到了我的段错误的来源。想象一下,#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是否知道这是由字节对齐引起的。
答案 0 :(得分:0)
另一种调试segfaulting程序的方法(让我们希望你使用的是版本控制系统)就是回滚你的提交,直到你的程序不再是segfaulting为止。从那时起,您知道下一次提交是引入segfault的提交。
在我的情况下,段错误是由不匹配的#pragma pack( push, 1 )
,#pragma pack( pop )
引起的。这可能会导致无意义的错误,例如std::set.insert
在新分配的std::set
上调用时会导致段错误。