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 进行授权