调试python程序

怪不得这几天头疼的厉害,原来是发生了2件大事:官方的XP彻底和我们告别了and爆发了OpenSSL HeartBleed漏洞。这个漏洞可以说是一场大地震,不知道又会有多少网站被“扒光脱裤”,过一阵又得改密码玩了。面对这种网络安全问题,真的是一种待宰羔羊的无力感。

调试python程序我知道有3个东东:pdb,ipdb,pudb。

第一个是python自带模块,第二个如果安了ipython的话貌似自己就被安装了,最后一个有图形界面,十分复古的——蓝底,真是让人怀念。后2个都可以使用pip安装。 ipdb支持语法高亮,不过貌似中文支持不太好。

pubd更加适合调试单独的python程序,可以看到全部的代码以及栈、变量、断点,不知道嵌入django什么效果。不过另外两个更容易和django结合。

有3种调用方式:

  1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前。python -m ipdb myscript.py

  2. 在Python交互环境中启用调试。

import ipdb
import mymodule
ipdb.run(‘mymodule.test()’)
  1. 比较常用的,就是在程序中间插入一段程序,相对于在一般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)重新执行