我有一个在Linux服务器上运行的多线程Python应用程序。我可以使用PyDev的Debug Server远程调试它,这似乎是一个非常有价值的调试资源。然而,我发现有一个问题是阻止它像我想的那样有用。
当我的应用程序在服务器上运行时,我可以在另一个盒子上进入Eclipse,暂停MainThread,获得当时最新的堆栈跟踪,然后恢复执行。这很棒。但是,当我在其中一个子线程上尝试时,挂起按钮会变灰,但是没有堆栈跟踪,所有内容都会保持正常运行。我可以在Debug窗口中看到有一个子线程和它的PID,但无法真正控制它或查看它是什么。右键单击并尝试有用的“复制堆栈”只能给我“Thread-4 - pid29848_seq5”。
断点似乎没问题。如果一个子线程击中其中一个,我可以单步执行并观察变量等。但是,有效地使用它需要我在代码中已经有一个特定的兴趣点。我真的更希望运行我的应用程序,当它进入一个不寻常的状态时,使用PyDev看看是什么。
我的设置有问题吗?这只是PyDev的限制吗?我怎样才能看到子线程发生了什么?
答案 0 :(得分:0)
在看完法比奥的一篇帖子后,我设法弄明白了:
threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch)
应在调用pydev.settrace()
后添加答案 1 :(得分:0)
我能够使用pydev在eclipse中设置远程调试器并在线程应用程序中设置断点: http://devlvl99.blogspot.com/2014/01/debug-python-thread-multithreaded-pydev.html
答案 2 :(得分:-2)
鉴于Python并没有真正正确地执行线程(GIL必然会以这种或那种方式起作用),如果调试它们并不是令人兴奋的话,我也不会感到惊讶。如果说它调试C / C ++线程,即使在最新版本的GDB和CDT下也不是那么好。
我实际上并不确定,但我确信在Python中采用多个进程而不是多线程可能会让您的体验变得更好。如果您安排一些事情,以便Eclipse / PyDev的单个实例正在调试单个Python进程,那么您的屏幕上可能会有很多窗口,但这将是一个更灵活的调试体验。
这就是我过去在Cx中使用VxWorks所做的事情,其中没有线程或进程只是任务。结果是你可以为每个任务运行一个调试器,这很棒。