c++ - 调试难以捉摸的段错误

标签 c++ debugging segmentation-fault

当以下尝试无济于事时,调试 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/

相关文章:

c++ - (函数)模板的 C++ 非类型参数是否有序?

javascript - 如何始终获得良好的页面源格式?

python - 即使条件为假,VScode 中的条件断点也会跳闸

c# - .NET BCL 中的跟踪与调试

c - 如何检查字符串是否没有任何字母数字字符?

python - 在 osx 上使用 numpy 的 lapack_lite 进行多处理的段错误,而不是 linux

php - 通过多用户网页重复执行linux程序而不崩溃

c++ - 在读/写 fstream 上查找/写入某个位置时自动扩展文件大小

android - 如何从 Java (Android) 以函数指针作为参数调用 C++ 方法

C:图中的邻接列表 - 段错误