pdb handbook
pdb 是 python 的调试器,在 gem5 中能够用来调试 python,因此简单的学习 pdb 的使用并记录在此。
pdb 的调试并不是和 gdb 一样能够输入 gdb 命令直接开始, pdb 调试的开始有两种方式:
- python 代码中插入 pdb 调试:直接在代码中插入
breakpoint()
,程序在运行到这个点的时候会进入到 pdb 。 - 直接在命令行中开启 pdb 调试:在命令行启动 python 的时候直接启动 pdb , 即
python -m pdb xxx.py
,开启之后直接进入调试模式,停止在第一行。
gem5 同时支持两种方式的 python 调试,对于第一种,直接在代码中插入断点即可,对于第二种,在开启 gem5 的时候插入参数--pdb
即可。
pdb 调试命令
EOF & exit & q & quit
这三者的用法相同,都表示终止 pdb 的会话,直接退出 pdb 调试。
a & args
打印出当前函数的参数列表。
alias & unalias
为命令取别名,别名的命令规则为alias [name [command [parameter parameter ...] ]]
,同时可以在.pdbrc
中提前定义别名,这样不需要每次进入的时候都进行别名的定义。unalias 取消别名。
b & break
打断点,断点语法b(reak) [ ([filename:]lineno | function) [, condition] ]
,可以设置条件断点。
bt & where
打印函数调用栈。
c & cont & continue
继续向下执行
cl & clear
注意不是清空屏幕上的输出!这个命令用来清除断点,在不传入参数的时候清除所有断点,同时也可以传入断点号和断点行号来清除断点。
commands
commands 命令接受断点作为参数,之后可以输入一堆 pdb 命令直到 end 为止,之后每次断点命中都会执行这些命令。
condition
这个命令为某个断点的触发设置条件表达式,表达式为真的时候才触发断点。
d & down & u & up
up 和 down 用来在函数栈帧中上下移动,down 即向被调用者移动,up 向调用者移动,移动并不代表栈帧被创建或者摧毁。用两个命令可以检查在不同栈帧中局部变量的情况。
debug
在 pdb 中,debug 命令用于启动一个子调试器。这个命令允许你在当前的上下文中执行一个新的调试会话,从而可以深入地调试嵌套的函数调用或复杂的表达式。
使用 debug 命令的好处是它允许你在不影响当前调试会话的情况下,单独调试一个特定的代码段。这在调试复杂的程序时非常有用,特别是当你需要深入理解某个函数的内部行为时。
例如,假设你在调试一个程序,并且在某个点上你想要更详细地调试一个函数调用,你可以使用 debug 命令来启动一个针对那个函数的新调试会话:
(Pdb) debug some_function(arg1, arg2)
这将启动一个新的调试会话,让你可以逐步执行 some_function 的代码,查看变量值,设置断点等,就像在主调试会话中一样。当你完成对 some_function 的调试后,你可以退出子调试器,返回到主调试会话中继续之前的调试。
disable
暂时禁止某个断点的触发,不同于 clear,这个断点并不会被直接清除,在后续还能被 enable。
display & undisplay
display 传入一个表达式,在表达式的值发生变化的时候回进行显示,并停止执行。undisplay 取消 display。
h & help
显示帮助信息。
ignore
传入断点和忽视次数,用于忽视断点某个次数。
interact
在当前的环境下开启一个临时的 python 解释器,用于一些假设性的探索。在这个临时的解释器中进行的一系列探索以及更改并不会影响到外部调试器的上下文。
jump
跳转到某一行代码执行,注意这个命令只能在当前的函数调用栈中使用,可以向前跳也能够往回跳,往回跳的时候之前执行的状态仍然存在。
l & list
语法为l(ist) [first [,last] | .]
,用来显示源代码,不传入参数或者传入一个点显示当前行附近的11行。传入 first 显示当前文件从 first 开始的 11 行,传入 first 和 last 进行范围显示。
ll & longlist
显示当前正在调用函数的全部代码。
n & next
向下执行指定数目的行数。
p & pp
打印表达式的值。
r & return
步出当前函数,当前函数执行完成。
restart & run
重启当前的函数,并可以传入参数。
retval & rv
打印之前一个函数的返回值。
s & step
执行当前行。
source
传入一个对象,pdb 会尝试找到并且打印出这个对象的数据结构的源代码及其类型。
tbreak
也是设置断点,设置断点的规则和正常设置断点一样,只是这个断点是暂时的,在命中一次之后消失。
unt & until
传入行号,程序执行到该行号或者大于这个行号的时候停住。
whatis
打印出传入参数的类型。