如何调试罕见的死锁?

Lær*_*rne 16 c++ multithreading deadlock threadpool c++11

我正在尝试调试很少有死锁的自定义线程池实现.所以我不能使用像gdb这样的调试器,因为我在遇到死锁之前点击了100次"启动"调试器.

目前,我在shell脚本的无限循环中运行线程池测试,但这意味着我看不到变量等等.我正在尝试std::cout数据,但这会减慢线程并减少死锁的风险,这意味着我可以在获取消息之前等待1小时的无限.然后我没有得到错误,我需要更多的消息,这意味着再等一个小时......

如何有效地调试程序,以便它一遍又一遍地重启直到它死锁?(或者我应该用所有代码打开另一个问题以获得一些帮助?)

先感谢您 !

奖金问题:如何检查一切顺利std::condition_variable?您无法确定哪个线程处于睡眠状态,或者条件是否出现竞争wait条件.

Mac*_*tka 18

有两种基本方法:

  1. 在调试器下自动运行程序.使用gdb program -ex 'run <args>' -ex 'quit'应该在调试器下运行程序然后退出.如果程序仍然以某种形式存在(段错误,或者您手动打破),则会要求您确认.
  2. 重现死锁连接调试器.例如,可以运行gdb gdb <program> <pid>以附加到正在运行的程序 - 只需等待死锁然后附加即可.当附加的调试器导致更改时间并且您无法再重置错误时,这尤其有用.

通过这种方式,您可以在循环中运行它并在喝咖啡时等待结果.顺便说一句 - 我发现第二种选择更容易.


Han*_*der 5

如果这是某种功课 - 一次又一次地重新启动调试将是一种合理的方法.

如果有人为你等待的每一个小时付钱,他们可能更愿意投资支持基于重放的调试的软件,即一个记录程序所做的一切的软件,每条指令,并允许你一次又一次地重放它,来回调试.因此,不是添加更多调试,而是记录发生死锁的会话,然后在发生死锁之前开始调试.你可以随心所欲地来回走动,直到你终于找到了罪魁祸首.

链接中提到的软件实际上支持Linux和多线程.