如何用pdb进行python调试

作者&投稿:安果 (若有异议请与网页底部的电邮联系)
如何用pdb进行python调试~

  本文章讲述了如何用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)中执行叙述。

  转载

 本文章讲述了如何用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)中执行叙述。

本文章讲述了如何用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中安装pdbparser
答:举个栗子,要安装scikit-learn这个模块包,需要前置安装的还有scipy等几个暂时没有安装的模块,shift+右键,在此处打开命令窗口,在dos命令行中输入conda install sklearn,它会自动把需要安装的模块包安装后者更新了,然后安装你需要的scikit-learn模块,而且不用担心32位和64位的问题 ...

使用Spyder遇到问题,程序运行不下去,有谁知道是为什么吗?pdb是什么?
答:pdb: python debugger 就是python的调试器。查看和控制程序运行。运行不下去是因为代码中有pdb设置的断点 import pdbpdb.set_trace() # 设置断点注释掉上述内容就OK pdb的使用请baidu下吧

可以让你快速用Python进行数据分析的10个小技巧
答:Profiling(分析器)是一个帮助我们理解数据的过程,而Pandas Profiling是一个Python包,它可以简单快速地对Pandas 的数据框数据进行 探索 性数据分析。 Pandas中df.describe()和df.info()函数可以实现EDA过程第一步。但是,它们只提供了对数据非常基本的概述,对于大型数据集没有太大帮助。 而Pandas中的Profiling功能简单通...

PDB文件格式和Python中字符串表示如何对应?
答:整数字符串转换为对应的整数 int('12')小数字符串转换为对应小数 float('12.34')数字转换为字符串 str(123.45)ASCII码转换为相应字符 chr(97)字符转换为响应ASCII码 ord('a')

自己写的 Python 程序出错了,该如何修正?
答:4. 使用调试工具:Python有许多强大的调试工具,如pdb。你可以在代码中插入断点,然后运行你的程序。当程序执行到断点时,它会暂停,这样你就可以查看变量的值,单步执行代码,等等。5. 查阅文档:如果你不确定某个函数或方法的用法,或者你不知道如何修复你的错误,你可以查阅Python的官方文档,或者查找...

如何用在sublime pdb模式下查看类私有变量的值
答:def test(a):while True:if a > 10:break a += 1 return a if __name__ == '__main__':test(1)python -m pdb test.py进入调试环境 b test 在test函数处设置断点,断点号为1 (Pdb) b test Breakpoint 1 at f:\python\pdb\test.py:1 b 2 在第二行设置断点,断点号为2 (Pdb...

在python中怎么实现goto功能
答:1、首先点击输入下方的代码:from goto import *@patch def f2():goto(10)2、然后输入下方的代码:print 'should not see this'label(10)for i in range(1,99999):print i 3、然后在输入下方的代码就完成了:if i == 5:goto('out')label('out')f2()...

python中的pdb
答:没必要,假设a 是正确的才会导入, 如果a 不正确,那就在a 中调试该函数.

切片检查是什么意思
答:因此,在使用切片时,我们通常需要进行检查以确保其正确性。检查切片的方法也有许多种,常用的包括使用print()函数将提取的数据打印出来进行查看,或者使用assert语句来断言该数据是否符合预期。此外,还可以通过使用Python的调试工具(如pdb、ipdb等)来进行逐行调试,检查每一行代码的执行结果是否正确。总之,...

python_ pdb是什么意思?
答:意思如下:“PYD”经常作为“Python data file”的缩写来使用,中文中表示:“python数据文件”。英文缩写词:PYD 英文单词:Python data file 缩写词中文简要解释:python数据文件 中文拼音: shù jù wén jiàn 缩写词流行度:11029 缩写词分类:Computing 简介:Python由荷兰数学和计算机科学研究学会的...