我有一个多线程C程序,该程序始终在程序中的特定点生成细分故障。当我使用GDB运行它时,没有显示故障。您能想到只有在不使用调试器时才发生故障可能发生的任何原因吗?无法使用它来发现问题很烦人!

有帮助吗?

解决方案

经典的 海森伯格. 。来自Wikipedia:

时间也可能是海森犬的一个因素。与正常执行相比,在调试器控制下执行程序可以更改程序的执行时间。当调试器中的单步源线减慢程序时,时间敏感的错误(例如种族条件)可能不会再现。当行为涉及与不受调试器控制的实体互动时,例如在两台机器之间调试网络数据包处理时,只有一台在调试器控制下进行调试时,尤其如此。

调试器可能正在改变时机,并隐藏比赛条件。

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

最后, ulimit -c unlimited 尸体调试(Robie已经建议)可能会起作用。

其他提示

也许使用时 gdb 内存映射在您的上/下流不在导致崩溃的内存上践踏的位置。或者可能是不再被绊倒的种族条件。虽然听起来不直觉,但你应该 快乐的 您的程序足以使您崩溃。

一些建议

  1. 尝试静态代码分析仪,例如免费CPPCHECK
  2. 尝试像Malloc()调试器一样libefence
  3. 尝试通过 Valgrind

通过调试它,您正在更改它正在运行的环境。听起来您正在处理某种种族条件,并且通过调试它的计划略有不同,因此您不会遇到问题。那,或者是以稍微不同的方式存储的,因此不会发生。您是否可以在代码中放入一些调试输出以帮助解决问题?这可能会产生较小的影响,并让您找到问题。

我以前完全有这个问题!这是一个比赛条件,当我踏上带有调试器的代码时,我所处的线程的速度足够缓慢,可以不触发比赛条件。非常糟糕。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top