learncpp-3 调试
3 调试
3.1 语法和语义错误
- 不符合C++语法的语句会产生语法错误(例如缺少分号/使用未声明变量/括号不匹配),编译器会捕捉语法错误
- 语法没错但是运行结果不对称为语义错误/逻辑错误(分母为0/使用未初始化变量)
现代编译器可以检测到一些常见的逻辑错误,例如使用一个未初始化的变量。但是大部分逻辑错误编译器无法捕获
3.2 调试过程
- 找到问题根因
- 理解问题
- 决定解决方法
- 修复问题
- 重新测试
3.3 调试策略
- 代码检查
- 运行程序并重现问题
3.4 基本调试手段
- 注释代码
- 验证代码流(在函数开头加上输出语句)
使用
std::cerr
而不是std::cout
,因为cout是会缓存的,cerr是立即输出的
- 输出变量或表达式的值
3.5 更多调试手段
- 使用预处理指令来决定要不要输出调试语句
#include <iostream>
#define ENABLE_DEBUG // comment out to disable debugging
int main()
{
#ifdef ENABLE_DEBUG
std::cerr << "main() called\n";
#endif
int x{ getUserInput() };
std::cout << "You entered: " << x << '\n';
return 0;
}
- 使用
logger
将调试信息输出到日志文件