我试图在锁定后修改多线程Python应用程序中的死锁.有没有办法附加调试器来检查进程的状态?
编辑:我在Linux上尝试这个,但是如果有一个跨平台的解决方案那就太棒了.毕竟是Python的:)
使用Winpdb.它是一个独立于平台的图形GPL Python调试器,支持通过网络进行远程调试,多线程,命名空间修改,嵌入式调试,加密通信,速度比pdb快20倍.
特征:
GPL许可证.Winpdb是免费软件.
兼容CPython 2.3到2.6和Python 3000
兼容wxPython 2.6到2.8
独立于平台,并在Ubuntu Gutsy和Windows XP上进行了测试.
用户界面:rpdb2是基于控制台的,而winpdb需要wxPython 2.6或更高版本.
(来源:winpdb.org)
是的,gdb适用于较低级别的调试.
您可以使用thread命令更改线程.
例如
(gdb) thr 2 [Switching to thread 2 (process 6159 thread 0x3f1b)] (gdb) backtrace ....
您还可以查看Python特定的调试器,如Winpdb或pydb.两个平台都独立.
您可以将调试器附加到多线程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> attachgdb> info threads gdb> thread gdb> bt gdb> pystack gdb> detach
看看发生了什么.的种类.
您可以使用"pyo"宏解析对象的内容. 克里斯在他的博客上有一些例子.
祝好运.
(为Dan的博客留出了一些重要信息,特别是线程修复!)