3.x - 小结与测试 - 代码调试

3.1 - 语法和语义错误

  • 如果你的语句不符合 C++ 的语法,则会产生语法错误。编译器或捕获语法错误。
  • 当语句的语法正确,但是其行为并不符合程序员的本意,此时称为语义错误

3.2 - 代码调试步骤

  • 定位并修复程序错误的过程,称为debugging。
  • 可以使用五步法来定位并修复程序错误:
    1. 定位根因;
    2. 理解问题;
    3. 确定修复方式;
    4. 修复问题;
    5. 重新测试

debug过程中最困难的部分就是找到问题所在。

静态分析工具可以用来对代码进行分析,查找可能导致问题的语义错误。

debug过程中,最重要的一步就是要能够稳定地复现问题。

以下方法可以帮助我们定位问题:

  • 注释掉代码;
  • 使用输出语句来验证代码流程;
  • 打印值。

当使用打印语句时,推荐使用 std::cerr 来代替 std::cout,不过最好避免依赖打印语句来定位问题。

日志文件记录了程序中的各个事件。将信息写入日志文件的过程,称为写日志(logging)。

在保证代码行为不变的前提下,修改代码结构,称为重构。重构经常被用来修改代码使其更加有条理、模块化或者使其性能更好。

单元测试是一种软件测试方法,它对一个个单元的源码进行测试来判断软件代码是否正确。

防御式编程思想要求程序员预测软件可能遭遇的的各种误用。这些误用通常是可以被检测和预防的。

对程序运行进行追踪的各项信息(变量的值、被调用的函数、当前执行点)都是程序状态的第一部分。

3.6 - 使用集成调试器之单步调试
3.7 - 使用集成调试器之运行和断点
3.8 - 使用集成调试器之监控变量
3.9 - 使用集成调试器之调用栈

调试器(debugger)可以帮助程序员控制程序的运以及在程序运行时查看程序状态。集成调试器指的是哪些集成在代码编辑器中的调试器。 - 单步调试是调试器的一个功能,使用它可以逐语句地对程序进行调试; - 单步进入程序时,程序会运行下一个条语句然后停止。如果该语句中包含函数调用,单步进入(step into)可以跳转到该函数的顶部; - 单步跳过会执行下一条语句,然后停止执行。如果该语句包含函数调用,则单步跳过会执行该函数并将控制权交还给你; - 单步跳出会执行函数中剩下的语句然后在函数返回后将控制权交给你; - 运行到光标出会持续执行代码直到到达你鼠标所选处; - 继续执行,会持续执行程序代码直到遇到下一个断点; - 启动执行和继续执行类似,不过它会从程序的开始处进行执行; - 断点是标记调试器应该停止执行程序的位置; - 监视变量允许我们在程序运行的过程中,查看变量的值。监视窗口中可以看到被监视的变量和表达式; - 调用栈是一个包含了当前活动函数的列表。调用栈窗口中会显示程序的调用栈。