仅在不使用调试器的情况
-
08-10-2019 - |
题
我有一个多线程C程序,该程序始终在程序中的特定点生成细分故障。当我使用GDB运行它时,没有显示故障。您能想到只有在不使用调试器时才发生故障可能发生的任何原因吗?无法使用它来发现问题很烦人!
解决方案
经典的 海森伯格. 。来自Wikipedia:
时间也可能是海森犬的一个因素。与正常执行相比,在调试器控制下执行程序可以更改程序的执行时间。当调试器中的单步源线减慢程序时,时间敏感的错误(例如种族条件)可能不会再现。当行为涉及与不受调试器控制的实体互动时,例如在两台机器之间调试网络数据包处理时,只有一台在调试器控制下进行调试时,尤其如此。
调试器可能正在改变时机,并隐藏比赛条件。
在Linux上,GDB还可以禁用地址空间随机化,并且您的崩溃可能是特定于地址空间布局的。尝试 (gdb) set disable-randomization off
.
最后, ulimit -c unlimited
尸体调试(Robie已经建议)可能会起作用。
其他提示
通过调试它,您正在更改它正在运行的环境。听起来您正在处理某种种族条件,并且通过调试它的计划略有不同,因此您不会遇到问题。那,或者是以稍微不同的方式存储的,因此不会发生。您是否可以在代码中放入一些调试输出以帮助解决问题?这可能会产生较小的影响,并让您找到问题。
我以前完全有这个问题!这是一个比赛条件,当我踏上带有调试器的代码时,我所处的线程的速度足够缓慢,可以不触发比赛条件。非常糟糕。
不隶属于 StackOverflow