c – 如何调试罕见的死锁

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

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

如何有效地调试程序,使其重新启动一遍又一遍,直到它死锁? (或者也许我应该打开另一个问题与所有的代码一些帮助?)

先谢谢你 !

奖金问题:如何检查一切都很好用std :: condition_variable?你不能真正地告诉哪个线程是睡着的,或者是在等待条件下出现竞争条件.

解决方法

有两种基本方法:

>在调试器下自动运行程序.使用gdb program -ex’run< args>‘ -ex’quit’应该在调试器下运行程序,然后退出.如果程序仍然存在于一种形式或另一种形式(segfault,或者您手动分解),将被要求确认.
>在重现死锁后连接调试器.例如,gdb可以作为gdb< program> < PID>附加到运行的程序 – 只是等待死锁,然后附加.当连接的调试器导致更改时序时,这是非常有用的,您将无法再重新启动该错误.

以这种方式,您可以循环运行,并在喝咖啡时等待结果. BTW – 我发现第二个选项更容易.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...