5

我有一个在 Linux 服务器上运行的多线程 Python 应用程序。我可以使用 PyDev 的调试服务器对其进行远程调试,这似乎是一个非常有价值的调试资源。但是,我发现有一个问题阻止它像我想要的那样有用。

当我的应用程序在服务器上运行时,我可以在另一个盒子上进入 Eclipse,暂停 MainThread,获得一个很好的堆栈跟踪它当时的状态,然后恢复执行。这很棒。但是,当我在其中一个子线程上尝试时,挂起按钮变灰,但没有堆栈跟踪,一切都继续正常运行。我可以在“调试”窗口中看到有一个子线程并且它是 PID,但无法真正控制它或查看它在做什么。右键单击并尝试听起来很有帮助的“复制堆栈”只会给我“Thread-4 - pid29848_seq5”。

断点似乎工作正常。如果子线程遇到其中一个,我可以单步执行并观察变量等。然而,有效地使用它需要我已经对代码有一个特定的兴趣点。我真的更希望运行我的应用程序,当它进入异常状态时,使用 PyDev 查看发生了什么。

我的设置有问题吗?这只是我所面临的 PyDev 的限制吗?我怎样才能看到子线程发生了什么?

4

3 回答 3

0

我能够使用 pydev 在 Eclipse 中的线程应用程序中设置远程调试器并设置断点:http: //devlvl99.blogspot.com/2014/01/debug-python-thread-multithreaded-pydev.html

于 2014-01-19T19:39:19.007 回答
0

在查看了 Fabio 的一篇帖子后,我设法弄清楚了:

threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch)

应该在调用 pydev.settrace() 后添加

于 2013-11-13T08:10:26.027 回答
-2

鉴于 Python 并没有真正正确地执行线程(GIL 必然会以某种方式搞砸),如果调试它们不是一种令人兴奋的体验,我不会感到惊讶。如果涉及到调试 C/C++ 线程,即使在最新版本的 GDB 和 CDT 下,体验也不是那么好。

我实际上并不确定,但我有一种预感,在 Python 中采用多个进程而不是多个线程可能会使您的体验更好。如果您安排事情,以便 Eclipse/PyDev 的单个实例正在调试单个 Python 进程,您最终可能会在屏幕上看到很多窗口,但这将是一种更加灵活的调试体验。

这就是我以前在 C 中的 VxWorks 下所做的,那里没有线程或进程,只有任务。结果是您可以为每个任务运行一个调试器,这非常棒。

于 2013-11-13T06:19:17.643 回答