• 【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
    
    • 1
    • 在调试器的控制下运行程序(需要在被调试的代码中添加一行代码然后再正常运行代码)
    >>> import pdb;pdb.set_trace()   # 设置断点
    
    • 1

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

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

    当你在命令行看到(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				# 退出调试模式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    Hashcat 的使用
    云上360行丨深耕快消品行业数字化转型,纷享销客与华为云合力同行
    JAVA计算机毕业设计专辑鉴赏网站Mybatis+系统+数据库+调试部署
    Dijkstra搜索简介
    【产业前沿】树莓集团如何以数字媒体产业园为引擎,加速产业升级?
    PCL+vs环境配置
    天龙八部TLBB系列 - 关于技能冷却和攻击范围数量的问题
    C#: 未能加载文件或程序集“xxx“
    ET-B33H-M@GB插4G卡后如何访问网页界面?
    兴业数金一面
  • 原文地址:https://blog.csdn.net/Stu_YangPeng/article/details/128198040