2017-02-10 197 views
4

我有一个多线程应用程序在生产环境中运行,挂起在随机时间FUTEX_WAIT_PRIVATE状态的所有线程和gdb显示所有线程都试图锁定调用PyThread_acquire_lock。这是真正的海量应用程序,数以万计的代码行,我无法猜测这个错误发生在哪一行。 我可以以某种方式调试此问题吗?我可以修补threading.Lock调用和日志文件所有锁都获得/释放在应用程序中,然后读取此文件的情况下再次发生错误,但我认为还有其他的Python函数调用PyThread_acquire_lock。那么我该如何调试这个问题呢?也许有可能在Python的这个C函数调用中“订阅”并记录所有这些调用?调试PyThread_acquire_lock死锁

回答

4

您只需一步就可以找到答案:附加gdb以解锁死进程,并使用Python gdb扩展来检查处于死锁状态的行。

对于gdb --version> = 7:

sudo apt install python2.7-dbg python3-dbg 
sudo gdb /usr/bin/python[3] <pid_of_deadlocked_process> 
(gdb) thread apply all py-list 
(gdb) thread 2 
(gdb) py-up 
(gdb) py-print <lock_object> 

参考文献:https://docs.python.org/devguide/gdb.htmlhttps://wiki.python.org/moin/DebuggingWithGdb

+0

谢谢这听起来不错,我会再次赶上这个错误时,试试这个! – skavans