【问题标题】:How to properly debug a python3.3 curses application using pdb?如何使用 pdb 正确调试 python3.3 诅咒应用程序?
【发布时间】:2014-01-12 17:18:14
【问题描述】:

当使用pdb 调试curses 应用程序时,交互式调试器是无用的,因为curses 会弄乱终端屏幕。虽然调试事后分析是可行的,但这有点有限。

所以我们可能需要让调试器在与被调试对象(被调试的应用程序)分开的终端中工作。 一些应用远程调试的替代方案(例如xpdb)似乎不适用于python 3.3,或者由于其他原因出现奇怪的错误。

那么我怎样才能在不同的终端中使用pdb,或者以另一种正确的方式?

【问题讨论】:

标签: python debugging python-3.3 curses


【解决方案1】:

使用一些调试器的功能来附加到正在运行的进程。例如,您可以尝试:

gdb python <pid>

看这里Python Wiki DebuggingWithGdb

作为您要调试的进程的 pid。还有WinPdb 允许您连接到远程或本地进程。 WinPdb 有据可查,我认为这是您的最佳选择。

【讨论】:

  • 对我来说,winpdb 出于某种原因无法正常工作。当我运行python3.3 /usr/local/lib/python3.3/dist-packages/rpdb2.py --debuggee script.py 时出现错误:文件“/usr/local/lib/python3.3/dist-packages/rpdb2.py”,第 13682 行,在 __getsignal handler = g_signal_handlers.get(signum, g_signal_getsignal(signum) ) ValueError: 信号编号超出范围
【解决方案2】:

我发现 Python 文档中的这一点建议很有帮助:

调试 curses 应用程序时的一个常见问题是 当应用程序死掉而不恢复 终端恢复到之前的状态。在 Python 中,这通常发生在 您的代码有问题并引发未捕获的异常。钥匙没有 当您键入它们时,它们会在屏幕上回显,例如, 使使用外壳变得困难。在 Python 中你可以避免这些 通过导入模块使调试更容易 诅咒.包装器。它提供了一个 wrapper() 函数,该函数接受一个 可调用的。它执行上述初始化,并且 如果存在颜色支持,则初始化颜色。然后它运行你的 提供可调用并最终适当地取消初始化。这 callable 在捕获异常的 try-catch 子句中调用, 执行curses去初始化,然后传递异常 向上。因此,您的终端不会在 例外。

有关信息,请参阅here

【讨论】:

  • 我已经这样做了——在编写 curses 应用程序时你应该总是这样做。 curses.wrapper 的使用也是 OP 中指出的事后调试工作的原因。但是,使用 set_trace 即时调试正在运行的 curses 应用程序是行不通的,因为 curses 应用程序尚未关闭。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2012-03-28
  • 2014-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
相关资源
最近更新 更多