python pdb调试方法

一、pdb的使用方法

当你在命令行看到下面这个提示符时,说明已经正确打开了pdb

(Pdb) 

然后就可以在交互界面,输入pdb命令,进行调试

下面是pdb的调用使用方法

1.1 非侵入式方法

不用额外修改源代码,在命令行下直接运行就能调试

python3 -m pdb filename.py

举个例子

pdb_test.py 文件内容如下

print('hello world')

运行指令如下

python3 -m pdb pdb_test.py

运行结果如下

image-20200729200626574

1.2 侵入式方法

需要在被调试的代码中添加一行代码然后再正常运行代码

import pdb;pdb.set_trace()

pdb.set_trace()这里就是一个断点,程序运行之后,会停留在pdb.set_trace()这里。

之后就进入了pdb调试部分,可以通过调试指令进行代码的调试

举个例子

pdb_test.py 文件内容如下

import pdb;pdb.set_trace()
print('hello world')

运行指令如下

python3 pdb_test.py

运行结果如下

image-20200729200752462

继续运行后,如果在下面的程序中继续有 set_trace() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

二、pdb的内部指令

2.1 逐行调试命令

包括snr这3个相似的命令,区别在如何对待函数上。说明:

  • s执行下一行(能够进入函数体)

  • n执行下一行(不会进入函数体)

  • r执行下一行(在函数中时会直接执行到函数返回处)

举个例子

pdb_test.py 文件内容如下

def add_1(a):
    print('进入函数')
    a = a+1
    return a
if __name__ == '__main__':
    print('hello world')
    a = 1
    a = add_1(a)
    print(a)

运行指令如下

python3 -m pdb pdb_test.py

s运行结果如下

image-20200729202225575

n运行结果如下

image-20200729202509672

r运行结果如下

image-20200729202530502

2.2 查看源代码

命令:l

说明:

查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>这个符号标出来

命令:ll

说明:

查看当前函数或框架的所有源代码

2.3 添加断点

命令:

b
b lineno
b filename:lineno 
b functionname

说明与参数:

不带参数表示查看断点设置

带参则在指定位置设置一个断点

lineno =》断点添加到哪一行(当前文件)

filename:lineno =》文件名和行号,断点添加到哪个文件的哪一行 如:train:44 (即为train.py的44行)

functionname =》函数名,在该函数执行的第一行设置断点

2.4 添加临时断点

命令:

tbreak
tbreak lineno
tbreak filename:lineno
tbreak functionname

说明与参数:

执行一次后时自动删除(这就是它被称为临时断点的原因)

参数的设置同b

2.5 清除断点

命令:

cl
cl filename:lineno
cl bpnumber [bpnumber ...]

参数:

bpnumber 断点序号(多个以空格分隔)

说明:

1.不带参数用于清除所有断点,会提示确认(包括临时断点)
2.带参数则清除指定文件行或当前文件指定序号的断点

2.6 打印变量值

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名。

但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … …> 错误。

命令:

p expression

参数:

expression 即为 Python表达式

2.7 非逐行调试命令

命令1:

c 

说明:

停止调试,持续执行下去,直到遇到一个断点

命令2:

unt lineno

说明:

持续执行直到运行到指定行(或遇到断点)

命令3:

j lineno

说明:

直接跳转到指定行(注意,被跳过的代码不执行)

2.8 查看函数参数

命令:

a

说明:

在函数中时打印函数的参数和参数的值

2.9 打印变量类型

命令:

whatis expression

说明:

打印表达式的类型,常用来打印变量值

2.10 启动交互式解释器

interact
import pdb;pdb.set_trace()
print("1")
print("2")
print("3")
print("4")
a = 100
pdb.set_trace()
print("5")
print("6")
print("7")
print("8")
print(a)

说明:

启动一个python的交互式解释器,使用当前代码的全局命名空间(使用ctrl+d返回pdb)

image-20210303102715373

2.11 打印堆栈信息

w

说明:

打印堆栈信息,最新的帧在最底部。箭头表示当前帧。

2.12 退出pdb

q

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

2.13 帮助

help

三、注意问题和解决

注意点1:

选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。

注意点2:

输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行

注意点3:

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是a已经被赋值了,如果想重新改变a的赋值,则应该使用!a。

import pdb;pdb.set_trace()
print("1")
print("2")
print("3")
print("4")
a = 100
pdb.set_trace()
print("5")
print("6")
print("7")
print("8")
print(a)

image-20210303102536599

Last、参考文献

python pdb查看变量值_使用pdb模块调试Python_weixin_39587029的博客-CSDN博客

Python 代码调试技巧

10分钟教程掌握Python调试器pdb - 知乎

Last and Need to Read、还没看有参考价值的文献

pdb — Python的调试器 — Python 3.7.10 說明文件

Python,告别Print? - 知乎

Python ipdb 调试大法[视频] - 知乎

DeBug Python代码全靠print函数?换用这个一天2K+Star的工具吧 - 知乎

猜你喜欢

转载自blog.csdn.net/qq_41554005/article/details/114301729