c项目包含将进程附加到gnu调试器(GDB)时不会发生的错误。
该项目是由学生编写的,效果不是很好。这是使用互斥量和条件变量的线程同步问题。
通过内置机制终止运行程序时,并非所有互斥锁都已正确解锁。将同一程序附加到GDB时,该程序需要花费更长的时间才能终止,并且操作正确。
ATM我不是要调试程序本身,而是要了解GDB为什么以及如何抑制该bug(出于教育目的),以便能够正确调试该程序。
GNU调试器版本:(openSUSE Leap 15.0)8.2
我现在不知道如何生成代码示例,因为我还不能缩小问题的范围。
我很高兴修改有关查询的问题,但这是我能做的最好的ATM。
答案 0 :(得分:1)
我不是要调试程序本身,而是要了解GDB为什么以及如何抑制该bug(出于教育目的),以便能够正确调试该程序。
GDB在线程创建和退出例程上设置了断点,因此它知道要附加新线程并分离死线程。
这会影响多线程程序的计时,尤其是那些创建或破坏许多线程的程序。
如果您的程序对计时敏感(听起来确实如此),则GDB可能不是调试的正确工具。对于任何调试器而言,调试竞争条件尤其困难。使用Thread Sanitizer可能会更好。
答案 1 :(得分:0)
使用GDB时不会发生错误。如何调试?
使用printf(或类似功能)记录调试消息:
如果还打印线程标识符,则将能够发现线程是否忘记使用或释放互斥锁。