在jupyter中使用python pdb调试代码

目前在jupyter中还没有可视化调试界面,而python pdb是代码调试的一个不错的选择,它支持设置断点和单步调试,使用起来非常方便

pdb常用命令

参数 说明 实例
h help 帮助文档 h b: 查看 b 命令的文档
b break 打断点 b:查看所有断点
b 5: 给第5行打断点
b function_name:当前文件名为 function_name 的函数打断点
b test1.A.add:在 import test1 文件的 A 类的 add 方法打断点
b A.add:在 A 类的 add 方法打断点
tbreak 设置临时断点,运行完毕后会删除这个断点 设置方法和 b 一样
w where 查看当前执行的位置 w
cl clear 清除断点 cl:清除所有断点
cl 2:清除断点列表中编号为2断点
cl test.py:18:清除 test.py 文件编号为18断点
cl test1:18:清除 import test1 文件编号为18的断点
condition 给断点设置条件 condition 1 i==4:当断点列表中编号为1的断点中变量 i 等于 4 的时候执行断点
s step 执行下一条命令,遇到函数则进入 参考下面执行效果
n next 执行下一条语句,遇到函数不进入 参考下面执行效果
c continue 继续执行,直到遇到下一条断点 参考下面执行效果
r return 执行当前运行函数到结束 参考下面执行效果
args args 打印当前函数的所有参数及参数值 参考下面执行效果
p print 打印出当前所在函数中的变量或表达式结果 p a:打印变量a
p dir(a):打印变量a所有属性
pp 格式化打印出来的结果 pp a:格式化打印变量a
run 重新执行
q quit 退出pdb调试

pdb进阶阶命令

参数 说明 实例
l list 列出当前或范围周围代码 l 5, 20: 列出5到20行代码
l: 查看当前位置的代码
disable 停用断点 disable:清除所有断点
disable 2:清除断点列表中编号为2断点
disable test.py:18:清除 test.py 文件编号为18断点
disable test1:18:清除 import test1 文件编号为18的断点
enable 启动断点 用法和disable一样
ignore bpnumber 忽略某个断点几次 ignore 1 3:忽略断点列表中第1个断点3次,一般循环中用,
commands 给断点写一个脚本执行 commands 1:给断点编号为1的的断点写脚本
unt until 执行到下一行 参考下面 unt 执行效果
j jump 跳转至指定程序行,如果是前行,则忽略中间行代码。
如果是后退,状态重设为回退行状态
注意:是跳转到不是执行
alias 自定义一个函数,参数可由%1,%2来表示。
类似 Python 的 lambda
unalias 删掉别名函数 unalias name

实例1

代码如下:

1
2
3
4
5
6
7
8
9
10
11
import pdb
pdb.set_trace()
def mul(a, b,e = 88):
c = a * b
return c

for i in range(10):
a = i
b = i + 1
r = mul(a, b)
print(r)

使用condition给编号为6的断点设置条件为i==3
在这里插入图片描述
给第8行设置断点,然后输入n单步执行(遇到函数不进入):
在这里插入图片描述

给第8行设置断点,但函数位置输入s遇到函数进入,然后输入r,直接执行到函数尾部:

在这里插入图片描述
输入args打印当前函数的所有参数及参数值,注意:只有在函数内部该命令才有效
在这里插入图片描述
使用commands 22为编号为22的断点编写脚本
在这里插入图片描述
使用unt命令执行到下一行
在这里插入图片描述

示例2

代码如下:

1
2
3
4
5
6
7
8
9
10
import pdb
pdb.set_trace()
class A():
def __init__(self,value):
self.value = value
def printParam(self):
print(self.value)
v = 3
a = A(v)
a.printParam()

输入p dir(a) 打印a的所有属性:
在这里插入图片描述
输入l列出当前位置的代码
在这里插入图片描述

参考文档
python pdb 代码调试 - 最全最详细的使用说明