Python控制台调试模式:IPDB
Python可直接在终端进行DEBUG调试:IPDB
IPDB
前一段时间刚接触到这个, 之前 DEBUG 还停留在 IDE 层面… 原来还可以这么玩…
IPDB 是什么?IPDB(Ipython Debugger),和 GDB 类似,是一款集成了 Ipython 的 Python 代码命令行调试工具,可以看做 PDB 的升级版
那么 PDB 是什么? - Python Debugger
推荐直接使用: IPDB 毕竟是增强版: 支持Tab补全; 支持语法高亮; 支持 iPython
基础用法
有2种方式启用 pdb 一种是代码里导入 pdb 模块; 一种是命令行启用;
懒人当然选第二种(不用改代码): python3 -m ipdb myscript.py
默认是按行执行的, 按 回车 或者 n 执行下一行
常用的命令:
h快捷的帮助文档l展示更多的源码b 10给第10行设置断点c进入下一个设置的断点p打印变量值s进入函数r跳出函数q退出
ipdb> h
Documented commands (type help <topic>):
========================================
EOF cl disable interact next psource rv unt
a clear display j p q s until
alias commands down jump pdef quit source up
args condition enable l pdoc r step w
b cont exit list pfile restart tbreak whatis
break continue h ll pinfo return u where
bt d help longlist pinfo2 retval unalias
c debug ignore n pp run undisplay
Miscellaneous help topics:
==========================
exec pdb
ipdb> h c
c(ont(inue))
Continue execution, only stop when a breakpoint is encountered.
PDB 命令表
常用的命令一般都是一个字母的简写, 使用完成的命令也是可以的
整理的命令表(Python3): 参考:pdb-document
h(elp)- 默认展示全部命令列表!!!h b设置断点的文档!!! 会这个, 其他的就简单了w(here)- 打印堆栈信息d(own)- Move the current frame count (default one) levels down in the stack trace (to a newer frame)u(p)- Move the current frame count (default one) levels up in the stack trace (to an older frame)b(reak) [([filename:]lineno | function) [, condition]]- 断点- 不带参数时列出所有断点信息
- 行号 - 给指定的行设置断点
- 函数名 - 给指定函数设置断点
- 文件名:行号 - 给指定文件名的某行设置断点 (此文件可能还没引人)
- 如果有第二个参数, 则条件结果为
True时设置断点
tbreak [([filename:]lineno | function) [, condition]]- 临时断点- 参数和
break一样; 第一次命中断点后自动删除
- 参数和
cl(ear) [filename:lineno | bpnumber [bpnumber ...]]- 清除断点- 不带参数时, 清除所有断点(会先提示先确认)
- 文件:行号 - 清理指定文件对应行号的断点
- 断点号1 断点号2 … - 清理指定编号的断点; 断点编号列表可以使用
b查看
disable [bpnumber [bpnumber ...]]- 禁用断点, 不是删除; 后面可以重新开启enable [bpnumber [bpnumber ...]]- 启用禁用的断点ignore bpnumber [count]- 断点忽略断点次数, 直到次数为0时, 断点才会生效; 功效应该和几次disable后再enable一样condition bpnumber [condition]- 给指定编号的断点设置条件- 没有条件参数时 - 去掉断点上面已有的条件
- 有条件参数是 - 设置新的条件, 当条件值为
True时, 断点才会生效
commands [bpnumber]- 给断点设置命令列表- 删除断点所有命令, 只需要输入
commands后立即输入end即可 - 没有 断点编号 参数时, 默认为最后一个断点
- 删除断点所有命令, 只需要输入
s(tep)- 进入当前行对应的函数里n(ext)- 下一步unt(il) [lineno]- 正常执行直到某一行为止; 有点像临时断点, 有什么区别么?r(eturn)- 跳出当前方法函数c(ont(inue))- 继续执行, 知道碰到断点j(ump) lineno- 直接跳转到某行执行, 中间跳过的代码不会执行!!!l(ist) [first[, last]]- 展示当前行邻近的源代码;l 10,20展示第10到20行代码ll | longlist- 展示本文件所有代码a(rgs)- 打印当前函数的参数列表, 以及对于参数的值p expression- 打印当前 表达式 的值; 比如变量等pp expression- 带格式化的打印 表达式 的值whatis expression- 打印 表达式 的类型source expression- 尝试获取 表达式 的源码display [expression]- 显示 表达式 的值; 如表达式的值有变动, 那么就会实时打印结果, 动态跟踪undisplay [expression]- 取消 表达式 的显示interact- 启动一个交互式解释器alias [name [command]]- 给命令起别名, 具体还是看文档吧unalias name- 取消别名run | restart [args ...]- 重启启动调试- 之前的操作, 断点, 设置选项都将保留
restart是run的别名;
q(uit)- 退出调试模式
如果不全的话, 请直接参考: h pinfo 形式
参考:
blog comments powered by Disqus