仅在不使用调试器时才会出现段错误

Ben*_*ird 51 c debugging gdb segmentation-fault

我有一个多线程C程序,它在程序的特定点始终生成分段错误.当我用gdb运行它时,没有显示错误.你能想到只有在不使用调试器时才会出现故障的原因吗?不能用它来发现问题真烦人!

Meh*_*dad 78

经典的Heisenbug.来自维基百科:

时间也可能是heisenbugs的一个因素.与正常执行相比,在调试器的控制下执行程序可以改变程序的执行定时.当程序通过调试器中的单步源线减慢时,时间敏感的错误(如竞争条件)可能无法再现.当行为涉及与不在调试器控制下的实体交互时,例如在两台机器之间调试网络数据包处理且只有一台机器处于调试器控制之下时,尤其如此.

调试器可能正在改变定时,并隐藏竞争条件.

在Linux上,GDB还会禁用地址空间随机化,并且您的崩溃可能特定于地址空间布局.试试(gdb) set disable-randomization off.

最后,ulimit -c unlimited验尸调试(已经由Robie建议)可能有效.

  • 'set disable-randomization off'为我解决了类似的问题! (8认同)

Sie*_*geX 9

也许当使用gdb内存被映射到一个位置,你的上/下流不会在内存中践踏导致崩溃.或者它可能是一种不再被绊倒的竞争条件.虽然这听起来不直观,但你应该感到高兴,你的程序足以让你崩溃.

一些建议

  1. 尝试使用静态代码分析器,例如免费的 cppcheck
  2. 尝试像libefence一样的malloc()调试器
  3. 尝试通过valgrind运行它


Mar*_*ser 5

通过调试它,您正在更改运行它的环境。这听起来像是您正在处理某种竞争条件,并且通过调试它,事情安排的时间略有不同,因此您不会遇到问题。那样的话,或者事物的存储方式略有不同,因此不会发生。您是否可以在代码中放入一些调试输出以帮助解决问题?这可能影响较小,并且使您可以查找问题。