Skip to content

Latest commit

 

History

History
63 lines (38 loc) · 4.03 KB

3.2 调试流程.md

File metadata and controls

63 lines (38 loc) · 4.03 KB

调试流程

比如说你写了一个程序,但是它不能正常工作 -- 代码能正常编译,但是当你运行它的时候,却得到了一个不正确的结果。你一定是在某个地方出现了语义错误。如何才能找到它呢?如果你一直在遵循最佳实践,写一点代码,然后进行测试,你可能已经知道你的错误在哪里了。或者呃逆可能完全没有头绪。

所有的bug都源自于一个简单的前提:一些你认为正确的东西,并不正确。实际上要找出这个错误在哪里是很有挑战性的。在本节中,我们将概述调试程序的一般流程。

因为我们还没有涉及到那么多的C++主题,所以我们这一节的示例程序会非常基础。这可能会使我们在这里展示的一些技术显得过度。但是,请记住,这些技术是为了用于大型的、更复杂的程序而设计的,在这样的环境中(这也是你最需要它们的地方)会有更大的用处。

调试的一般步骤

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

  1. 找出问题的根本原因(通常是哪行代码无法工作)
  2. 确保你了解问题发生的原因
  3. 确定你将如何解决这个问题
  4. 修复问题
  5. 重写测试确保问题已经被解决,没有出现新的问题

我们在这里用一个现实生活中的比喻。比如说,有一天晚上,你去冰箱里面的制冰机取冰。你把被子放到饮冰机下面,按了一下,然后....什么也没出来。呃,你发现了毛病,你会怎么做?你可能会开始调查,看看能否找出问题的根本原因。

找出根本原因:既然你听到了制冰机送冰的声音,很可能不是送冰装置本身的问题。于是你打开冰柜,检查冰盘。没有冰块。这就是问题的根本原因吗?不,这只是症状。经过进一步的检查,你确定制冰机似乎没有制冰。是制冰机的问题还是其他原因?冰箱仍然是冰的,水管也没有阻塞,其他一起似乎都在工作,所以你断定根本原因是制冰机不工作。

了解问题:在这个案例中,问题很简单,坏掉的制冰机不制冰

确定修复方案 :在这一点上,你有几个选择来解决这个问题。你可以解决这个问题(从商店买冰袋)。你可以尝试进一步诊断制冰机,看看是否有可以维修的部件。你可以买一个新的制冰机,然后把它安装在现有的位置。或者你可以买个新的冰箱。

修复问题:一旦制冰机到了,你就把它安装好

重新测试: 重新接通电源并等待一夜后,你的新制冰机开始制冰,没有发现新的问题。

现在让我们把这个过程应用到上一节课的程序中

#include <iostream>

// 将两个数字相加
int add(int x, int y)
{
  return x - y;  // 应该相加,却执行了减法
}

int main()
{
  std::cout << add(5, 3) << '\n';   // 应该得到8,结果得到2
  return 0;
}

这段代码有一点很好:错误非常明显,因为错误的答案会通过输出语句打印到屏幕上面。这位我们的调查提供了一个起点。

找到根本原因: 在第11行,我们可以看到我们正在传递参数的字面量(5和3),所以那里没有出错的余地。由于函数add的输入是正确的,但是输出不是。很明显,函数add一定是产生了错误的值。函数add中唯一的语句是返回语句,这一定是罪魁祸首。我们已经找到了问题,现在我们知道了我们的关注点在那里,注意到我们在做减法而不是加法。

理解问题:在这种情况下,很明显为什么会产生错误的值 -- 我们使用了错误的操作符

确定修复方案:我们只需要将operator - 改成 operator +。

修复问题:将operator- 改成 operator+,重新编译程序。

重新测试:在实施改变后,重写运行程序,我们得到了正确的结果8。对于这个简单的程序来说,这就是所有需要的测试。

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