调试PyThread_acquire_lock死锁

ska*_*ans 6 python debugging multithreading deadlock locking

我有一个在生产环境中运行的多线程应用程序,该应用程序在FUTEX_WAIT_PRIVATE所有时间处于随机状态挂起,并且所有线程的状态都挂起,并且gdb显示所有线程都在尝试进行锁调用PyThread_acquire_lock。这确实是具有成千上万行代码的大规模应用程序,我无法猜出该错误发生在哪一行。我可以以某种方式调试此问题吗?我可以修补threading.Lock调用并记录到文件中,所有锁都已在应用程序中获取/释放,然后在再次发生错误的情况下读取此文件,但是我认为还有其他python函数正在调用PyThread_acquire_lock。那么我该如何调试问题?也许可以从Python“订阅”该C函数调用并记录所有这些调用?

voi*_*oid 5

您距离答案只有一步之遥:附加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>
Run Code Online (Sandbox Code Playgroud)

参考:https : //docs.python.org/devguide/gdb.html,https : //wiki.python.org/moin/DebuggingWithGdb