我尝试在多线程Python应用程序锁定后调试它的死锁。有没有一种方法可以附加调试器来检查进程的状态?
编辑:我正在Linux上尝试这样做,但是如果有一个跨平台的解决方案就太好了。它毕竟是Python :)
发布于 2008-09-11 13:19:11
发布于 2009-02-15 12:18:34
您可以将调试器附加到多线程Python进程,但需要在C级别执行此操作。为了理解发生了什么,您需要用符号编译Python解释器。如果你没有,你需要从python.org下载源代码并自己构建:
./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy
确保您的工作负载在该版本的解释器上运行。然后,您可以随时使用GDB附加到它。Python的工作人员在他们的Misc目录中包含了一个示例".gdbinit“,其中包含一些有用的宏。然而,它在多线程调试中被破坏了(!)。您需要像这样替换行
while $pc < Py_Main || $pc > Py_GetArgcArgv
具有以下功能:
while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)
否则,像pystack
这样的命令不会在主线程以外的线程上终止。准备好这些东西后,您可以执行以下操作
gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach
看看是怎么回事。有点。
您可以使用"pyo“宏解析对象是什么。Chris has some examples在他的博客上写道。
祝好运。
(请大声喊出Dan's blog,为我提供一些关键信息,特别是线程修复!)
发布于 2008-09-12 14:51:52
如果您指的是pydb,就没有办法做到这一点。在这个方向上有一些努力:see the svn commit,但它被放弃了。据推测是winpdb supports it。
https://stackoverflow.com/questions/47701
复制相似问题