拼贴齿轮、机械臂、手机象形图的插图

发布日期:2024 年 9 月 16 日
撰稿人:Camilo Quiroz-Vazquez

什么是调试?

调试是指查找、隔离并解决软件程序中被称为“bug”的编码错误的流程。调试有助于找出编码错误的原因,防止软件功能出现问题,并提高软件的整体性能。

逻辑错误、运行时错误、语法错误和语义错误等编码错误会导致软件崩溃、不正确或不准确的输出、安全漏洞和数据丢失。软件测试使开发人员能够调查这些错误对程序源代码的影响,调试则与其不同,旨在寻求这些错误的根本原因和修复措施。

通过调试流程,软件开发人员可进行根本原因分析,从而确保在计算机程序中发现的错误得到修复且不再出现。错误可能会对软件稳定性、可靠性和用户体验产生负面影响。调试工具和策略有助于优化调试流程。

调试过程

调试通常涉及六个步骤:

- 重现条件
- 查找 bug
- 确定根本原因
- 修复 bug
- 测试以验证修复是否有效
- 记录流程

步骤 1:重现条件

调试过程要求具体;工程师不能依靠问题的二手描述来准确诊断问题。因此,调试过程的第一步就是重现导致 bug 出现的条件。重现 bug 可以让程序员和工程师第一时间观察到错误,并为调试过程的其余部分收集上下文数据。

第 2 步:找出 bug

下一步是通过彻底检查代码和查看所有可用日志,尽可能准确地找出 bug 来源。在此步骤中,开发人员通常依靠调试工具来更轻松地搜索大量代码,而不是手动工作。

第 3 步:确定根本原因

开发人员通过检查代码的逻辑和流程,以及代码的不同组件在出现 bug 的特定条件下是如何交互的,来确定导致 bug 的原因。

第 4 步:修复 bug

此步骤通常包括故障排除和修改代码以纠正问题,以及重新编译和重新运行软件以确保 bug 已修复。此类修订可能涉及多次迭代,因为首次尝试可能会失败或无意中引入新的 bug。

大多数开发人员使用版本控制系统来跟踪更改,这样他们就可以轻松回滚任何未能解决问题或引入了新问题的修改。

第 5 步:测试以验证修复情况

错误修复后所运行的测试包括:

  • 单元测试,用于测试为修复 bug 而修改的各个代码段
  • 集成测试,用于测试包含已修复 bug 的整个模块
  • 系统测试,用于测试运行更改后模块的整个系统
  • 回归测试,用于确保修复的代码不会影响应用程序性能,也就是说,应用程序没有因为 bug 修复而退化。

第 6 步:记录流程

最后一步,开发人员记录修复过程的详细信息,包括导致 bug 的原因、修复方式以及任何其他相关信息。对于程序员来说,文档记录是一个宝贵的工具,在将来出现类似 bug 时可以借鉴。

调试示例

了解系统面临的 bug 类型使软件工程师和开发人员能够在出现错误时找到适当的方法来修复损坏的代码。需要调试的常见错误示例包括:

语义错误

违反编码语言规则的代码会导致语义错误。与产生错误输出的逻辑错误不同,语义错误不会产生有意义的输出。

语法错误

当开发人员错过某一代码元素(例如,括号、逗号或其他印刷错误)时,便会出现此错误。与人类书面语言(一个存在印刷错误的句子可能仍可读懂)不同,缺少代码片段会立即导致错误。

逻辑错误

此类错误包括学术上正确但方向不正确的语法,从而会导致意外输出。由于该语法正确,这些错误可能很难被检测到。当系统并未立即崩溃时,查找错误代码的实际位置可能十分耗时。

运行时错误

此类错误在应用程序运行或启动时发生。运行时错误偶尔可以通过刷新、重启或重新安装应用程序来修复。其他时候,它们可能是程序需要更多内存或其他类型错误(如逻辑错误)的信号。

调试类型

调试过程具有挑战性,需要大量人力。了解调试过程的各种方法可以更有效地管理任务。

回溯

通过这种方法,开发人员从检测到错误的点开始逆向工作以找到 bug 的根源。具体来说,他们会用有问题的源代码回溯程序所采取的步骤,以查看哪里出了问题。与调试器一起使用时,回溯会非常有效。

原因排除

基于假设的调试技术“原因排除法”要求团队推测错误的原因,并单独测试每种可能性。当团队熟悉代码和 bug 周围的情况时,此方法效果最佳。

各个击破

在调试大型代码库时,团队可以将代码行分成几段(函数、模块、类方法或其他可测试的逻辑部分),然后分别测试每个部分以找出错误。确定问题段后,可以对其进行进一步划分和测试,直到确定 bug 的来源。

打印和日志调试

打印和日志调试策略包括在代码中添加打印语句或“日志”以显示变量的值,调用堆栈,执行流程和其他相关信息。这种方法对于调试并发或分布式系统特别有用,因为在这些系统中,执行顺序会影响程序的行为。

橡皮鸭调试

在这种方法中,开发人员会向任何无生命的对象逐行“解释或讲述”代码。其理念是,通过大声解释代码,开发人员可以更好地理解其逻辑(或发现缺乏逻辑)并更容易发现 bug。

自动调试

自动调试依赖分析、人工智能 (AI)机器学习算法自动执行调试过程的一个或多个步骤。AI 驱动的调试工具可以更快地搜索大量代码集,以识别错误或缩小代码范围,然后由开发人员进行更彻底的检查。

自动化系统可以复制代码行并自动进行测试,以验证系统是否按预期运行。自动化在持续集成 (CI)持续交付 (CD) 中都起着重要作用,这两种方法可以加速新代码的测试和部署。

蛮力调试

蛮力调试通常在其他方法失败时部署,需要逐行检查整个代码库以确定问题的根源。当执行调试的工程师或程序员不熟悉代码库时,这种耗时的方法也可用于调试小程序。

 

调试工具

调试器是高级工具和 API,它们通过查找操作系统或应用程序开发过程中的编码错误来优化软件开发。调试器代表着一个庞大且不断增长的业务。随着计算机、移动应用程序和程序领域的不断扩展,全球调试器市场预计到本十年末将大幅增长,这一点不足为奇1

很多企业正投入数百万美元来开发复杂的调试工具(比如可以调试代码的 AI 聊天机器人2,而大学的研究人员正在创建可以自主调试视频游戏3以及调试特定领域编程语言4的工具。

工具和技术的功能可能有很大差异,但本质上,它们都提供帮助组织查找和修复 bug 的命令行界面。大多数软件还提供远程调试功能和教程,让初学者更容易上手。

调试工具的示例包括:

集成开发环境 (IDE)
 

IDE 为计算机程序员提供了全面的软件开发功能。许多 IDE(例如 Visual Studio、Eclipse 和 PyCharm)都具有“调试模式”。这些内置的调试工具使开发人员能够逐行运行代码(分步调试)、在指定点停止程序执行(断点)以及在任何时间点检查变量和内存的状态等。

IDE 还可以作为开源插件使用,兼容多种编程语言,例如 Java、Python、JavaScript 和 TypeScript 以及 PHP 等脚本语言。

独立调试器

独立调试器(例如 GNU Debugger (GDB))提供高级调试功能,包括条件断点和观察点。它们还有助于反向调试,即程序员反向运行程序。它们往往比 IDE 或其他开发人员工具内置的调试器更强大、功能更丰富,但用户的学习曲线也更陡峭,需要更多技术专业知识。

记录实用程序

这些工具提供了在代码的各个点记录程序状态的方法。然后可以分析日志以发现异常或有问题的模式。日志记录对于解决生产环境中发生的 bug 很有用,因为在生产环境中,交互式调试可能不可行。

静态代码分析器

静态代码分析工具无需运行代码即可进行分析,寻找潜在错误并修复 bug 和偏离编码标准的情况。这些工具并不像解释器和编译器那样关注语法,而是分析源代码的语义,帮助开发人员检测常见的编程错误并强制执行一致的编码风格。

动态分析工具

动态分析工具本质上与静态代码分析器相反,它是在软件运行时对其进行监控,以检测资源泄漏或并发问题等问题。此工具可帮助开发团队捕获静态分析可能遗漏的 bug,例如内存泄漏或缓冲区溢出。

性能分析器

性能剖析器可帮助开发人员找出代码中的性能瓶颈。此类系统可以测量 CPU 使用率、内存使用率和 IO 操作,帮助找出缓慢和低效的操作。

调试与测试

测试和调试是新代码开发中的互补过程。虽然结果不同,但测试和调试都是为了生成无差错的代码。

测试使软件开发人员能够了解出现 bug 时系统会发生什么。这些测试可帮助开发人员了解系统何时发生故障,以及该故障可能对软件产生的影响。自动化测试使开发人员能够对新代码进行持续测试,以深入了解各种场景。测试是软件开发的关键部分,但它不能解释错误发生的原因。

开发人员使用调试策略和工具来查找错误的根本原因、修复错误并记录下来以防止错误再次发生。当一起使用时,调试和测试可帮助团队构建一种简化的方法来开发代码和创建更好的软件产品。

相关解决方案
IBM Instana Observability

Instana Observability 平台可为您的所有团队提供实时性能数据,包括所有上下文。自动化全栈可见性、1 秒粒度和 3 秒通知功能,可快速识别问题,达到预防和修复问题的目的。

深入了解 IBM Instana Observability 请求 IBM Instana 演示
IBM Turbonomic

可以利用 IBM Turbonomic 混合云成本优化平台,持续实时地自动执行关键操作,从而主动为堆栈每一层的应用程序提供最有效的计算、存储和网络资源。

探索 IBM Turbonomic 免费试用 IBM Turbonomic
IBM Cloud Pak for AIOps

使用 AI 驱动的工具了解整个 IT 环境中的数据和依赖关系,帮助解决事件管理和修复问题。

深入了解 IBM Cloud Pak for AIOPs 体验自助式导览
采取后续步骤

IBM Debug for z/OS 为使用 COBOL、PL/I、C/C++ 和汇编程序编写的 z/OS 应用程序提供调试和代码覆盖功能。

IBM Debug for z/OS
脚注

1“全球软件调试市场分析 [2023-2030]”,Benzinga,2022 年 9 月 5 日
2“Google 的 Bard AI 聊天机器人已可生成并调试代码”,TechCrunch+,2023 年 4 月 12 日
3“自主调试视频游戏”。南加州大学维特比工程学院,2023 年 4 月 5 日
4“从编程语言中消除错误的一种更简方法”,MIT News,2023 年 4 月 7 日