Zodiac Wang
  • Home
  • Categories
  • Tags
  • Archives

PDB基本使用

pdb-The Python Debugger

简单记录一下

Table of Contents

  • 1  pdb
    • 1.1  按脚本运行
    • 1.2  在文件中运行
    • 1.3  debugger commands
  • 2  pdb++

pdb¶

按脚本运行¶

python -m pdb myscript.py

在运行脚本时作为参数传入时,pdb 会自动进入 post-mortem debugging 状态[崩溃后调试],此后 pdb 将重启程序,重启之后 pdb 将保留所有变量,直到再次运行第一行代码。

此外还可用 -c 参数在调试时添加临时代码

python -m pdb -c new_variable=666 myscript.py # python -m pdb -c "new_variable = 666" myscript.py

在文件中运行¶

在希望进入调试的地方添加如下代码,即可在运行代码时进入调试

import pdb
pdb.set_trace()

输入 c(ont(inue)) 继续执行直到下一个断点

pdb 里的一些方法

  • pdb.run(statement, globals=None, locals=None)
  • pdb.runeval(expression, globals=None, locals=None)
  • pdb.runcall(function, *args, **kwds)
  • pdb.set_trace()
  • pdb.post_mortem(traceback=None)
  • pdb.pm() Enter post-mortem debugging of the traceback found in

最常使用的也就是 pdb.set_trace() 和 pdb.pm()

class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)

Example call to enable tracing with skip:

import pdb
pdb.Pdb(skip=['django.*']).set_trace()

debugger commands¶

输入 h(elp) 可以查看帮助信息,输入不是 pdb 指令时被认为是 Python 语句,这些语句会在当前的 debug point 执行,输入单个变量名则打印该变量。当变量名和 pdb 指令重名时,在变量名前添加 ! 如 !c。

如果命令带参数则使用 [] 指定,可选项使用 | 分开。多条命令可以单行输入,使用 ; 隔开

  • h(elp) [command] 没有参数时,打印所有命令选项,带参数则打印此命令的帮助信息。
  • w(here) 打印当前的 debug point
  • d(own) [count] 将当前的 frame 下移 count 个层级
  • u(p) [count] 上移
  • b(reak) [([filename:]lineno | function) [, condition]]
  • s(tep) 单步调试
  • n(ext) 执行到当前文件中的下一行
  • unt(il) [lineno] 不给参数,继续执行到大于当前行号的地方;给参数则执行到大于给定行号的地方。对于两种方式,当前 frame 返回都会终止。
  • r(eturn) 继续执行直到当前函数 return
  • c(ont(inue)) 继续执行直到下一个断点
  • l(ist) [first[, last]] 列出区域源码,如果不给出参数,显示 11 行
  • ll 显示全部源码
  • a(rgs) 显示当前函数的参数列表
  • whatis expression 显示 type
  • display [expression] 如果 expression 的值发生改变的话显示 expression 的值,如果不指定参数,列出全部 expression
  • undisplay [expression] 不再显示
  • interact 开启一个 interactive crompt 当前 frame 中的所有 global 和 local 变量包含在新环境的 global 中
  • ! statement 执行单行语句
  • q 退出 debugger 放弃执行当前程序,相当粗鲁,程序直接崩溃。

pdb++¶

pdb++ 是 Python pdb 的加强版,使用时与 pdb 完全兼容。

pdb++ 是一个 drop-in replacement,也就是说完全不需要更改原有的使用习惯,甚至直接使用 pdb 这一名称进行调用。

主要特性

  • colorful TAB completion of Python expressions (through fancycompleter) 彩色 TAB 补全
  • optional syntax highlighting of code listings (through pygments) 代码高亮
  • sticky mode sticky 模式
  • several new commands to be used from the interactive (Pdb++) prompt 一些新的调试命令
  • smart command parsing (hint: have you ever typed r or c at the prompt to print the value of some variable?)
  • additional convenience functions in the pdb module, to be used from your program

值得注意的是,在 pdb 中,c u d 等字母属于调试指令,所以要打印同名变量必须在前面加上转义符 !c,但是在 pdb++ 中,默认优先考虑变量,只要变量在当前 frame 中存在就默认打印变量,而如果不存在则考虑是否存在同名指令。

(Pdb) list
  1
  2     def fn():
  3         c = 42
  4         import pdb;pdb.set_trace()
  5  ->     return c
(Pdb) c
(Pdb++) list
  1
  2     def fn():
  3         c = 42
  4         import pdb;pdb.set_trace()
  5  ->     return c
(Pdb++) c
42
(Pdb++) !!c

存在同名变量时,要执行调试命令只能在前面添加两个 !! 比如 !!c

一些同名指令的输出结果也得到了加强,还有很多其他的改进,详见 References

References:

  • pdb — The Python Debugger
  • pdbpp

  • « 人终究是孤独的
  • 各种图像处理库中imread函数的区别 »

Published

11 7, 2018

Category

posts

Tags

  • pdb 1
  • Python 16

Contact

  • Zodiac Wang - A Fantastic Learner
  • Powered by Pelican. Theme: Elegant