【问题标题】:Is there a way to debug a subprocess using pydev?有没有办法使用 pydev 调试子进程?
【发布时间】:2010-12-10 03:26:01
【问题描述】:

我正在使用 Eclipse / PyDev 试图找到一种方法来调试使用subprocess.Popen 创建子进程的代码:我希望能够调试创建的子进程。问题是我找不到跨进程边界进行调试的方法,我猜这实际上是不可能的。不过,除非你问,否则你永远不会知道,所以我正在这样做!

一点背景知识:我有一个由Waf 驱动的复杂构建过程,它根据需要通过调用nose 来调用我们的单元测试:我想挂钩这些过程以调试单元测试失败。我知道我可以尝试直接运行鼻子,但问题是我必须为我们的模块正确加载配置的环境相当复杂,如果可以避免的话,我不想复制代码来做到这一点。

我知道remote debugging 模式,但这很不方便,因为我必须在远程进程中手动调用调试器。如果有人知道我正在尝试做的事情的方法,将不胜感激。

【问题讨论】:

  • 这个问题及其答案已经很老了,但我建议您接受 pimlottc 的答案,而不是当前接受的 Raphael 的答案。 Raphael 的答案在给出时可能是正确的,但 pimlottc 的答案是绝对正确的,现在非常有用。

标签: python eclipse debugging pydev waf


【解决方案1】:

我似乎 PyDev 做不到(PyDbg 和 WinDbg 也做不到),但看起来 gdb 可以:http://wiki.python.org/moin/DebuggingWithGdb

【讨论】:

  • 它可以跟随分叉进入子流程还是您只是建议手动附加到子流程?有趣的是 GDB 可以检查 python 堆栈:我不知道 :)
  • 顺便说一句,必须手动附加的限制实际上是 Unix 系统工作方式的结果,并不特定于任何特定的语言或调试器。
  • 是的,这当然是真的:遗憾的是,没有办法附加 a 进程并获得与 Pydev 调试器的直接子进程相同的控制。跨度>
【解决方案2】:

我找到了一些可能对您有用的解决方法。

和你一样,我首先找到了在所需断点处手动插入对 pydevd.settrace() 的调用的远程调试选项。但我也注意到后续的 PyDev 断点(即通过单击左边距创建的断点)被遵守了。因此,您似乎只需要第一次显式调用 settrace 来为进程建立远程调试会话,然后只需使用正常的调试器断点即可。

此外,您可以修改 settrace 调用,使其实际上不会暂停进程:

import pydevd
pydevd.settrace(suspend=False)

所以在子进程初始化的早期插入上面的代码,你应该没问题。还是有点hack,但绝对比手动方法好。

【讨论】:

  • settrace 还有一个附加标志可应用于子线程,但对我来说似乎并不可靠:pydevd.settrace(suspend=False, trace_only_current_thread=False)
  • 从 PyDev 1.6.4 开始,跟踪子线程对我来说效果很好。 pydev.settrace(...) 调用放在主线程中。
猜你喜欢
  • 2017-07-13
  • 2017-05-02
  • 2021-03-28
  • 2021-10-10
  • 2011-09-10
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多