搜索

查看: 3104|回复: 11

[Python] python实现断点调试的方法

[复制链接]
发表于 2023-5-4 17:20:04 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:20:04 3104 11 看全部
目录
  • ❤  什么是bug(缺陷)
  • ❤  python代码的调试方式
  • ❤  使用 pdb 进行调试
  • 实例1.测试代码示例
  • 实例2.利用 pdb 调试
  • 实例3.退出 debug
  • 实例4. debug 过程中打印变量
  • 实例5.停止 debug 继续执行程序
  • 实例6.debug 过程中显示代码
  • 实例7.使用函数的例子
  • 实例8.对函数进行 debug
  • 实例9.在调试的时候动态改变值
  • ❤  使用 PyCharm 进行调试
  • ❤  Step Over, Step Into和Step Out
  • 实例1.Step Over的效果
  • 实例2.Step Into的效果
  • 实例3.Step Out的效果当程序中出现错误时怎么解决?也就是我们所说的bug(缺陷),以及工作中如何对bug进行调试

    ❤  什么是bug(缺陷)
    软件缺陷就是通常说的bug,它是指在软件中(包括文档和程序)存在的影响软件正常运行的问题
    缺陷的原因:
  • 编码问题
  • 项目日期限短
  • 使用新技术
    ❤  python代码的调试方式
    使用print语句打印出来
    在编辑工具中,加断点跟踪(打断点)
    使用日志模块,输出到日志中

    下面我们来看看怎么打断点
    Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助我们准确的定位错误,发现程序中的 bug。python 提供了一系列 debug 的工具和包,可供我们选择。

    ❤  使用 pdb 进行调试
    pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令
    命令解释
    break 或 b 设置断点设置断点
    continue 或 c继续执行程序
    list 或 l查看当前行的代码段
    step 或 s进入函数
    return 或 r执行代码直到从当前函数返回
    exit 或 q中止并退出
    next 或 n执行下一行
    pp打印变量的值
    help帮助

    下面结合具体的实例讲述如何使用 pdb 进行调试

    实例1.测试代码示例
    import pdb
    a = "aaa"
    pdb.set_trace()
    b = "bbb"
    c = "ccc"
    final = a + b + c
    print(final)
    开始调试:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令

    实例2.利用 pdb 调试
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py
    > /root/epdb1.py(4)?()
    -> b = "bbb"
    (Pdb) n
    > /root/epdb1.py(5)?()
    -> c = "ccc"
    (Pdb)
    > /root/epdb1.py(6)?()
    -> final = a + b + c
    (Pdb) list
      1     import pdb
      2     a = "aaa"
      3     pdb.set_trace()
      4     b = "bbb"
      5     c = "ccc"
      6  -> final = a + b + c
      7     print(final)
    [EOF]
    (Pdb)
    [EOF]
    (Pdb) n
    > /root/epdb1.py(7)?()
    -> print(final)
    (Pdb)
    退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

    实例3.退出 debug
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py
    > /root/epdb1.py(4)?()
    -> b = "bbb"
    (Pdb) n
    > /root/epdb1.py(5)?()
    -> c = "ccc"
    (Pdb) q
    Traceback (most recent call last):
      File "epdb1.py", line 5, in ?
        c = "ccc"
      File "epdb1.py", line 5, in ?
        c = "ccc"
      File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch
        return self.dispatch_line(frame)
      File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line
        if self.quitting: raise BdbQuit
    bdb.BdbQuit
    打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError:  错误

    实例4. debug 过程中打印变量
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py
    > /root/epdb1.py(4)?()
    -> b = "bbb"
    (Pdb) n
    > /root/epdb1.py(5)?()
    -> c = "ccc"
    (Pdb) p b
    'bbb'
    (Pdb)
    'bbb'
    (Pdb) n
    > /root/epdb1.py(6)?()
    -> final = a + b + c
    (Pdb) p c
    'ccc'
    (Pdb) p final
    *** NameError:  
    (Pdb) n
    > /root/epdb1.py(7)?()
    -> print(final)
    (Pdb) p final
    'aaabbbccc'
    (Pdb)
    使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print(final) 之前再加上 set_trace() 验证。

    实例5.停止 debug 继续执行程序
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py
    > /root/epdb1.py(4)?()
    -> b = "bbb"
    (Pdb) n
    > /root/epdb1.py(5)?()
    -> c = "ccc"
    (Pdb) c
    aaabbbccc
    显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

    实例6.debug 过程中显示代码
    [root@rcc-pok-idg-2255 ~]#  python epdb1.py
    > /root/epdb1.py(4)?()
    -> b = "bbb"
    (Pdb) list
      1     import pdb
      2     a = "aaa"
      3     pdb.set_trace()
      4  -> b = "bbb"
      5     c = "ccc"
      6     final = a + b + c
      7     pdb.set_trace()
      8     print(final)  
    [EOF]
    (Pdb) c
    > /root/epdb1.py(8)?()
    -> print final
    (Pdb) list
      3     pdb.set_trace()
      4     b = "bbb"
      5     c = "ccc"
      6     final = a + b + c
      7     pdb.set_trace()
      8  -> print(final)
    [EOF]
    (Pdb)
    在使用函数的情况下进行 debug

    实例7.使用函数的例子
    import pdb
    def combine(s1,s2):      
        s3 = s1 + s2 + s1   
        s3 = '"' + s3 +'"'   
        return s3           
    a = "aaa"
    pdb.set_trace()
    b = "bbb"
    c = "ccc"
    final = combine(a,b)
    print(final)
    如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

    实例8.对函数进行 debug
    [root@rcc-pok-idg-2255 ~]# python epdb2.py
    > /root/epdb2.py(10)?()
    -> b = "bbb"
    (Pdb) n
    > /root/epdb2.py(11)?()
    -> c = "ccc"
    (Pdb) n
    > /root/epdb2.py(12)?()
    -> final = combine(a,b)
    (Pdb) s
    --Call--
    > /root/epdb2.py(3)combine()
    -> def combine(s1,s2):     
    (Pdb) n
    > /root/epdb2.py(4)combine()
    -> s3 = s1 + s2 + s1   
    (Pdb) list
      1     import pdb
      2
      3     def combine(s1,s2):      
      4  ->     s3 = s1 + s2 + s1   
      5         s3 = '"' + s3 +'"'   
      6         return s3            
      7
      8     a = "aaa"
      9     pdb.set_trace()
    10     b = "bbb"
    11     c = "ccc"
    (Pdb) n
    > /root/epdb2.py(5)combine()
    -> s3 = '"' + s3 +'"'   
    (Pdb) n
    > /root/epdb2.py(6)combine()
    -> return s3            
    (Pdb) n
    --Return--
    > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
    -> return s3           
    (Pdb) n
    > /root/epdb2.py(13)?()
    -> print(final)  
    (Pdb)
    在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用 B。

    实例9.在调试的时候动态改变值
    [root@rcc-pok-idg-2255 ~]# python epdb2.py
    > /root/epdb2.py(10)?()
    -> b = "bbb"
    (Pdb) var = "1234"
    (Pdb) b = "avfe"
    *** The specified object '= "avfe"' is not a function
    or was not found along sys.path.
    (Pdb) !b="afdfd"
    (Pdb)
    pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。
    接下来将介绍 PyCharm IDE 的调试方法

    ❤  使用 PyCharm 进行调试
    PyCharm 同时提供了较为完善的调试功能,支持多线程,远程调试等,可以支持断点设置,单步模式,表达式求值,变量查看等一系列功能

    2023022215120124.jpg

    2023022215120124.jpg


    ❤  Step Over, Step Into和Step Out
    Step Over:在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步
    注意:在不存在子函数的情况下Step Over是和Step Into效果一样的
    Step Into:单步执行,遇到子函数就进入并且继续单步执行(即进入子函数)
    Step Out:当单步执行到子函数内时,用Step Out就可以执行完子函数余下部分,并返回到上一层函数
    在第14行调用devide函数时打断点

    2023022215120125.jpg

    2023022215120125.jpg


    实例1.Step Over的效果

    2023022215120126.jpg

    2023022215120126.jpg


    实例2.Step Into的效果

    2023022215120127.jpg

    2023022215120127.jpg


    点击Step Into下一步

    2023022215120128.jpg

    2023022215120128.jpg


    点击Step Into下一步

    2023022215120129.jpg

    2023022215120129.jpg


    点击Step Into下一步

    2023022215120130.jpg

    2023022215120130.jpg


    实例3.Step Out的效果

    2023022215120231.jpg

    2023022215120231.jpg


    到此这篇关于python实现断点调试的方法的文章就介绍到这了,更多相关python 断点调试内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 17:04:40 | 显示全部楼层
    素色流年783 2023-6-28 17:04:40 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-29 14:31:40 | 显示全部楼层
    123456848 2023-6-29 14:31:40 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-29 17:11:31 | 显示全部楼层
    贰十岁装成熟装s 2023-6-29 17:11:31 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-29 17:49:18 | 显示全部楼层
    贺老师 2023-6-29 17:49:18 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-29 22:49:21 | 显示全部楼层
    麻辣鸡翅 2023-6-29 22:49:21 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-30 09:44:21 | 显示全部楼层
    老橡树1 2023-6-30 09:44:21 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 11:49:02 | 显示全部楼层
    啤酒瓶空了缓 2023-6-30 11:49:02 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 19:21:10 | 显示全部楼层
    心随674 2023-6-30 19:21:10 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 20:54:56 | 显示全部楼层
    尘埃416 2023-6-30 20:54:56 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表