python模块简介
在使用jupyter book、ipyhton或执行命令行时,通常会遇到调试很不方便的情况。还好Python有自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的
pdb模块使用的三种方式
1. 命令行模式
命令行启动目标程序,加上-m参数,这样调用myscript.py的话,断点就是程序的执行第一行之前,常见操作如下
python -m pdb myscript.py
- 输入next运行到下一行
- 输入list显示下面11行代码
- 输入p打印变量
- 输入quit结束调试
2. 在Python交互环境中启用调试
import pdb
import mymodule
pdb.run("mymodule.test()")
3. 程序内部插入断点
比较常用的,就是在程序中间插入一段程序,相对于在一般IDE里面**打上断点(pdb.set_trace()后一行)**然后启动debug,不过这种方式是hardcode的,适合于用在IDE不好直接调试的情况
if __name__ == "__main__":
a = 1
import pdb
pdb.set_trace()
b = 2
c = a + b
print(c)
pdb模块的常用参数
在进入pdb调试环境时,可以同过help
命令查看所有pdb模块的所有命令,也可以通过help [command]
命令查看具体命令的用法简介
- EOF 文件结束标识
- a(args) 打印当前函数的所有参数
- alias
alias [name [command [parameter parameter ...] ]]
alias 查看所有别名
alias name 查看别名name
alias name command [parameter parameter …] 定义别名name
eg.alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
- b(break) 查看、添加断点
b 列出当前所有断点,和断点执行到统计次数
b line_no:当前脚本的line_no行添加断点
b filename:line_no:脚本filename的line_no行添加断点
b function:在函数function的第一条可执行语句处添加断点
- bt(w/where) 打印当前执行堆栈
- c(cont[inue]) 执行到下一个断点
- cl(clear) 清除断点
cl 清除所有断点
cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
cl lineno 清除当前脚本lineno行的断点
cl filename:line_no 清除脚本filename的line_no行的断点
- commands 断点处添加命令
- condition 设置条件断点,当boolean为True时,条件断点生效
condition bpnumber boolean
- debug 重启debug,相当于restart
- disable 禁用断点,可以恢复
- display [expression] 有参数表达式时,显示表达式的值;无参数时,显示所有display过的值
- d(down) [count] 执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)
- enable 恢复断点
- exit 退出调试,程序中止
- h(help) [command] 查询命令帮助,无参数时,列出所有pdb命令
- ignore bpnumber [count] 忽略断点count次,默认为0,每执行一次,count减1
- interact 开启一个全局解释器,其全局命名空间包含当前范围的(全局与局部)的名称
- j(jump) lineno 设置下条执行的语句函数,只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
- l(list) [first [,last] | .] 显示当前行后面的代码,默认显示11行;参数为first时,显示first后面11行;参数为.时,当前行前后分别显示11行;当参数为first, last时,从first行显示到last行,如果first > last时,在first后显示last数量行
- ll(longlist) 显示当前函数或代码块的所有代码
- n(next) 执行当前行,光标跳转到下一行
- p(pp) expression 打印表达式的值,pp会格式化打印的结果,与display的区别是:display会把表达式也打印出来,但p与pp只打印结果
- q(quit) 停止debug,程序运行中止
- r(return) 继续运行函数,一直到return语句
- restart(run) [args…] 重启当前调试的程序
- rv(retval) 打印函数最后一次返回的值
- s(step) 运行到下一行,当前行为函数的调用,进行到函数定义的第一行
- source expression 获取expression(module, class, method, function, traceback, frame, or code object)的源码
- tbreak[ ([filename:]lineno | function) [, condition] ] 设置临时断点或临时条件断点(只第一次生效)
- u(up) [count] 运行当前代码块到上面一级,默认count=1,即运行到函数调用处
- unalias name 删除别名
- undisplay [expression] 不再显示expression,默认不显示所有的expression
- unt(until) [lineno] 一直执行到行号处,默认运行到return处
- whatis arg 打印arg的变量类型