9.1 Bug的出现
软件调试是寻找和修复程序中错误或bug的过程。这是软件开发中最有趣的部分之一,有助于确保程序的正确运行。
"bug"一词的起源
"bug"(错误)一词在计算机程序的上下文中首次使用是在20世纪40年代。虽然"bug"这一概念在计算机出现之前就存在,用于指代各种设备中的机械故障。
第一个记录在案的在计算机技术中使用"bug"一词的案例是在1947年(!)哈佛大学Mark II计算机的团队中。团队发现一台机器的继电器因为一只飞蛾而不能工作。他们移除了昆虫,并将此记录在日志中作为"第一个真实的昆虫发现案例"(literal bug)。
虽然这不是首次将"bug"用于指代错误,但这一事件是众所周知的,有助于普及"bug"这个术语。
程序调试
调试是查找、诊断和修复软件中的bug的过程。调试过程包括几个阶段:
- 发现错误:确定程序中存在错误的症状。
- 重现错误:创建条件以便错误再次出现,以便更好地理解错误的性质。
- 诊断问题:使用各种工具和方法分析代码并查找错误原因。
- 修复错误:修改代码以消除错误。
- 测试:验证修复并测试程序,以确认错误已解决且没有新问题出现。
所以bug是程序中任何错误的总称,而debug(调试)是发现和消除这些错误的过程。
9.2 调试工具和方法
日志记录
在程序代码中添加日志可以跟踪其执行情况,并在程序的不同执行点获取变量和操作的状态信息。对于JavaScript的日志记录,有个很棒的库——winston。
日志记录实例:
const { createLogger, format, transports } = require('winston');
// 创建一个调试级别的logger
const logger = createLogger({ level: 'debug' });
// 除法函数
function divide(a, b) {
logger.debug(`将 ${a} 除以 ${b}`);
if (b === 0) {
logger.error("尝试除以零!");
return null;
}
return a / b;
}
// 使用函数示例
const result = divide(10, 2);
console.log(result); // 输出: 5
使用调试器 (Debuggers)
调试器是允许开发者逐步执行程序、设置断点、检查和更改程序执行期间变量值的工具。
JavaScript的热门调试器:
- Chrome DevTools:集成在Google Chrome浏览器的调试器
- Firefox Developer Tools:集成在Mozilla Firefox浏览器的调试器
- Node.js Debugger:Node.js中用于服务端JavaScript的调试器
- Visual Studio Code Debugger:集成在Visual Studio Code编辑器中的调试器
在Node.js中使用调试器的实例:
// 导入内置调试模块
const { inspect } = require('util');
// 带有错误的函数示例
function faultyFunction(a, b) {
debugger; // 设置断点
let result = a / b;
return result;
}
// 调用带有错误的函数
console.log(faultyFunction(10, 0));
当程序达到debugger,它会停止,你可以使用调试器的命令,如向前一步(step over)、进入内部(step into)、退出(step out)、检查变量值等。
我们会在Intellij IDEA中学习程序调试(需要Ultimate Edition版本)。
9.3 使用debug
一般来说,debug包括积极使用调试工具和方法来识别和解决错误。
调试步骤:
- 设置断点:在代码中设置断点,以在你感兴趣的地方停止程序执行。
- 逐步执行:逐步执行程序,观察程序状态和变量值的变化。
- 分析变量:研究程序执行各阶段的变量和值,以发现不正确的数据或逻辑错误。
- 修复错误:修改代码以解决发现的错误。
- 重复测试:修复错误后测试程序,以确保错误已解决且没有新问题出现。
看起来很简单,对吧?接下来的一节课中,我们会详细探讨每个步骤 :)
GO TO FULL VERSION