🎉🎉欢迎持续关注🎉🎉 |
文章目录
我们已经学完了异常的知识,今天我们进行一个小的知识点普及,什么是bug?以及在日常工作中如何对bug进行程序调试。
什么是bug?
程序中出现的错误,但又没有通过异常去捕获,以至于直接抛出,从能导致程序的崩溃,继而造成对应的功能未达到想要的效果,这就是我们经常说的 程序出bug了
。测试工程师一般也会将软件缺陷叫做 bug,当然了这是一种广义上的bug(分类:功能错误、内容相关、用户界面的UI、代码错误、需求变更等)。今天我们所说的bug指的是代码错误导致的程序错误。
设置调试断点与配置调试器
实际学习工作过程中, 很少出现写完代码一次就能运行成功的请款,通常都需要不断的调试,最终才能使程序能成功执行,接下来我们就介绍一下与调试相关的功能,重点是 配置调试器
与 如何设置断点
。
调试断点
断点其实就是是 源代码标记
,可以在特定点暂停程序de执行并检查其行为。设置断电后,断点将保留在当前项目中,直到人工手动的显式删除它;断点又分为 行断点
与 异常断点
。
设断点最直接的方式是在编辑器中,在需要设置断点的代码行的左侧边栏执行点击操作;或者按 Ctrl + F8(Mac使用 ⌘ + F8
快捷键) 就设置了行断点,然后会在代码行左侧边栏出现红色的圆点图标。如下图:
查看或编辑断点
主菜单 Run -> View Breakpoints
, 或者按 Ctrl + Shift + F8(Mac使用 ⇧ + ⌘ + F8 快捷键)
,可以查看当前项目所有断点。
PS:断点虽然有多个属性,最常用的也就前两项,所以通常使用默认就可以了。其余属性做为一般了解。
在编辑器内, 右键点击断点图标,可以查看与编辑单个断点的属性。
如果想要使断点失效, 参考上图,将属性 “Enabled” 不选中即可,失效的断点图标是空心红色圆的。
创建行断点
在可执行代码行上设置行断点,在执行该断点以前,线程执行将被挂起,PyCharm 显示该线程堆栈上的堆栈帧。
在编辑器中,点击需要设置断点的代码行左侧边栏或者按 Ctrl + F8(Mac 使用 ⌘ + F8 快捷键)
就设置了行断点。如下图:
如果想移除断点,只需点击断点图标就可以了,移除断点的方法是在 Debugger 中设置的。
除了设置行断点之外,Pycharm 还提供了临时断点的功能。如果按 Ctrl + Alt + Shift + F8 (Mac 使用 ⌥ + ⇧ + ⌘ + F8 快捷键)
就设置了临时断点,临时断点将在命中后从项目中删除,即临时断点只使用一次。也可以通过设置断点属性 “Remove once hit” 创建临时断点。
==PS:临时断点图标与普通断点是一样的,没执行调试前是没办法直接区分的,只是在调试过程中,临时断点被击中后,就自动移除了。==如下图:
创建异常断点
在PyCharm中,其为 Python、Django、Jinja2 和 JavaScript 提供了异常断点。当引发指定的异常时触发异常断点。它们全局应用于异常条件,不需要特定的源代码引用。
主菜单 Run -> View Breakpoints
, 点击 + 按钮, 选择 Python Exception Breakpoint。
在"Select Exception Class"对话框中,指定库或项目中的异常类。
新增加的异常断点会显示在对应分类下,如果想删除,可以点击 — 按钮或者选择要删除断点,点击键盘上的删除按钮。
配置调试器
通常我们在调试前还需要配置调试器,主要包括通用 Debugger 与 Python Debugger:
主菜单: PyCharm/File -> Preference/Settings -> Build, Execution, Delopyment -> Debugger (分别对应 Windows 与 Mac 的操作方式)
, 下面列出各选项的解释,可根据需要进行设置。
主菜单: PyCharm/File -> Preference/Settings -> Build, Execution, Delopyment -> Python Debugger (分别对应 Windows 与 Mac 的操作方式)
,通常使用默认设置即可,不需要更改。除非你的程序使用了PyQt 或者 Gevent
在 Pycharm 里调试程序
前文已经讲了调试程序的准备工作,在设置断点后,然后从选定的运行/调试配置开始,就可以启动一个调试会话了。接下来的主要内容是讲解如何逐步完成程序调试,如何监控调试信息及停止与暂停等相关功能。
调试程序
- 在编辑器中打开所需的 Python 脚本,或在"Project"工具窗口中选择文件。
- 从上下文菜单中选择 “debug 脚本名”。Python 脚本的调试会话将从默认的临时运行/调试配置开始,如果已经配置永久的运行/调试配置为当前脚本,此时菜单显示 “debug 配置名”。
3.调试会话启动后,程序会在击中的第一个断点处挂起,PyCharm会自动打开Debug 工具窗口。会包括Debugger 与 Console 选项卡。
4.在调试过程中, 可以通过工具栏按钮暂停与恢复调试。对应的菜单 暂停: Run -> Debugging Actions -> Pause Program
恢复 Run - Debugging Actions -> Resume Program
PS:如果对断点执行的静音操作(mute breakpoints), 所有断点图标将变为灰色,如下图所示。在此种状态调试程序,相当于没有断点直接运行了程序。如果要恢复断点,再点击一下静音断点的按钮即可。
5.当执行到达断点或手动挂起程序时,可以通过分析栈帧来检查应用程序。所有当前活动的帧都显示在Debugger 工具窗口的"Frames"窗格中。这种场景多用于多线程的情况。(栈帧就是一个函数执行的环境。实际上可以简单理解为:栈帧就是存储在用户栈上的每一次函数调用涉及的相关信息的记录单元。)
分布调试程序
PyCharm 提供了一组步进操作,可以分步调试程序,步进按钮位于调试工具窗口工具栏上。
下面从左到右分别介绍这些按钮的作用:
注意:是分别从左到右依次介绍这些按钮,上图少画了一个,置灰的那个按钮也计算在内了
-
Show Exception point (Art + F10) :点击该按钮,会让代码编辑窗口的光标回到程序运行的地方
-
step over (F8): 单步执行,执行当前代码行,并带你到下一行,即使行中包含方法调用,将跳过方法的实现,不进入方法内部,直接移动到调用方方法的下一行。
-
step into (F7): 单步执行,与step over 不同,如果包含方法调用可跳到当前执行点调用的方法内部当中去。
下面分别演示了step over 与 step into
- step into my code (
Alt + Shift + F7 (Mac 使用 ⌥ + ⇧ + F7 快捷键):
) 调试时,你可能只专注于自己的代码,对于系统模块的方法并不打算进入,此时可点击这个代替step into。看下面的例子logger.xxx都是系统模块logger的方法,而Solver()是自定义类,当点击step into my code 时只会进入自定义类的方法中。
-
force step into: 强制调试器跳到当前执行点中调用的方法。对于调试python 程序,大多数情况下这个按钮是不可用状态,不是很常用。
-
step out (
Mac ⇧ + F8 快捷键
): 单击此按钮可使调试器退出当前方法,并执行其后执行的行返回到上一层。 下面的例子先进入方法内部,然后step out 回到主程序,再点击step out, 直接跳到下一个断点。
- Run to Cursor(Alt + F9
Mac 使用 ⌥ + F9 快捷键:
) 继续执行,直到达到光标所在行的位置停止。在调试过程中,你点击代码中任意一行,然后点击这个按钮,调试器就会直接跳到这行,相当给这行加了一个临时断点。
拓展 - 快捷键冲突如何自定义快捷键
本章节具体介绍如何调试代码,查看调试信息,对于步进工具按钮在讲解过程中为了便于理解,都是直接点击工具栏按钮,但在实际工作中,还是建议使用快捷键,这将有助于提高调试程序的效率。涉及的有些快捷键可能会与自身操作系统快捷键冲突,请打开 PyCharm/File -> Preference/Settings
增加自定义快捷键。