Python中断点调试pdb包的用法详解
作者:kevin小新
pdb(python debugger) 是 python 中的一个命令行调试包,为 python 程序提供了一种交互的源代码调试功能,其官方使用文档链接为 pdb — Python 的调试器。
pdb 的主要功能包括设置断点、单步调试、进入函数调试、查看当前代码、查看变量、栈片段的值等,从而可以减少或者避免使用 print 和 log 等杂乱繁琐的方式进行 python 代码的调试。
安装及使用方法
pdb 包的安装方法很简单,直接在环境中通过下面的 pip 即可安装:
pip install pdb
pdb 包的使用方法也很简单,直接在代码中想要进入调试器的地方插入下面两行命令,然后保存并再次执行当前 python 文件就可以自动跳转到该断点位置,然后便可以自行打印出相关内容进行调试。
import pdb pdb.set_trace() # 也可以将上面两行写在一行,通过;号分隔 import pdb; pdb.set_trace()
pdb 常用命令
当在代码中添加了上述的两行命令运行程序后,程序会自动跳转至代码所在断点位置,下面便可以在终端中查看相应的变量进行调试。进入 pdb 调试断点模式后,可以使用命令来控制调试和检查程序的状态,pdb 中一些常用命令如下:
命令 | 解释 |
---|---|
next 或 n | 继续运行,直到运行到当前函数的下一行 |
step 或 s | 运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下 |
continue 或 c | 继续执行程序,直到遇到下一个断点 |
list 或 l | 列出当前文件的源代码 |
p XXX | 打印变量或者表达式的值(XXX为变量或表达式的名称) |
print(XXX) 也可以使用,但它不是一个调试器命令 | 它执行 Python 中的 print() 函数打印变量XXX的值 |
return 或 r | 继续执行代码,直到当前函数返回 |
quit 或 q | 退出调试器,被执行的程序将被中止 |
break 或 b | 设置断点 |
help | 帮助 |
调试代码示例
下面是一个简单的对 list 的列表 items_list 中所有元素求和并返回的代码示例,为了通过示例进行演示,博主将 list 中元素求和写在 sum_list(items) 函数中,并将两元素相加(+)又写成了一个函数 sum_ab(a, b) ,下面的代码是原始的代码:
# 对items的所有元素求和并返回 def sum_list(items): items_sum = 0 for i in range(len(items_list)): item = items_list[i] items_sum = sum_ab(items_sum, item) return items_sum # 对a和b两个元素进行求和 def sum_ab(a, b): sum = a + b return sum if __name__ == "__main__": items_list = [1, 2, 3, 4, 5] items_sum = sum_list(items_list) print("items_sum求和所得的结果为:", items_sum)
在上述代码中 sum_list(items)
函数中添加调试 import pdb; pdb.set_trace()
命令用于设置断点。
# 对items的所有元素求和并返回 def sum_list(items): items_sum = 0 for i in range(len(items_list)): import pdb; pdb.set_trace() item = items_list[i] items_sum = sum_ab(items_sum, item) return items_sum # 对a和b两个元素进行求和 def sum_ab(a, b): sum = a + b return sum if __name__ == "__main__": items_list = [1, 2, 3, 4, 5] items_sum = sum_list(items_list) print("items_sum求和所得的结果为:", items_sum)
开始调试:运行上面的添加 pdb 命令的程序后,程序会停留在 pdb.set_trace() 处,并且命令行的左端由 (base) 会变成 (pdb) 提示当前进入了 pdb 调试模式。
由于 items_list 共包含 5 个元素,所以 sum_list(items) 函数中 for 循环共执行 5 次就会得到结果并返回到主函数。
下面的过程就是将一些常用的 pdb 命令执行的结果,博主将每行代码的作用通过 # 功能 的形式写在每行代码的右侧,方便大家理解。
(base) PS F:\Code\ceshi> python ./ceshi.py # 运行当前添加了import pdb; pdb.set_trace()的程序 > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] # 执行程序知道遇到断点时停止(此时是第1次for循环中) (Pdb) l # l命令 列出当前文件的源代码 1 # 对items的所有元素求和并返回 # ->表示下一行将要执行的命令即item=items_list[i],上一行已执行完 2 def sum_list(items): 3 items_sum = 0 4 for i in range(len(items_list)): 5 import pdb; pdb.set_trace() 6 -> item = items_list[i] 7 items_sum = sum_ab(items_sum, item) 8 return items_sum 9 10 # 对a和b两个元素进行求和 11 def sum_ab(a, b): (Pdb) n # n命令 继续运行,直到运行到当前函数的下一行(当前行item=items_list[i]已执行完,并且->移动到下一行) > f:\code\ceshi\ceshi.py(7)sum_list() -> items_sum = sum_ab(items_sum, item) (Pdb) p item # p命令 打印变量item的值(第一次for循环,item为=items_list[0]=1) 1 (Pdb) s # s命令 运行当前行,在被调用的sum_ab(a,b)函数内部停下 --Call-- > f:\code\ceshi\ceshi.py(11)sum_ab() -> def sum_ab(a, b): (Pdb) r # r命令 继续执行代码,直到当前函数sum_ab(a,b)返回 --Return-- > f:\code\ceshi\ceshi.py(13)sum_ab()->1 -> return sum (Pdb) p sum # p命令 打印变量sum的值(sum是sum_ab(a,b)返回的值,items_list[0]第一个元素求和的结果) 1 (Pdb) c # c命令 继续运行,仅在遇到断点时停止(跳转到第2次for循环中) > f:\code\ceshi\ceshi.py(5)sum_list() -> import pdb; pdb.set_trace() (Pdb) c # c命令 继续运行,仅在遇到断点时停止(跳转到第3次for循环中) > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] (Pdb) c # c命令 继续运行,仅在遇到断点时停止(跳转到第4次for循环中) > f:\code\ceshi\ceshi.py(5)sum_list() -> import pdb; pdb.set_trace() (Pdb) c # c命令 继续运行,仅在遇到断点时停止(跳转到第5次for循环中) > f:\code\ceshi\ceshi.py(6)sum_list() -> item = items_list[i] (Pdb) l # l命令 列出当前文件的源代码 1 # 对items的所有元素求和并返回 2 def sum_list(items): 3 items_sum = 0 4 for i in range(len(items_list)): 5 import pdb; pdb.set_trace() 6 -> item = items_list[i] 7 items_sum = sum_ab(items_sum, item) 8 return items_sum 9 10 # 对a和b两个元素进行求和 11 def sum_ab(a, b): (Pdb) n # n命令 继续运行,直到运行到当前函数的下一行(->移动到下一行) > f:\code\ceshi\ceshi.py(7)sum_list() -> items_sum = sum_ab(items_sum, item) (Pdb) p item # p命令 打印变量item的值(第5次for循环) 5 (Pdb) n # n命令 继续运行,直到运行到当前函数的下一行(->移动到下一行) > f:\code\ceshi\ceshi.py(4)sum_list() -> for i in range(len(items_list)): (Pdb) p items_sum # p命令 打印变量items_sum的值(第5次for循环后:所有元素相加得到的总值) 15 (Pdb) q # q Traceback (most recent call last): File "F:\Code\ceshi\ceshi.py", line 17, in <module> items_sum = sum_list(items_list) File "F:\Code\ceshi\ceshi.py", line 4, in sum_list for i in range(len(items_list)): File "F:\Code\ceshi\ceshi.py", line 4, in sum_list for i in range(len(items_list)): File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 88, in trace_dispatch return self.dispatch_line(frame) File "D:\Tools\Anaconda3\SetUp\lib\bdb.py", line 113, in dispatch_line if self.quitting: raise BdbQuit bdb.BdbQuit (base) PS F:\Code\ceshi>
以上就是Python中断点调试pdb包的用法详解的详细内容,更多关于Python断点调试pdb的资料请关注脚本之家其它相关文章!