只有在不使用调试器时才使用 segfault

我有一个多线程的 C 程序,它会在程序的某个特定点上一直生成一个内存区段错误。当我使用 gdb 运行它时,不会显示任何错误。您能想到为什么只有在不使用调试器的情况下才会出现故障吗?不能用它来发现问题真是烦人!

35065 次浏览

通过对其进行调试,可以改变其运行的环境。这听起来像是您正在处理某种竞态条件,通过调试它,事情的安排略有不同,所以您不会遇到这个问题。或者存储方式稍有不同,所以不会发生。您能够在代码中输入一些调试输出以帮助解决问题吗?这可能影响较小,让你找到自己的问题。

经典的 海森堡。来自维基百科:

时间也是海森堡的一个因素。与正常执行相比,在调试器控制下执行程序可以更改程序的执行时间。当程序被调试器中的单步执行源代码行减速时,时间敏感的错误(如竞态条件)可能不会重现。当行为涉及与不受调试器控制的实体的交互时尤其如此,例如在两台计算机之间调试网络数据包处理并且只有一台计算机受调试器控制时。

调试器可能正在更改计时,并隐藏竞态条件。

在 Linux 上,GDB 还禁用地址空间随机化,您的崩溃可能是特定于地址空间布局的。

最后,ulimit -c unlimited和事后调试(已经由罗比建议)可以工作。

也许当使用 gdb内存映射到一个位置时,您的溢出/下溢流不会破坏内存,从而导致崩溃。或者它可能是一个不再被绊倒的比赛条件。虽然这听起来不直观,你应该是 快乐你的程序是不够好,崩溃了你。

一些建议

  1. 尝试使用免费的静态代码分析器
  2. 尝试像下面这样的 malloc ()调试器 救生圈
  3. 试试用 瓦尔格林运行

我以前也有过这样的问题!这是一个比赛条件,当我使用调试器单步执行代码时,我所在的线程的速度慢到足以不触发比赛条件。非常糟糕。

如果使用 gcc,请尝试使用 -Wall选项获取所有警告。如果您使用 Eclipse 这样的 IDE,它会自动完成这项工作。