我有一个多线程C程序,它在程序的特定点始终生成分段错误。当我用gdb运行它时,没有显示错误。你能想到只有在不使用调试器时才会出现故障的原因吗?不能用它来发现问题真烦人!
答案 0 :(得分:72)
经典Heisenbug。来自维基百科:
时间也可能是heisenbugs的一个因素。与正常执行相比,在调试器的控制下执行程序可以改变程序的执行定时。当程序通过调试器中的单步源线减慢时,时间敏感的错误(如竞争条件)可能无法再现。当行为涉及与不在调试器控制下的实体交互时,尤其如此,例如在两台机器之间调试网络数据包处理且只有一台机器处于调试器控制之下时。
调试器可能正在改变计时,并隐藏竞争条件。
在Linux上,GDB还会禁用地址空间随机化,并且您的崩溃可能特定于地址空间布局。试试(gdb) set disable-randomization off
。
最后,ulimit -c unlimited
和事后调试(已经由Robie建议)可能会有效。
答案 1 :(得分:6)
也许当使用gdb
内存被映射到一个位置,你的上/下流不会在内存上践踏导致崩溃。或者它可能是一种不再被绊倒的竞争条件。虽然听起来不直观,但你应该开心你的程序已经足够让你崩溃了。
一些建议
答案 2 :(得分:4)
通过调试它,你正在改变它正在运行的环境。听起来你正在处理某种竞争条件,并且通过调试它的事情安排稍有不同,所以你不会遇到这个问题。那个,或者事物以稍微不同的方式存储,所以它不会发生。您是否能够在代码中添加一些调试输出以帮助解决问题?这可能影响较小,让您找到问题。
答案 3 :(得分:1)
我以前完全遇到过这个问题!这是一个竞争条件,当我用调试器踩踏代码时,我所处的线程速度足够慢,不会触发竞争条件。太可怕了。
答案 4 :(得分:0)
如果您使用的是gcc
,请尝试使用-Wall
选项来获取所有警告。如果您使用像Eclipse这样的IDE,它将自动执行此操作。