python - 调试 PyThread_acquire_lock 死锁

标签 python multithreading debugging locking deadlock

我有一个在生产环境中运行的多线程应用程序,它在所有线程的 FUTEX_WAIT_PRIVATE 状态下随机挂起,gdb 显示所有线程都在尝试锁定调用 PyThread_acquire_lock。这确实是一个拥有数万行代码的大型应用程序,我无法猜测在哪一行发生了这个错误。 我能以某种方式调试这个问题吗?我可以修补 threading.Lock 调用并记录到文件中,所有锁都在应用程序中获取/释放,然后在再次发生错误的情况下读取此文件,但我认为还有其他 python 函数调用 PyThread_acquire_lock .那么我该如何调试这个问题呢?也许可以“订阅”来自 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

关于python - 调试 PyThread_acquire_lock 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169768/

相关文章:

vb.net - 如何知道一组线程是否完成

linux - 与网络/IO 绑定(bind)应用程序的进程相比,在 Linux 上工作时的线程限制是什么?

javascript - 从 IntelliJ 调试 Grails 应用程序的 JavaScript

PHP 错误日志在第 1768776801 行显示警告

python - Pandas 在关联的字符串值处将列添加到新数据框?

python - 漫画书标题的可选正则表达式组 (python)

iphone - 为 NSOperationQueue 设置并发操作只会导致该数量的操作

php - httpd 无法加载 xDebug : The procedure entry point could not be located

python - SQL Bigint 到 int64 到时间戳产生错误的日​​期

基于 Python 扭曲事件的 jabber/xmpp/email/irc/chat 客户端,用于监听和响应消息