当以下尝试无济于事时,调试 C++ 段错误的最佳方法是什么:
- 隔离可能导致问题的代码
- 在 gdb 下运行
- 使用各种工具和选项在 valgrind 下运行
- 注释掉段错误行以查看段错误是否仍然发生
编辑:
我找到了我的段错误的根源。假设 #pragma pack( push, 1 )
行深埋在包含的 header 中,并且没有匹配的 #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 是否有任何方式知道这是由字节对齐引起的。
最佳答案
调试段错误程序的另一种方法(希望您使用的是版本控制系统)是回滚您的提交,直到您的程序不再发生段错误。从那时起,您就知道下一次提交是引入段错误的提交。
在我的例子中,段错误是由不匹配的 #pragma pack( push, 1 )
、#pragma pack( pop )
引起的。这可能会导致没有任何意义的错误,例如 std::set.insert
在调用新分配的 std::set
时导致段错误。
关于c++ - 调试难以捉摸的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070468/