调试python程序
怪不得这几天头疼的厉害,原来是发生了2件大事:官方的XP彻底和我们告别了and爆发了OpenSSL HeartBleed漏洞。这个漏洞可以说是一场大地震,不知道又会有多少网站被“扒光脱裤”,过一阵又得改密码玩了。面对这种网络安全问题,真的是一种待宰羔羊的无力感。
调试python程序我知道有3个东东:pdb,ipdb,pudb。
第一个是python自带模块,第二个如果安了ipython的话貌似自己就被安装了,最后一个有图形界面,十分复古的——蓝底,真是让人怀念。后2个都可以使用pip安装。 ipdb支持语法高亮,不过貌似中文支持不太好。
pubd更加适合调试单独的python程序,可以看到全部的代码以及栈、变量、断点,不知道嵌入django什么效果。不过另外两个更容易和django结合。
有3种调用方式:
-
命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前。
python -m ipdb myscript.py
-
在Python交互环境中启用调试。
import ipdb
import mymodule
ipdb.run(‘mymodule.test()’)
- 比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面打上断点然后启动debug,不过这种方式是hardcode的
import ipdb
ipdb.set_trace() # 开启pdb提示
pdb和ipdb命令大多通用:
- dir() 方法 可以查看一个对象有那些方法可以调用 常用
- h(elp),会打印可用的命令,如果要查询某个命令,可以输入 h [command]
- l(ist),可以列出当前将要运行的代码块,只有几行
- disable/enable,禁用/激活断点
- b(reak), 设置断点,例如 “b 77″,就是在当前脚本的77行打上断点,还能输入函数名作为参数,断点就打到具体的函数入口,如果只敲b,会显示现有的全部断点
- condition bpnumber [condition],设置条件断点
- cl(ear),如果后面带有参数,就是清除指定的断点,如果不带参数就是清除所有的断点
- n(ext),让程序运行下一行,如果当前语句有一个函数调用,用n是不会进入被调用的函数体中的
- s(tep),跟n相似,但是如果当前有一个函数调用,那么s会进入被调用的函数体中
- c(ont(inue)),让程序正常运行,直到遇到断点
- j(ump),让程序跳转到指定的行数
- a(rgs),打印当前函数的参数 常用
- p,打印某个变量 常用
- q(uit),退出调试
- w(here),回溯调用过程
- d(own), 后退一步帧(注:相当于回滚)
- u(p), 前进一步帧
- (回车), 重复上一条指令
- run(restart)重新执行