Python x VS Code 调试与debug
I_am_Future
2021年03月16日 23:18
收录于文集
共5篇

(本文适用于python初学者 大佬手下留情)

作者:I_am_Future_

【VS Code 版本:1.54.3  Python 版本:3.9.0】(其实只要是较新版本对下面内容没有影响)

    近日,笔者在修的csc1001和csc1002都布置程序作业了,一时许多好友写好程序后来问:“为什么我的程序运行不了会报错?” “为什么我的程序结果不对?” 而课程内好像对debug这块讲的是不多。帮他人debug是他们受益一时的,而他们学会debug则是受益一生的。为了“授人以鱼不如授人以渔”,特撰此文供大家写代码debug时参考。

注意:本文提到的debug为VS code里的传统debug功能,具有逐行运行、即时变量显示等功能,使得直接运行的“黑箱”变成可暂停可跟踪的“白箱”,以帮助用户debug。并不是所谓“AI”自动检测自动修复bug的技术!

 


VS code debug 简要操作指南:

    如何进入debug模式:点击左侧 “Run and debug” ;按F5(笔记本可能需要Fn+F5,带bar的MacBook按左边实心箭头);上方“Run”下拉菜单的“Start Debugging“。之后会出现”选择调试配置”,这里我们选择第一个“Python 文件”。【如图1】

图1

    但是!直接这样操作会运行完整个程序的。

    我们需要先在行号左侧部分单击鼠标左键,创造断点(breakpoint)【如图2】,再通过上面所述方法进入debug模式。这样程序便会运行到第一个断点所在行,并等待执行该行。此时,当前所有局部变量、全局变量都会写在左侧“VARIABLE”栏目中。同时,将鼠标移至代码里地变量上,也会显示出当前变量值【如图3】。

图2

图3

    点击上方栏目【图4】中的第三个”向下箭头”按钮(或按F11),就可以继续逐行运行程序了。代码实时运行位置在图中以黄色标出(注意标出行是还没有执行到的),实时变量更新在左侧。(ps:关于栏目中其他按钮的作用,笔者后续会更新文章说明。同学们也可以自行尝试。)

图4

    这样,你就可以即时了解程序执行情况,以及即时追踪各变量值的状态了!就可以以此了解程序在哪里出错,并进行修正debug。


普通小型程序debug:直接运行debug。

    这是一个1001的小型格式化输出程序,可以每行打印8个值。但是打印出来好像有亿点点小问题:

图5

    我们使用调试模式,逐行运行。到快打到第一行末尾时,【图6】注意到才打印到6,count已是8,便会进入这个if换行操作。7就被打印到下一行了。

图6

    我们成功用debug模式跟踪了count item变量的变化情况,找到错误原因。(修改也非常简单,把初始化count设为0即可。)

 


较大型程序debug:模块化的编程思路也可以模块化debug。

    林同学在做1002的“数字华容道”作业时,遇到问题:因为他自己不会复原华容道,他无法测试自己的“检测华容道是否完成的函数”是否可行。这个函数有两个for、一个大块if,直接肉眼瞪确实不好瞪。另外其对返回True的输入也很严格,很难在大程序里模拟测试得到。

图7 林同学的程序(从50行开始)

    模块化写函数的编程思路,debug也可以模块化。对这一函数验证有效性,不一定要在200行的程序里测试,可以把他复制到新的.py文件里,给其传入预设参数,验证可行性。(这不就变成普通小型程序debug了?)

操作流程:

    林同学的检测函数复制到一个新的文件后,根据其函数参数要求(需要一个puzzle和尺寸n)。我们直接主动添加预设参数供其传入,最后加上一个print来显示结果,就像这样:

图8 在外部搭建测试框架(1 2行没有用到请忽视)

    先上一个正确的,返回True,没问题:

图9 正确输入测试

    再改一下传入参数,变成未完成拼图——咦?还是True?

图10 错误输入测试

    这时,就开工debug了:if行打上断点,开始逐行debug。通过debug模式逐行运行,我们很容易理清程序执行逻辑,并很快发现了问题【图11】:当程序进入if后,没有进前两个条件,就必定会进else,随即return True。发现是else这有问题后,改动也很好改,改变一下块if结构和return True位置,问题便被解决了。【图12】(事实上,实现这个函数功能有更简单的方法,同学们自行思考怎么优化)

图11 断点测试。在第一遍的时候就已经进入到“ return True”了

图12 修改后的程序,可以正常运行(True的测试图略)

    至此,我们完成了检验函数的测试与debug。当前函数则可以正常移植入大程序并且实现正确功能。

总结:

  •  使用debug模式,我们可以很快速地跟踪变量和流程,进行debug;

  • 对于小型程序,我们可以直接debug;对于大型程序里的函数,我们可以模块化思路,将其复制出来,单独测试。给予其合适的测试参数并接收输出,进行模块化测试、debug。

  • 什么?你问大型程序的模块间逻辑结构怎么debug?那敬请期待下回对debug模式六个按钮的详细介绍!

    上述内容结合互联网与自身实践而得。如有纰漏,或有疑问,敬请电邮至笔者邮箱:3038242641@qq.com