8.1 Bug 的出现
软件调试是寻找和修复程序中的错误或 bug 的过程。这是软件开发中最有趣和最重要的部分之一,它可以帮助确保程序的正确运行。
"bug" 术语的历史
"bug" 这个术语在计算机程序的上下文中是在 1940 年代首次开始使用的。虽然 "bug" 的概念早在计算机出现之前就存在,用来指代各种设备的机械故障。
第一个与计算机技术相关的 "bug" 的文件记载出现在 1947 年 (!) 哈佛大学 Mark II 计算机团队的工作中。团队发现,因为有飞蛾进入机器,导致一个继电器无法工作。他们移除了昆虫,并在日志中记录为 "首次发现真实昆虫的情况" (literal bug)。
虽然这并不是 "bug" 用来指代错误的首次使用,但这个事件变得著名并推动了 "bug" 术语的普及。
程序调试
调试是寻找、诊断和修复软件 bug 的过程。调试过程包括几个阶段:
- 错误检测: 确定表明程序中存在错误的症状。
- 错误再现: 创建使错误再次出现的条件,以便更好地理解问题的性质。
- 问题诊断: 使用各种工具和方法分析代码并寻找错误的原因。
- 错误修复: 通过修改代码来修复错误。
- 测试: 检查修复情况并测试程序,确保错误得到解决且没有新问题出现。
所以 bug 是程序中任何错误的通用名称,而 debug 是发现和修复这些错误的过程。
8.2 调试工具和方法
日志记录
在程序代码中添加日志可以跟踪其执行过程,并在程序执行的不同点获取关于变量和操作的状态信息。对于 Python 的日志记录,有一个很棒的库——logging
。
日志记录的例子:
import logging
# 为输出调试信息配置日志记录
logging.basicConfig(level=logging.DEBUG)
def divide(a, b):
# 记录除法尝试
logging.debug(f"除以 {a} 分之 {b}")
if b == 0:
# 如果 b 等于 0,记录错误
logging.error("尝试除以零!")
return None
# 如果 b 不等于 0,执行除法
return a / b
result = divide(10, 2)
print(result)
使用调试器 (Debuggers)
调试器是工具,允许开发者逐步执行程序,设置中断点 (breakpoints)
,检查变量的值并在程序执行期间更改它们。
流行的调试器:
- GDB: GNU Debugger 用于 C, C++ 和其他编程语言。
- PDB: 内置的 Python 调试器。
- Visual Studio Debugger: 集成在 Microsoft Visual Studio 中的调试器。
- PyCharm Debugger: 集成在 PyCharm IDE 中的 Python 调试器。
使用 PDB
的例子
import pdb
def faulty_function(a, b):
pdb.set_trace() # 设置中断点
result = a / b
return result
faulty_function(10, 0)
当程序达到 pdb.set_trace()
,它会停止,然后你可以执行调试器命令,如
next
(下一步), print
(输出变量值) 等等。
我们会在接下来的课程中学习如何使用 PyCharm 内置的调试器进行程序调试。
8.3 使用 debug
通常,debug 涉及积极使用调试工具和实践以识别和修复错误。
设置中断点: 在代码中设置中断点,以在你感兴趣的地方停止程序执行。
逐步执行: 逐步执行程序,观察程序状态和变量值的变化。
变量分析: 在程序执行的不同阶段研究变量和表达式的值,以发现错误数据或逻辑错误。
错误修复: 修改代码以修复发现的错误。
重新测试: 错误修复后,对程序进行测试,以确保错误已解决且没有新问题出现。
听起来简单,对吧?在下一堂课中,我们将详细讨论每个阶段 :)
GO TO FULL VERSION