pdb个人记录
import pdb; pdb.set_trace() 或者breakpoint()中断进入调试器,然后可以单步执行这条语句之后的代码
模块调试
python -m pdb myscript.py
当作为模块发起调用时,如果被调试的程序异常退出则 pdb 将自动进入事后调试。 在事后调试之后(或程序正常退出之后),pdb 将重启程序。 自动重启会保留 pdb 的状态(如断点)并且在大多数情况下这比在退出程序的同时退出调试器更实用。
pdb函数
pdb.set_trace(*, header=None)
在调用本函数的堆栈帧处进入调试器。用于硬编码一个断点到程序中的固定点处,即使该代码不在调试状态(如断言失败时)。如果传入 header,它将在调试开始前被打印到控制台。
pdb.run(statement, globals=None, locals=None)
在调试器控制范围内执行 statement (以字符串或代码对象的形式提供)。调试器提示符会在执行代码前出现,你可以设置断点并键入 continue,也可以使用 step 或 next 逐步执行语句(上述所有命令在后文有说明)。可选参数 globals 和 locals 指定代码执行环境,默认时使用 __main__ 模块的字典。(请参阅内置函数 exec() 或 eval() 的说明。)
>>>import pdb
>>>def f(x):
... print(1 / x)
>>>pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) continue
0.5
>>>
pdb.runeval(expression, globals=None, locals=None)¶
在调试器控制下对 expression (以字符串或代码对象的形式给出) 求值。 当 runeval() 返回时,它将返回 expression 的值。 在其他方面此函数与 run() 类似。
pdb.runcall(function, *args, **kwds)
使用给定的参数调用 function (以函数或方法对象的形式提供,不能是字符串)。runcall() 返回的是所调用函数的返回值。调试器提示符将在进入函数后立即出现。
pdb命令
- 命令的参数必须用空格(空格符或制表符)分隔。在命令语法中,可选参数括在方括号 (
[]
) 中,使用时请勿输入方括号。命令语法中的选择项由竖线 (|
) 分隔。 - 输入一个空白行将重复最后输入的命令。
- 调试器无法识别的命令将被认为是 Python 语句,并在正在调试的程序的上下文中执行。Python 语句也可以用感叹号 (
!
) 作为前缀,这是检查正在调试的程序的强大方法,甚至可以修改变量或调用函数。当此类语句发生异常,将打印异常名称,但调试器的状态不会改变。 -
要设置临时全局变量,请使用 快捷变量。 快捷变量 是名称以
$
打头的变量。 例如,$foo=1
将设置一个全局变量$foo
供你在调试器会话中使用。快捷变量会在程序恢复执行时被清空因此它不大可能像使用普通变量如foo=1
那样影响到你的程序。存在三个预设的 快捷变量:$_frame
: 你正在调试的当前帧;$_retval
: 当帧返回时的返回值;$_exception
: 当帧引发异常时的异常值
h(elp) [command]
不带参数时,显示可用的命令列表。参数为 command 时,打印有关该命令的帮助。
w(here)
打印栈回溯,最新的帧位于底部。 有一个箭头 (>
) 指明当前帧,该帧决定了大多数命令的上下文。
p expression
在当前上下文中对 expression 求值并打印该值。
whatis expression
打印 expression 的类型。
d(own) [count]
在堆栈回溯中,将当前帧向下移动 count 级(默认为 1 级,移向更新的帧)。
u(p) [count]
在堆栈回溯中,将当前帧向上移动 count 级(默认为 1 级,移向更老的帧)。
s(tep)
运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下。
n(ext)
继续运行,直到运行到当前函数的下一行,或当前函数返回为止。( next 和 step 之间的区别在于,step 进入被调用函数内部并停止,而 next (几乎)全速运行被调用函数,仅在当前函数的下一行停止。)
c(ont(inue))
继续运行,仅在遇到断点时停止。
l(ist) [first[, last]]
列出当前文件的源代码。如果不带参数,则列出当前行周围的 11 行,或延续前一次列出。如果用 .
作为参数,则列出当前行周围的 11 行。如果带有一个参数,则列出那一行周围的 11 行。如果带有两个参数,则列出所给的范围中的代码;如果第二个参数小于第一个参数,则将其解释为列出行数的计数。
ll | longlist
列出当前函数或帧的所有源代码。相关行的标记与 list 相同。
a(rgs)
打印当前函数的参数及其当前的值。
source expression
尝试获取 expression 的源代码并显示它。
display [expression]
如果 expression 的值发生变化则显示它的值,每次都会停止执行当前帧。
如果不带 expression,则列出当前帧的所有显示表达式。
r(eturn)
继续运行,直到当前函数返回。
j(ump) lineno
设置即将运行的下一行行号。仅可用于堆栈最底部的帧。它可以往回跳来再次运行代码,也可以往前跳来跳过不想运行的代码。
需要注意的是,不是所有的跳转都是允许的 -- 例如,不能跳转到 for 循环的中间或跳出 finally 子句。
unt(il) [lineno]¶
如果不带参数,则继续运行,直到行号比当前行大时停止。
如果带有 lineno,则继续执行直至行号大于或等于 lineno。 在这两种情况下,在当前帧返回时也将停止。
q(uit)
退出调试器。 被执行的程序将被中止。
参考:
pdb --- Python 的调试器 — Python 3.12.7 文档