章节目录

程序调试过程

本节阅读量:

假设编写了一个不能正常工作的程序。代码编译通过,但运行时,得不到正确的结果。如何找到有语义错误的地方?如果您一直在通过编写一点代码然后测试它,遵循最佳实践,那么您可能会很清楚错误在哪里,或者根本不知道。

所有的错误都源于一个简单的前提:你认为正确的东西,实际存在问题。实际上,找出错误在哪里是具有挑战性的。本节课,将概述调试程序的一般过程。

由于还未涵盖那么多C++主题,本节中的示例程序将非常基础。这会导致这里展示的一些技术超出目前的需求。然而,这些技术旨在与更大、更复杂的程序一起使用,并且在那些场景中更有用(这是最需要它的地方)。


调试的一般方法

一旦发现问题,调试问题通常包括五个步骤:

  1. 定位问题根因,通常是精确到有问题的代码行
  2. 理解为什么问题会出现
  3. 问题修复的方案
  4. 修复造成问题的代码
  5. 测试程序,确保问题修复完成,且没有引入新问题

使用上一课简单程序作示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <iostream>

int add(int x, int y) // 函数期望是执行加法
{
    return x - y; // 但实际却执行了减法
}

int main()
{
    std::cout << "5 + 3 = " << add(5, 3) << '\n'; // 结果应该是8,但实际却是2

    return 0;
}

这段代码有一点很好:错误非常明显,因为错误的答案通过第10行打印到屏幕上。为调试提供了一个起点。

根因:在第10行,传递参数(5和3)的文本,因此那里没有错误。由于函数add的输入正确,输出错误,很明显,函数add产生错误的值。函数add中唯一的语句是return语句,它就是罪魁祸首。找到问题所在。代码在做减法而不是加法,通过检查能快速发现。

理解问题:这种情况下,为什么生成了错误的值?很明显,因为使用了错误的操作符。

确定修复:将操作符-更改为操作符+。并确保程序重新编译。

重新测试:实现更改后,重新运行,产生正确的值8。对于简单的程序,这就是所需的所有测试。

这个例子很小,但说明了诊断任何程序时要经历的基本过程。


3.0 语法和语义错误

上一节

3.2 调试策略

下一节