文章

Python 调试器 PDB

简介

pdb,即 Python Debugger,是 Python 标准库的一部分,用于在调试器的环境中交互式地调试代码(尤其是无 GUI 的场景下),这对于追踪难以发现的错误非常有用。

在想要进入调试器的位置插入如下代码:

1
2
import pdb
pdb.set_trace()

执行上述代码后,Python 会在此位置停止并显示一个 (Pdb) 提示符。这意味着您现在已在交互式调试器中暂停并可以输入命令。

PEP 553 描述了内置函数 breakpoint,它使进入调试器变得简单且一致,于 Python 3.7 引入。使用 breakpoint 函数更加灵活,可以方便地增加断点,另外是如果环境变量设置了 PYTHONBREAKPOINT=0,那么 breakpoint 函数的断点将被忽略。

1
breakpoint()

此外,还可以在执行脚本的命令中添加 -m pdb 来进入调试器模式,而不用修改源码,例如:

1
python3 -m pdb main.py

PDB 基本命令

命令类别命令及语法描述
帮助h(elp) [topic]打印所有可用的 PDB 命令。
当带参数时,打印对应命令/主题的帮助。
退出q(uit)退出调试器,被执行的程序将被终止。
打印表达式p <expr>打印表达式的值。
打印表达式pp <expr>美观地打印表达式的值。
显示表达式display [expr]如果表达式的值发生变化则显示它的值,每次都会停止执行当前帧。
如果不带表达式,则列出当前帧的所有显示表达式。
取消显示表达式undisplay [expr]不再显示当前帧中的表达式。 如果不带表达式,则清除当前帧的所有显示表达式。
打印入参a(rgs)打印当前函数的参数及其当前的值。
打印当前位置w(here)打印当前位置(包括堆栈跟踪)。
单步执行(Step Over)n(ext)继续执行,直到到达当前函数的下一行或返回。
单步进入(Step Into)s(tep)执行当前行,在第一个可能的位置停止(在被调用的函数中或在当前函数中)。
执行直到返回r(eturn)继续运行,直到当前函数返回。
执行直到断点c(ont(inue))继续执行,直到遇到断点时才会停止。
向下移动d(own) [count]在堆栈回溯中,将当前帧向下移动 count 级(默认为 1 级,移向更新的帧)。
向上移动u(p) [count]在堆栈回溯中,将当前帧向上移动 count 级(默认为 1 级,移向更老的帧)。
打印源码l(ist) [first[, last] \| .]列出当前文件的源代码。不带参数时,列出当前行周围的 11 行或继续上一个列表。
使用 . 作为参数时,列出当前行周围的 11 行。使用一个参数时,列出从该行开始的 11 行。
使用两个参数时,列出给定的范围;如果第二个参数小于第一个参数,则为计数。当前框架中的当前行用 -> 表示。如果正在调试异常,则最初引发或传播异常的行用 >> 表示(如果与当前行不同)。
打印源码ll/longlist列出当前函数或帧的全部源码。
断点b(reak) [ ([filename:]lineno \| function) [, condition] ]如果不带参数执行,将列出所有中断,包括每个断点、命中该断点的次数、当前的忽略次数以及关联的条件(如果有)。
传入 lineno 参数,在当前文件内的第 lineno 行设置中断。传入 function 参数,在该函数内的第一条可执行语句上设置中断。 function 可以是会在当前命名空间中被求值为一个函数的任意表达式。
如果 condition 参数存在,它应该是一个表达式,且它的计算值为 true 时断点才起作用。
临时断点tbreak [([filename:]lineno \| function) [, condition]]临时断点,在第一次命中时会自动删除。
清除断点cl(ear) [filename:lineno \| bpnumber ...]清除指定行的断点或所有断点。
禁用断点disable bpnumber [bpnumber ...]禁用断点,断点以空格分隔的断点编号列表给出。禁用断点表示它不会导致程序停止执行,但是与清除断点不同,禁用的断点将保留在断点列表中并且可以(重新)启用。
启用断点enable bpnumber [bpnumber ...]启用指定的断点。
忽略断点ignore bpnumber [count]为指定的断点编号设置忽略次数。如果省略 count,则忽略次数将设置为零。当忽略次数为零时断点将变为活动状态。如果为非零值,则在每次到达断点且断点未禁用且关联条件取真值时 count 就像递减。
执行语句! <stmt>在当前栈帧的上下文中执行语句。
感叹号可以被省略,除非第一个语句的第一个单词与某个调试器命名重名。

PDB 会记住上一个命令,只需按 Enter 即可重复上一个命令。

本文由作者按照 CC BY 4.0 进行授权