如何用pdb进行python调试

 我来答
在晴天的雨伞
2016-06-08 · TA获得超过6869个赞
知道大有可为答主
回答量:5761
采纳率:86%
帮助的人:1216万
展开全部
本文章讲述了如何用pdb进行python调试讲解.
  当手边

  没有IDE,面对着python调试犯愁时,你就可以参考下本文;(pdb 命令调试)
  和 (pdb)help

  用pdb进行python调试,用法基本和gdb差不多,
  先看一个简单的例子:
  epdb1.py .# epdb1.py -- experiment with the Python debugger, pdb
  a = "aaa"
  b = "bbb"
  c = "ccc"
  final = a + b + c
  print final
  比如要对这个程序进行调试:
  1:在文件前面加上这一句,引入调试的模块。
  import pdb
  2:在要开始调试的一行加上pdb.set_trace()文件变成:
  # epdb1.py -- experiment with the Python debugger, pdb
  import pdb
  a = "aaa"
  pdb.set_trace()
  b = "bbb"
  c = "ccc"
  final = a + b + c
  print final 可以运行这个程序,到断点出会停下来,和gdb类似,
  可以执行命令:
  直接回车是重复前一条命令!
  p(print) 查看一个变量值
  n(next) 下一步
  s(step) 单步,可进入函数
  c(continue)继续前进
  l(list)看源代码

  用pdb调试有多种方式可选:
  1.命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前
  python -m pdb myscript.py
  2. 在Python交互环境中启用调试
  >>> import pdb
  >>> import mymodule
  >>> pdb.run('mymodule.test()')
  3.比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的 if __name__ == "__main__" :
  a = 1
  importpdb
  pdb .set_trace()
  b = 2
  c = a + b
  print( c)
  然后正常运行脚本,到了pdb.set_trace()那就会定下来,就可以看到调试的提示符(Pdb)了
  常用的调试命令 h(elp),会打印当前版本Pdb可用的命令,如果要查询某个命令,可以输入 h [command],例如:"h l" - 查看list命令
  l(ist),可以列出当前将要运行的代码块
  (Pdb) l
  497 pdb.set_trace()
  498 base_data = {}
  499 new_data = {}
  500 try:
  501 execfile(base_file_name,{},base_data)
  502 -> execfile(new_file_name,{},new_data)
  503 except:
  504 logger.writeLog("error! load result log error!")
  505 print "load cmp logs error!"
  506 raise Exception, "load cmp logs error!"
  507>断点设置
  (Pdb)b10 #断点设置在本py的第10行
  或(Pdb)bots.py:20 #断点设置到 ots.py第20行
  删除断点(Pdb)b #查看断点编号
  (Pdb)cl 2 #删除第2个断点
  >运行
  (Pdb)n #单步运行
  (Pdb)s #细点运行 也就是会下到,方法
  (Pdb)c #跳到下个断点
  >查看
  (Pdb)p param #查看当前 变量值
  (Pdb)l #查看运行到某处代码
  (Pdb)a #查看全部栈内变量 b(reak), 设置断点,例如 "b 77″,就是在当前脚本的77行打上断点,还能输入函数名作为参数,断点就打到具体的函数入口,如果只敲b,会显示现有的全部断点
  (Pdb) b 504
  Breakpoint 4 at /home/jchen/regression/regressionLogCMP.py:504 condition bpnumber [condition],设置条件断点,下面语句就是对第4个断点加上条件"a==3"
  (Pdb) condition 4 a==3
  (Pdb) b
  Num Type Disp Enb Where
  4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504
  stop only if a==3 cl(ear),如果后面带有参数,就是清除指定的断点(我在Python2.4上从来没成功过!!!);如果不带参数就是清除所有的断点
  (Pdb) cl
  Clear all breaks? y disable/enable,禁用/激活断点
  (Pdb) disable 3
  (Pdb) b
  Num Type Disp Enb Where
  3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505 n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的
  s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中
  c(ont(inue)),让程序正常运行,直到遇到断点
  j(ump),让程序跳转到指定的行数
  (Pdb) j 497
  > /home/jchen/regression/regressionLogCMP.py(497)com pareLog()
  -> pdb.set_trace() a(rgs),打印当前函数的参数
  (Pdb) a
  _logger =
  _base = ./base/MRM-8137.log
  _new = ./new/MRM-8137.log
  _caseid = 5550001
  _toStepNum = 10
  _cmpMap = {'_bcmpbinarylog': 'True', '_bcmpLog': 'True', '_bcmpresp': 'True'} p,最有用的命令之一,打印某个变量
  (Pdb) p _new
  u'./new/MRM-8137.log' !,感叹号后面跟着语句,可以直接改变某个变量
  q(uit),退出调试

  ==============================================================================================
  在python中使用pdb模块可以进行调试
  import pdb
  pdb.set_trace()

  也可以使用python -m pdb mysqcript.py这样的方式

  (Pdb) 会自动停在第一行,等待调试,这时你可以看看 帮助
  (Pdb) h
  说明下这几个关键 命令

  >断点设置
  (Pdb)b 10 #断点设置在本py的第10行
  或(Pdb)b ots.py:20 #断点设置到 ots.py第20行
  删除断点(Pdb)b #查看断点编号
  (Pdb)cl 2 #删除第2个断点

  >运行
  (Pdb)n #单步运行
  (Pdb)s #细点运行 也就是会下到,方法
  (Pdb)c #跳到下个断点
  >查看
  (Pdb)p param #查看当前 变量值
  (Pdb)l #查看运行到某处代码
  (Pdb)a #查看全部栈内变量
  (Pdb)w 列出目前call stack 中的所在层。
  (Pdb)d 在call stack中往下移一层
  (Pdb)u 在call stack中往上移一层。如果在上移一层之后按下 n ,则会在上移之后的一层执行下一个叙述,之前的 function call 就自动返回。
  (Pdb)cl 清除指定的断点。如果没有带参数,则清除所有断点。
  (Pdb)disable 取消所有断点的功能,但仍然保留这些断点。
  (Pdb)enable 恢复断点的功能。
  (Pdb)ignore 设定断点的忽略次数。如果没指定 count,其初始 为 0。当 count 为 0 时,断点会正常动作。若有指定 count,则每次执行到该中断, count 就少 1,直到 count 数为 0。
  (Pdb)condition bpnumber [condition]
  (Pdb)j(ump) lineNo. 跳到某行执行。只有在 call stack 的最底部才能作用。
  (Pdb)l 列出目前所在档案中的位置。连续地 l 命令会一直列到档案结尾,可以使用指定行数或范围来打印。
  (Pdb)pp 和 p 命令类似,但是使用 pprint module(没用过 pprint,详情请参考 Python Library Reference)。
  (Pdb)alias 以一个"别名"代替"一群除错命令",有点类似 c/c 的 macro(详情请参考 Python Library Reference)。
  (Pdb)unalias 取消某个 alias。
  (Pdb)[!]statement 在目前的环境(context)中执行叙述。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式