Is there a way to attach a debugger to a multi-threaded Python process?我试图在锁定后修改多线程Python应用程序中的死锁。 有没有办法附加调试器来检查进程的状态? 编辑:我在Linux上尝试这个,但是如果有一个跨平台的解决方案那就太棒了。 毕竟是Python的:) 使用Winpdb。它是一个独立于平台的图形GPL Python调试器,支持通过网络进行远程调试,多线程,命名空间修改,嵌入式调试,加密通信,速度比pdb快20倍。 特征:
是的,gdb适用于较低级别的调试。 您可以使用thread命令更改线程。 例如
您还可以查看Python特定的调试器,如Winpdb或pydb。两个平台都独立。 您可以将调试器附加到多线程Python进程,但您需要在C级别执行此操作。要了解正在发生的事情,您需要使用符号编译Python解释器。如果你没有,你需要从python.org下载源代码并自己构建:
确保您的工作负载在该版本的解释器上运行。然后,您可以随时使用GDB附加到它。 Python人员在他们的Misc目录中包含了一个示例".gdbinit",它有一些有用的宏。但是对于多线程调试(!)来说它已经崩溃了。你需要替换这样的行
以下内容:
否则像
看看发生了什么。的种类。 您可以使用"pyo"宏解析对象的内容。克里斯在他的博客上有一些例子。 祝好运。 (为Dan的博客留出了一些重要信息,特别是线程修复!) 我在PyDev(Windows XP上的Eclipse)中调试多线程程序的经验是,使用thread.start_new_thread创建的线程无法挂钩,但是使用threading.Thread创建的线程可以被挂钩。希望这些信息有用。
如果你的意思是pydb,那就没办法了。在这方面做了一些努力: PyCharm IDE允许从4.0版开始附加到正在运行的Python进程。 这里描述了如何做到这一点。 pdbinject允许您将pdb注入已经运行的python进程。 pdbinject可执行文件只能在python2下运行,但也可以注入python3。
您尝试使用什么平台?大多数调试器允许您使用进程ID附加到正在运行的进程。 编辑:我没有任何GNU调试器(GDB)的经验,这是跨平台的,但我发现这个链接,它可能会开始你在正确的道路上。它解释了如何添加调试符号(方便读取堆栈跟踪)以及如何指示gdb附加到正在运行的python进程。 |