目录

  • 目录
  • pdb
    • pdb 的 Debug 方式
    • pdb 的调试指令
  • 示例
  • IPython 自带的 Debug 工具 ipdb

pdb

pdb 是 Python 自带的程序包,为 Python 程序提供了一种可交互的源码调试功能。主要特性包括:

  • 设置断点
  • 单步调试
  • 进入函数调试
  • 查看当前代码
  • 查看栈片段
  • 动态修改变量值

pdb 的 Debug 方式

  • pdb 可以在源码内直接使用,相当于打断点,import pdb 后,在需要调试的代码处添加写入 pdb.set_trace() 语句即可。
def pushit():import pdbpdb.set_trace()stack.append(raw_input('Enter New String: ').strip())
  • 通过命令行参数的形式来进行调试,EG.
python -m pdb stack_demo.py
  • 在 Python 交互环境中调试
>>> import pdb
>>> import mymodule
>>> pdb.run(‘mymodule.test()’)

pdb 的调试指令

指令 解析
break [codeline] 或 b [codeline] 在 codeline 行处,设置断点
condition codeline [condition] 设置条件断点
disable [codeline] 使某一行断点失效
enable [codeline] 使某一行的断点生效
clear [codeline] 或 cl [codeline] 就是清除指定的断点,不带参数就是清除所有的断点
continue 或 c 继续执行程序
list 或 l 查看当前行上下文的代码段
next 或 n 执行下一行,但跳过函数
step 或 s 执行下一行,并进入被调用的函数
j [codeline] 跳转到前面的 codeline 行
w 打印当前执行点的位置
return 或 r 执行代码直到从当前函数返回
p 打印一个变量或参数的值
a 打印当前函数及参数的值
! 感叹号后面跟着语句,可以直接改变某个变量值
exit 或 q 中止并退出
help [command] 或 h [command] commands 的帮助手册

示例

stack_demo.py : 一个 Python 实现的 数据结构

stack = []def pushit():#import pdb#pdb.set_trace()stack.append(raw_input('Enter New String: ').strip())def popit():if len(stack) == 0:print "Cannot pop from an empty stack!"else:print 'Remove [', `stack.pop()`, ']'def viewstack():print stackCMDs = {'u':pushit, 'o':popit, 'v':viewstack}def showmenu():pr = """p(U)shp(O)p(V)iew(Q)uitEnter choice: """while True:while True:try:choice = raw_input(pr).strip()[0].lower()except (EOFError, KeyboardInterrupt, IndexError):choice = 'q'print '\nYou picked: [%s]' % choiceif choice not in 'uovq':print 'Invalid option, try again'else:breakif choice == 'q':breakCMDs[choice]()if __name__ == '__main__':showmenu()

通过命令行参数的形式来进行调试

In [2]: !python -m pdb stack_demo.py
> d:\development\python27\workspace\stack_demo.py(1)<module>()
-> stack = []            # 这种方式会从第一条语句开始进入调试
(Pdb) b 7                # 空白行或注释不能打断点
*** Blank or comment
(Pdb) b 8                # 在 codeline == 8 处打上断点
Breakpoint 1 at d:\development\python27\workspace\stack_demo.py:8
(Pdb) n                  # 下一行
> d:\development\python27\workspace\stack_demo.py(3)<module>()
-> def pushit():
(Pdb) n                  # 下一行,并且跳过函数内的语句
> d:\development\python27\workspace\stack_demo.py(10)<module>()
-> def popit():
(Pdb) l                  # 列出下面的代码3     def pushit():45         #import pdb6         #pdb.set_trace()78 B->     stack.append(raw_input('Enter New String: ').strip())910     def popit():11         if len(stack) == 0:12             print "Cannot pop from an empty stack!"13         else:
(Pdb) n
Enter New String: 'jmilkfan'
--Return--
> d:\development\python27\workspace\stack_demo.py(8)pushit()->None
-> stack.append(raw_input('Enter New String: ').strip())
(Pdb) w                  # 打印当前位置d:\development\python27\lib\bdb.py(400)run()
-> exec cmd in globals, locals<string>(1)<module>()d:\development\python27\workspace\stack_demo.py(49)<module>()
-> showmenu()d:\development\python27\workspace\stack_demo.py(46)showmenu()
-> CMDs[choice]()
> d:\development\python27\workspace\stack_demo.py(8)pushit()->None
-> stack.append(raw_input('Enter New String: ').strip())
(Pdb) p stack                  # 输出一个变量的值
["'jmilkfan'"]
(Pdb) !stack = ["fanguiju"]    # 改变一个变量的值
(Pdb) p stack
['fanguiju']
(Pdb) c                        # 继续往下执行p(U)shp(O)p(V)iew(Q)uitEnter choice: qYou picked: [q]
The program finished and will be restarted
> d:\development\python27\workspace\stack_demo.py(1)<module>()
-> stack = []
(Pdb) q                       # 退出调试
  • 在源码内直接使用

In [8]: run stack_demo.pyp(U)shp(O)p(V)iew(Q)uitEnter choice: uYou picked: [u]
> d:\development\python27\workspace\stack_demo.py(8)pushit()
-> stack.append(raw_input('Enter New String: ').strip())    # 开始进入调试,该语句的前一条语句为 pdb.set_trace()
(Pdb) l3     def pushit():45         import pdb6         pdb.set_trace()78  ->     stack.append(raw_input('Enter New String: ').strip())910     def popit():11         if len(stack) == 0:12             print "Cannot pop from an empty stack!"13         else:
(Pdb) j 16            # 不能跳转到还没有执行过的代码行
*** Jump failed: line 16 comes after the current code block
(Pdb) j 3
> d:\development\python27\workspace\stack_demo.py(3)pushit()
-> def pushit():
(Pdb) s              # 进入一个函数内部
> d:\development\python27\workspace\stack_demo.py(6)pushit()
-> pdb.set_trace()
(Pdb) s              # 还可以进入到调用函数的内部
--Call--
> d:\development\python27\lib\pdb.py(1250)set_trace()
-> def set_trace():
(Pdb) c              # 继续执行代码
> d:\development\python27\workspace\stack_demo.py(8)pushit()
-> stack.append(raw_input('Enter New String: ').strip())
(Pdb) r              # 执行代码直到从当前函数返回
Enter New String: 'jmilkfan'
--Return--
> d:\development\python27\workspace\stack_demo.py(8)pushit()->None
-> stack.append(raw_input('Enter New String: ').strip())
(Pdb) l25             (V)iew26             (Q)uit2728             Enter choice: """2930  ->     while True:31             while True:32                 try:33                     choice = raw_input(pr).strip()[0].lower()34                 except (EOFError, KeyboardInterrupt, IndexError):35                     choice = 'q'
(Pdb) cp(U)shp(O)p(V)iew(Q)uitEnter choice: uYou picked: [u]
> d:\development\python27\workspace\stack_demo.py(8)pushit()
-> stack.append(raw_input('Enter New String: ').strip())
(Pdb) s
--Call--
> d:\development\python27\lib\site-packages\win_unicode_console\raw_input.py(71)raw_input()
-> def raw_input(prompt=""):
(Pdb) p pr
'\n\tp(U)sh\n\tp(O)p\n\t(V)iew\n\t(Q)uit\n\t\n\tEnter choice: '
(Pdb) np(U)shp(O)p(V)iew(Q)uitEnter choice: v
> d:\development\python27\workspace\stack_demo.py(37)showmenu()
-> print '\nYou picked: [%s]' % choice
(Pdb) nYou picked: [v]
> d:\development\python27\workspace\stack_demo.py(38)showmenu()
-> if choice not in 'uovq':
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(41)showmenu()
-> break
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(44)showmenu()
-> if choice == 'q':
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(46)showmenu()
-> CMDs[choice]()
(Pdb) n
[u"'jmilkfan'", u"'fanguiju'", u"'fanguiju'"]
> d:\development\python27\workspace\stack_demo.py(30)showmenu()
-> while True:
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(31)showmenu()
-> while True:
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(32)showmenu()
-> try:
(Pdb) n
> d:\development\python27\workspace\stack_demo.py(33)showmenu()
-> choice = raw_input(pr).strip()[0].lower()
(Pdb) np(U)shp(O)p(V)iew(Q)uitEnter choice: v
> d:\development\python27\workspace\stack_demo.py(37)showmenu()
-> print '\nYou picked: [%s]' % choice
(Pdb) cYou picked: [v]
[u"'jmilkfan'", u"'fanguiju'", u"'fanguiju'"]p(U)shp(O)p(V)iew(Q)uitEnter choice: 0

IPython 自带的 Debug 工具 ipdb

基本用法跟 pdb 一样,优点在于很 IPython 结合使用能更方便的完成一个功能,也更加清晰。

In [1]: run -d stack_demo.py
Breakpoint 1 at d:\development\python27\workspace\stack_demo.py:1
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.
> d:\development\python27\workspace\stack_demo.py(1)<module>()
1---> 1 stack = []23 def pushit():45     stack.append(raw_input('Enter New String: ').strip())ipdb> hDocumented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pdef    psource  run      unt
a      c          continue  exit    l     pdoc    q        s        until
alias  cl         d         h       list  pfile   quit     step     up
args   clear      debug     help    n     pinfo   r        tbreak   w
b      commands   disable   ignore  next  pinfo2  restart  u        whatis
break  condition  down      j       p     pp      return   unalias  whereMiscellaneous help topics:
==========================
exec  pdbUndocumented commands:
======================
ll  longlist  retval  rvipdb>

Python Module_pdb_DEBUG 方法相关推荐

  1. Python ljust()方法

    描述 Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串.如果指定的长度小于原字符串的长度则返回原字符串. 语法 ljust()方法语法: str.ljust ...

  2. Python join()方法

    描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence).join(sequence) 参数 s ...

  3. Python maketrans() 方法

    描述 Python maketrans() 方法用于给 translate() 方法创建字符映射转换表. 可以只接受一个参数,此时这个参数是个字典类型(暂不研究这种情况). 对于接受两个参数的最简单的 ...

  4. python count()方法

    Python count() 方法 | 菜鸟教程 可以统计一个字符串里含有子字符串的个数  频次

  5. Python rstrip()方法 删除 string 字符串末尾的指定字符(默认为空格).

    Python rstrip()方法  Python 字符串 描述 Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格). 语法 rstrip()方法语法: str.r ...

  6. vscode使用教程python-如何在VSCode上轻松舒适的配置Python的方法步骤

    前言 之前被学长推荐使用了VSCode,后惊叹了VSCode的强大,尤其是他的配置,比之前使用sublime方便多了,刚好实验室也来了一批新的学弟学妹,来仔细的逐步的讲解一些,在自己的电脑上轻松的配置 ...

  7. 自学python方法-总算懂得快速学习python的方法

    随着Python的进一步发展,越来越多的现成的Python的机器学习的算法已经发布出来.为了可以更好地运用这些机器学习的算法,我们有必要对Python有个初步的了解.以下是小编为你整理的快速学习pyt ...

  8. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  9. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. 在编程中,几 ...

最新文章

  1. hackerrank杂记
  2. Fabric--configtxlator转换配置添加组织到channel
  3. ScaleAnimation动画
  4. vue请求本地json数据
  5. map怎么转化dto_使用MapStruct进行Dto到实体的转换时出错
  6. 修改mac地址_交换机工作基础——MAC地址表的构成与安全
  7. LINQ to SQL创建三层/多层Web应用系统 (Part 1)
  8. pandownload事件_pandownload被执法背后是中国盗版的末路
  9. hello world_AngularJS Hello World示例
  10. unity之EasyAR使用
  11. 新浪微博三方登陆(获取用户信息接口及描述)
  12. VMware虚拟机如何迁移到阿里云
  13. 使用swing换一个国际象棋棋盘的实例
  14. 手机/平板上如何进行网页过滤
  15. accumulate 的用法
  16. 获取文本文件编码与导出源代码
  17. 小白如何轻松建站?(详细教程)
  18. ubuntu data backup and recovery
  19. matlab毕达哥拉斯质数,这位天才发现了素数、完美数和亲和数,证明三角形内角和是180°...
  20. halcon dots_image 点状物提取 (by shany shang)

热门文章

  1. quartz mysql 初始化_quartz2.3.0(十五)执行、暂停、继续执行、清除,花式操作数据库中持久化的job任务...
  2. python控制苹果手机触摸屏失灵怎么办_iphone触摸屏失灵怎么办 iphone触摸屏失灵解决办法【详解】...
  3. [python数据分析] 简述幂率定律及绘制Power-law函数
  4. 科学家发现量子大脑传感器可以跟踪脑电波,这可能对发现脑疾病至关重要
  5. 乔布斯的创业搭档:他缺乏工程师才能,不得不锻炼营销能力来弥补
  6. 14岁上大学,29岁拿下教职,如今这位华裔学者拿下Jeffrey Elman大奖
  7. 3D打印火箭发动机真被做出来了!首次地面全周期点火实测,发射报价不到猎鹰9的五分之一...
  8. Chrome现在也能编辑pdf文件了!64位安卓版上线,网页加载快10%,还有良心标签管理功能...
  9. 一文看尽飞桨PaddlePaddle最新升级:5大优势,更低门槛使用深度学习
  10. 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...