有没有办法将调试器附加到多线程Python进程?

Rea*_*nly 28 python debugging

我试图在锁定后修改多线程Python应用程序中的死锁.有没有办法附加调试器来检查进程的状态?

编辑:我在Linux上尝试这个,但是如果有一个跨平台的解决方案那就太棒了.毕竟是Python的:)

nos*_*klo 15

使用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)

  • 正如功能中所述:不幸的是,今天 python2 几乎已经死了,不再有帮助了。 (2认同)

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特定的调试器,如Winpdbpydb.两个平台都独立.


Pet*_*son 8

您可以将调试器附加到多线程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的博客留出了一些重要信息,特别是线程修复!)