【Python基础】Python调试器pdb

更新历史:

  • 2022年12月6日完成初稿

最近在写项目代码,其中需要在Vscode上写python代码,有用命令行调试代码的需求,因此学习了一些Python调试器pdb的知识,一定程度上解决了代码调试的问题。

本文主要参考Python3官方文档:pdb — Python 的调试器,执行环境为Ubuntu 20.04.2 LTS,Python版本为3.7.0

1. pdb简介

pdb 是 Python 的模块,其定义了一个交互式源代码调试器,支持 Python 程序在源码行间设置(有条件的)断点和单步执行。pdb 主要有两种使用方法:

  • pdb.py 作为脚本调用,来调试其他脚本(不用额外修改源代码,在命令行下直接运行就能调试)
>>> python -m pdb test.py
  • 在调试器的控制下运行程序(需要在被调试的代码中添加一行代码然后再正常运行代码)
>>> import pdb;pdb.set_trace()   # 设置断点

在项目中,我主要是用了第一种方式,因此下面主要介绍第一种方式。

2. pdb调试

2.1 pdb常用命令

pdb命令 解释
s(tep) 运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下
n(ext) 继续运行,直到运行到当前函数的下一行,或当前函数返回为止。 ( nextstep 之间的区别在于,step 进入被调用函数内部并停止,而 next (几乎)全速运行被调用函数,仅在当前函数的下一行停止。)
j(ump) lineno 设置即将运行的下一行。例如j 10表示跳转至代码第10行(被跳过的代码不执行)
unt(il) lineno 如果不带行号,则继续运行,直到行号比当前行大时停止;如果带有行号,则继续运行,直到行号大于或等于该行号时停止。例如unt 10表示代码运行至第10行
a(rgs) 打印当前函数的参数列表
r(eturn) 继续运行,直到当前函数返回。
p expression 打印表达式expression的值
q(uit) 退出调试器,被执行的程序将被中止

2.2 pdb实例

假设演示的项目代码如下:

import numpy as np

def mat_mul(A, B):	# 矩阵乘法
    assert A.shape[1] == B.shape[0]
    return np.dot(A, B)

if __name__ == "__main__":
    A = np.arange(12).reshape(3, 4)
    B = np.arange(20).reshape(4, 5)
    C = mat_mul(A, B)
    print("C = A * B = ", C)

如上所述,在输入上述命令后,程序便可进入调试模式:

>>> (base) root@yp:~/yp_workplace/# python -m pdb test.py
> /root/yp_workplace/test.py(1)<module>()
-> import numpy as np
(Pdb) 

当你在命令行看到(Pdb) 时,说明已经正确打开了pdb,下面便可根据所需来调试代码,如下所述:

(base) root@yp:~/yp_workplace# python -m pdb test.py
> /root/yp_workplace/test.py(1)<module>()
-> import numpy as np
(Pdb) n				# 进入下一行代码
> /root/yp_workplace/test.py(3)<module>()
-> def mat_mul(A, B):
(Pdb) n
> /root/yp_workplace/test.py(8)<module>()
-> if __name__ == "__main__":
(Pdb) n
> /root/yp_workplace/test.py(9)<module>()
-> A = np.arange(9).reshape(3, 3)
(Pdb) n
> /root/yp_workplace/test.py(10)<module>()
-> B = np.arange(12).reshape(3, 4)
(Pdb) n
> /root/yp_workplace/test.py(11)<module>()
-> C = mat_mul(A, B)
(Pdb) s				# 进入到mat_mul函数内部
--Call--
> /root/yp_workplace/test.py(3)mat_mul()
-> def mat_mul(A, B):
(Pdb) n
> /root/yp_workplace/test.py(4)mat_mul()
-> assert A.shape[1] == B.shape[0]
(Pdb) n
> /root/yp_workplace/test.py(5)mat_mul()
-> return np.dot(A, B)
(Pdb) n
--Return--
> /root/yp_workplace/test.py(5)mat_mul()->array([[ 20, ...3, 134, 155]])
-> return np.dot(A, B)
(Pdb) n
> /root/yp_workplace/test.py(12)<module>()
-> print("C = A * B = ", C)
(Pdb) n
C = A * B =  [[ 20  23  26  29]
 [ 56  68  80  92]
 [ 92 113 134 155]]
--Return--
> /root/yp_workplace/test.py(12)<module>()->None
-> print("C = A * B = ", C)
(Pdb) q				# 退出调试模式

猜你喜欢

转载自blog.csdn.net/Stu_YangPeng/article/details/128198040