调试 PyThread_acquire_lock 死锁
Debug PyThread_acquire_lock deadlock
我在生产环境中有一个多线程应用程序 运行,它随机挂起,所有线程的状态为 FUTEX_WAIT_PRIVATE
,gdb 显示所有线程都在尝试进行锁定调用 PyThread_acquire_lock
.这确实是一个拥有数万行代码的大型应用程序,我无法猜测在哪一行发生了这个错误。
我能以某种方式调试这个问题吗?我可以修补 threading.Lock 调用并记录到应用程序中所有锁 acquired/released 的文件,然后在再次发生错误的情况下读取此文件,但我认为还有其他 python 函数调用PyThread_acquire_lock
。那么我该如何调试这个问题呢?也许可以 "subscribe" 从 Python 调用这个 C 函数并记录所有这些调用?
您距离答案仅一步之遥:使用 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.html, https://wiki.python.org/moin/DebuggingWithGdb
我在生产环境中有一个多线程应用程序 运行,它随机挂起,所有线程的状态为 FUTEX_WAIT_PRIVATE
,gdb 显示所有线程都在尝试进行锁定调用 PyThread_acquire_lock
.这确实是一个拥有数万行代码的大型应用程序,我无法猜测在哪一行发生了这个错误。
我能以某种方式调试这个问题吗?我可以修补 threading.Lock 调用并记录到应用程序中所有锁 acquired/released 的文件,然后在再次发生错误的情况下读取此文件,但我认为还有其他 python 函数调用PyThread_acquire_lock
。那么我该如何调试这个问题呢?也许可以 "subscribe" 从 Python 调用这个 C 函数并记录所有这些调用?
您距离答案仅一步之遥:使用 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.html, https://wiki.python.org/moin/DebuggingWithGdb