找回密码
 会员注册
查看: 19|回复: 0

python中断点调试pdb包的介绍及使用

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71365
发表于 2024-9-6 10:36:01 | 显示全部楼层 |阅读模式
pdb的简介pdb(pythondebugger)是python中的一个命令行调试包,为python程序提供了一种交互的源代码调试功能,其官方使用文档链接为pdb—Python的调试器。pdb的主要功能包括设置断点、单步调试、进入函数调试、查看当前代码、查看变量、栈片段的值等,从而可以减少或者避免使用print和log等杂乱繁琐的方式进行python代码的调试。安装及使用方法pdb包的安装方法很简单,直接在环境中通过下面的pip即可安装:pipinstallpdb1pdb包的使用方法也很简单,直接在代码中想要进入调试器的地方插入下面两行命令,然后保存并再次执行当前python文件就可以自动跳转到该断点位置,然后便可以自行打印出相关内容进行调试。importpdbpdb.set_trace()#也可以将上面两行写在一行,通过;号分隔importpdb;pdb.set_trace()1234pdb常用命令当在代码中添加了上述的两行命令运行程序后,程序会自动跳转至代码所在断点位置,下面便可以在终端中查看相应的变量进行调试。进入pdb调试断点模式后,可以使用命令来控制调试和检查程序的状态,pdb中一些常用命令如下:命令解释next或n继续运行,直到运行到当前函数的下一行step或s运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下continue或c继续执行程序,直到遇到下一个断点list或l列出当前文件的源代码pXXX打印变量或者表达式的值(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的所有元素求和并返回defsum_list(items):items_sum=0foriinrange(len(items_list)):item=items_list[i]items_sum=sum_ab(items_sum,item)returnitems_sum#对a和b两个元素进行求和defsum_ab(a,b):sum=a+breturnsumif__name__=="__main__":items_list=[1,2,3,4,5]items_sum=sum_list(items_list)print("items_sum求和所得的结果为:",items_sum)1234567891011121314151617在上述代码中sum_list(items)函数中添加调试importpdb;pdb.set_trace()命令用于设置断点。#对items的所有元素求和并返回defsum_list(items):items_sum=0foriinrange(len(items_list)):importpdb;pdb.set_trace()item=items_list[i]items_sum=sum_ab(items_sum,item)returnitems_sum#对a和b两个元素进行求和defsum_ab(a,b):sum=a+breturnsumif__name__=="__main__":items_list=[1,2,3,4,5]items_sum=sum_list(items_list)print("items_sum求和所得的结果为:",items_sum)123456789101112131415161718开始调试:运行上面的添加pdb命令的程序后,程序会停留在pdb.set_trace()处,并且命令行的左端由(base)会变成(pdb)提示当前进入了pdb调试模式。由于items_list共包含5个元素,所以sum_list(items)函数中for循环共执行5次就会得到结果并返回到主函数。下面的过程就是将一些常用的pdb命令执行的结果,博主将每行代码的作用通过#功能的形式写在每行代码的右侧,方便大家理解。(base)PSF:\Code\ceshi>python./ceshi.py#运行当前添加了importpdb;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],上一行已执行完2defsum_list(items):3items_sum=04foriinrange(len(items_list)):5importpdb;pdb.set_trace()6->item=items_list[i]7items_sum=sum_ab(items_sum,item)8returnitems_sum910#对a和b两个元素进行求和11defsum_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)pitem#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()->defsum_ab(a,b)Pdb)r#r命令继续执行代码,直到当前函数sum_ab(a,b)返回--Return-->f:\code\ceshi\ceshi.py(13)sum_ab()->1->returnsum(Pdb)psum#p命令打印变量sum的值(sum是sum_ab(a,b)返回的值,items_list[0]第一个元素求和的结果)1(Pdb)c#c命令继续运行,仅在遇到断点时停止(跳转到第2次for循环中)>f:\code\ceshi\ceshi.py(5)sum_list()->importpdb;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()->importpdb;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的所有元素求和并返回2defsum_list(items):3items_sum=04foriinrange(len(items_list)):5importpdb;pdb.set_trace()6->item=items_list[i]7items_sum=sum_ab(items_sum,item)8returnitems_sum910#对a和b两个元素进行求和11defsum_ab(a,b)Pdb)n#n命令继续运行,直到运行到当前函数的下一行(->移动到下一行)>f:\code\ceshi\ceshi.py(7)sum_list()->items_sum=sum_ab(items_sum,item)(Pdb)pitem#p命令打印变量item的值(第5次for循环)5(Pdb)n#n命令继续运行,直到运行到当前函数的下一行(->移动到下一行)>f:\code\ceshi\ceshi.py(4)sum_list()->foriinrange(len(items_list))Pdb)pitems_sum#p命令打印变量items_sum的值(第5次for循环后:所有元素相加得到的总值)15(Pdb)q#qTraceback(mostrecentcalllast):File"F:\Code\ceshi\ceshi.py",line17,initems_sum=sum_list(items_list)File"F:\Code\ceshi\ceshi.py",line4,insum_listforiinrange(len(items_list)):File"F:\Code\ceshi\ceshi.py",line4,insum_listforiinrange(len(items_list)):File"D:\Tools\Anaconda3\SetUp\lib\bdb.py",line88,intrace_dispatchreturnself.dispatch_line(frame)File"D:\Tools\Anaconda3\SetUp\lib\bdb.py",line113,indispatch_lineifself.quitting:raiseBdbQuitbdb.BdbQuit(base)PSF:\Code\ceshi>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 20:19 , Processed in 0.414546 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表