目录

pdb

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

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

pdb 的 Debug 方式

  • pdb 可以在源码内直接使用,相当于打断点,import pdb 后,在需要调试的代码处添加写入 pdb.set_trace() 语句即可。
def pushit():

    import pdb
pdb.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 stack CMDs = {'u':pushit, 'o':popit, 'v':viewstack} def showmenu():
pr = """
p(U)sh
p(O)p
(V)iew
(Q)uit Enter choice: """ while True:
while True:
try:
choice = raw_input(pr).strip()[0].lower()
except (EOFError, KeyboardInterrupt, IndexError):
choice = 'q' print '\nYou picked: [%s]' % choice
if choice not in 'uovq':
print 'Invalid option, try again'
else:
break if choice == 'q':
break
CMDs[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():
4
5 #import pdb
6 #pdb.set_trace()
7
8 B-> stack.append(raw_input('Enter New String: ').strip())
9
10 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)sh
p(O)p
(V)iew
(Q)uit Enter choice: q You 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.py p(U)sh
p(O)p
(V)iew
(Q)uit Enter choice: u You picked: [u]
> d:\development\python27\workspace\stack_demo.py(8)pushit()
-> stack.append(raw_input('Enter New String: ').strip()) # 开始进入调试,该语句的前一条语句为 pdb.set_trace()
(Pdb) l
3 def pushit():
4
5 import pdb
6 pdb.set_trace()
7
8 -> stack.append(raw_input('Enter New String: ').strip())
9
10 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) l
25 (V)iew
26 (Q)uit
27
28 Enter choice: """
29
30 -> while True:
31 while True:
32 try:
33 choice = raw_input(pr).strip()[0].lower()
34 except (EOFError, KeyboardInterrupt, IndexError):
35 choice = 'q'
(Pdb) c p(U)sh
p(O)p
(V)iew
(Q)uit Enter choice: u You 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) n p(U)sh
p(O)p
(V)iew
(Q)uit Enter choice: v
> d:\development\python27\workspace\stack_demo.py(37)showmenu()
-> print '\nYou picked: [%s]' % choice
(Pdb) n You 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) n p(U)sh
p(O)p
(V)iew
(Q)uit Enter choice: v
> d:\development\python27\workspace\stack_demo.py(37)showmenu()
-> print '\nYou picked: [%s]' % choice
(Pdb) c You picked: [v]
[u"'jmilkfan'", u"'fanguiju'", u"'fanguiju'"] p(U)sh
p(O)p
(V)iew
(Q)uit Enter 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 = []
2
3 def pushit():
4
5 stack.append(raw_input('Enter New String: ').strip()) ipdb> h Documented 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 where Miscellaneous help topics:
==========================
exec pdb Undocumented commands:
======================
ll longlist retval rv ipdb>

Python Module_pdb_DEBUG 方法的更多相关文章

  1. Python swapcase()方法

    首先,要明白Python swapcase() 方法用于对字符串的大小写字母进行转换. 其次,了解swapcase()方法语法:str.swapcase() 返回值:返回大小写字母转换后生成的新字符串 ...

  2. python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...

  3. Python capitalize()方法

    Python capitalize()方法 capitalize()方法返回字符串的一个副本,只有它的第一个字母大写.对于8位的字符串,这个方法与语言环境相关. 语法 以下是capitalize()方 ...

  4. Python 字符串方法详解

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

  5. Python isdigit()方法

    描述 Python isdigit() 方法检测字符串是否只由数字组成. 语法 isdigit()方法语法: str.isdigit() 参数 无. 返回值 如果字符串只包含数字则返回 True 否则 ...

  6. Python str方法总结

    1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...

  7. Python list方法总结

    1. 向列表的尾部添加一个新的元素 append(...) L.append(object) -- append object to end 1 2 3 4 >>> a = ['sa ...

  8. Python 魔术方法指南

    入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...

  9. Python join()方法

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

随机推荐

  1. 【vue】iView-admin2.0动态菜单路由【版2】

    依照iView-admin2.0动态菜单路由[版1] 归纳几个节点动态路由获取方式2 ——> easymock假数据 ——> 数据转组件处理.addRoutes ——> localS ...

  2. 第五小节之GUI(图形用户界面)

    GUi:全程是Graphical User Interface,即图形用户界面,就是应用程序提供给用户操作的图形界面,包括窗口.菜单.按钮.工具栏和其它各种图形界面元素.提供了丰富的类,这些类分别位于 ...

  3. 003-基于impi zabbix监控r720 测试过程

    1.F2进入服务器bios 修改network  使这台服务器能够被远程访问. 2.在远程的centos 7 服务器上安装  impitool工具包 #ipmitool -I lanplus -H X ...

  4. Django学习系列5:为视图编写单元测试

    打开lists/tests.py编写 """向浏览器返回真正的HTML响应,添加一个新的测试方法""" from django.test i ...

  5. GUI学习之三十四——QSS样式表

    今天是一个大课题:QSS样式表 一.概念: QSS是Qt Style Sheet——Qt样式表,是用来自定义控件外观的一种机制;可以把他类比成CSS,但是不及其功能强大. 二.使用: 我们做一个模板, ...

  6. 聚合函数 Aggregate Function

    聚合函数是用来统计每个分组的统计信息,它们要跟 group by 一起使用,用来将每个分组所有数据 聚合 成一条统计数据. 包括 max/min/count/avg/sum 等. -- 按照部门进行分 ...

  7. java基础语法2-运算符与流程控制

    关键字-标识符-常量和变量-运算符-流程控制-方法-数组 5 运算符 算术运算符Arithmetic Operators 赋值运算符Assignment Operators 比较运算符Compare ...

  8. contenteditable 光标定位到最后

    在Vue做项目时,做了一个div[contenteditable=true]的组件作为文本输入框 在非手动输入值后,光标会丢失,经测试以下这段代码可用,直接将光标定位到最后 function keep ...

  9. 大数乘法(A * B Problem Plus)问题

    大数乘法问题一般可以通过将大数转换为数组来解决. 解题思路 第1步 第2步 第3步 第4步 样例输入1 56 744 样例输出1 800 样例输入2 -10 678 样例输出2 -6780 样例输入3 ...

  10. html a标签 语法

    html a标签 语法 作用:<a> 标签定义超链接,用于从一张页面链接到另一张页面. 直线电机滑台 说明:<a> 元素最重要的属性是 href 属性,它指示链接的目标.在所有 ...