更新历史:
最近在写项目代码,其中需要在Vscode上写python代码,有用命令行调试代码的需求,因此学习了一些Python调试器pdb的知识,一定程度上解决了代码调试的问题。
本文主要参考Python3官方文档:pdb — Python 的调试器,执行环境为Ubuntu 20.04.2 LTS,Python版本为3.7.0
pdb 是 Python 的模块,其定义了一个交互式源代码调试器,支持 Python 程序在源码行间设置(有条件的)断点和单步执行。pdb 主要有两种使用方法:
pdb.py
作为脚本调用,来调试其他脚本(不用额外修改源代码,在命令行下直接运行就能调试)>>> python -m pdb test.py
>>> import pdb;pdb.set_trace() # 设置断点
在项目中,我主要是用了第一种方式,因此下面主要介绍第一种方式。
pdb命令 | 解释 |
---|---|
s(tep) | 运行当前行,在第一个可以停止的位置(在被调用的函数内部或在当前函数的下一行)停下 |
n(ext) | 继续运行,直到运行到当前函数的下一行,或当前函数返回为止。 ( next 和 step 之间的区别在于,step 进入被调用函数内部并停止,而 next (几乎)全速运行被调用函数,仅在当前函数的下一行停止。) |
j(ump) lineno | 设置即将运行的下一行。例如j 10 表示跳转至代码第10行(被跳过的代码不执行) |
unt(il) lineno | 如果不带行号,则继续运行,直到行号比当前行大时停止;如果带有行号,则继续运行,直到行号大于或等于该行号时停止。例如unt 10 表示代码运行至第10行 |
a(rgs) | 打印当前函数的参数列表 |
r(eturn) | 继续运行,直到当前函数返回。 |
p expression | 打印表达式expression 的值 |
q(uit) | 退出调试器,被执行的程序将被中止 |
假设演示的项目代码如下:
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)()
-> import numpy as np
(Pdb)
当你在命令行看到(Pdb)
时,说明已经正确打开了pdb,下面便可根据所需来调试代码,如下所述:
(base) root@yp:~/yp_workplace# python -m pdb test.py
> /root/yp_workplace/test.py(1)()
-> import numpy as np
(Pdb) n # 进入下一行代码
> /root/yp_workplace/test.py(3)()
-> def mat_mul(A, B):
(Pdb) n
> /root/yp_workplace/test.py(8)()
-> if __name__ == "__main__":
(Pdb) n
> /root/yp_workplace/test.py(9)()
-> A = np.arange(9).reshape(3, 3)
(Pdb) n
> /root/yp_workplace/test.py(10)()
-> B = np.arange(12).reshape(3, 4)
(Pdb) n
> /root/yp_workplace/test.py(11)()
-> 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)()
-> 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)()->None
-> print("C = A * B = ", C)
(Pdb) q # 退出调试模式