调试PyThread_acquire_lock死锁

时间:2017-02-10 22:38:05

标签: python multithreading debugging locking deadlock

我有一个在生产环境中运行的多线程应用程序,它随机时间挂起,所有线程的状态为FUTEX_WAIT_PRIVATE,gdb显示所有线程都试图进行锁定调用{​​{1}}。这是真正庞大的应用程序与成千上万的代码行,我不知道这个错误发生在哪一行。 我可以以某种方式调试此问题吗?我可以修补threading.Lock调用和登录文件在应用程序中获取/释放所有锁,然后在再次发生错误的情况下读取此文件,但我认为还有其他python函数调用PyThread_acquire_lock。那我该怎么调试这个问题呢?也许可以从Python“订阅”这个C函数调用并记录所有这些调用?

1 个答案:

答案 0 :(得分: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