使用GDB时不会发生错误。如何调试?

时间:2019-05-20 10:58:36

标签: c debugging gdb heisenbug

c项目包含将进程附加到gnu调试器(GDB)时不会发生的错误。

该项目是由学生编写的,效果不是很好。这是使用互斥量和条件变量的线程同步问题。

通过内置机制终止运行程序时,并非所有互斥锁都已正确解锁。将同一程序附加到GDB时,该程序需要花费更长的时间才能终止,并且操作正确。

ATM我不是要调试程序本身,而是要了解GDB为什么以及如何抑制该bug(出于教育目的),以便能够正确调试该程序。

GNU调试器版本:(openSUSE Leap 15.0)8.2

我现在不知道如何生成代码示例,因为我还不能缩小问题的范围。

我很高兴修改有关查询的问题,但这是我能做的最好的ATM。

2 个答案:

答案 0 :(得分:1)

  

我不是要调试程序本身,而是要了解GDB为什么以及如何抑制该bug(出于教育目的),以便能够正确调试该程序。

GDB在线程创建和退出例程上设置了断点,因此它知道要附加新线程并分离死线程。

这会影响多线程程序的计时,尤其是那些创建或破坏许多线程的程序。

如果您的程序对计时敏感(听起来确实如此),则GDB可能不是调试的正确工具。对于任何调试器而言,调试竞争条件尤其困难。使用Thread Sanitizer可能会更好。

答案 1 :(得分:0)

  

使用GDB时不会发生错误。如何调试?

使用printf(或类似功能)记录调试消息:

  • 在锁定互斥锁之前使用printf
  • 锁定互斥锁后的printf
  • 互斥量释放时的printf

如果还打印线程标识符,则将能够发现线程是否忘记使用或释放​​互斥锁。