如何使用pdb运行程序并在遇到错误时暂停?

2 投票
1 回答
725 浏览
提问于 2025-04-21 05:36

使用 python 解释器和/或 pdb,我们能否在程序运行时遇到错误就暂停,这样我就可以查看程序崩溃时的调用栈的所有帧?

当我直接在 python 解释器中运行程序时,遇到错误时,它会告诉我出错的代码行在哪里,但似乎总是返回到最上面的帧,这样我就无法查看实际出错的帧。例如:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 194, in <module>
    addlevel(root_toc, 0)
  File "test.py", line 191, in addlevel
    addlevel(child, root_level+1)
  File "test.py", line 188, in addlevel
    root.value.append(root_level)
AttributeError: 'str' object has no attribute 'append'
>>> root_level
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'root_level' is not defined

错误发生在最底层的帧,而我无法查看那个帧中 root_level 的值。这是因为在错误发生后它返回到最上面的帧吗?我该如何查看最底层的帧呢?

谢谢。

1 个回答

6

可以把pdb当作一个模块来运行,同时把你想调试的脚本传给它。这样的话,当程序出现异常退出时,它会自动暂停。(这个在官方文档的开头就提到过。)

python -m pdb my_script.py

如果你在解释器里,可以使用pdb.pm()来调试最近的错误信息。


或者,你也可以使用IPython解释器。在遇到未处理的异常后,输入debug,就会进入一个pdb会话,查看最近的错误信息,这和pm()的效果类似。

撰写回答