我试图在锁定后修改多线程Python应用程序中的死锁.有没有办法附加调试器来检查进程的状态?
编辑:我在Linux上尝试这个,但是如果有一个跨平台的解决方案那就太棒了.毕竟是Python的:)
nos*_*klo 15
使用Winpdb.它是一个独立于平台的图形GPL Python调试器,支持通过网络进行远程调试,多线程,命名空间修改,嵌入式调试,加密通信,速度比pdb快20倍.
特征:
(来源:winpdb.org)
ask*_*sol 11
是的,gdb适用于较低级别的调试.
您可以使用thread命令更改线程.
例如
(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....
Run Code Online (Sandbox Code Playgroud)
您还可以查看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
Run Code Online (Sandbox Code Playgroud)
确保您的工作负载在该版本的解释器上运行.然后,您可以随时使用GDB附加到它.Python人员在他们的Misc目录中包含了一个示例".gdbinit",它有一些有用的宏.但是对于多线程调试(!)来说它已经崩溃了.你需要替换这样的行
while $pc < Py_Main || $pc > Py_GetArgcArgv
Run Code Online (Sandbox Code Playgroud)
以下内容:
while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)
Run Code Online (Sandbox Code Playgroud)
否则,命令pystack
不会在主线程以外的线程上终止.有了这些东西,你可以做类似的事情
gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach
Run Code Online (Sandbox Code Playgroud)
看看发生了什么.的种类.
您可以使用"pyo"宏解析对象的内容. 克里斯在他的博客上有一些例子.
祝好运.
(为Dan的博客留出了一些重要信息,特别是线程修复!)