Learn C++学习笔记:第三章—调试(一)

3.1 语义和语法错误

一般程序的bug分为语法错误语义错误(逻辑错误)两种,c++里面语法错误比如少一个分号,使用未定义的变量等,但是这类错误比较容易被编译器发现,而逻辑错误有可能编译通过但是运行出错误的结果。

所以需要调试,去发现改进语义错误。

3.2 调试的过程

解决问题的一般思路:

找出根本原因
理解问题
确定解决方案
修复问题
重新测试

3.3-3.5 调试策略

找到问题的第一步也是最重要的一步是能够重现问题。原因很简单:除非您能够发现问题,否则很难找到问题。
调整策略总结如下:

  1. 注释掉认为不是主要问题的代码
  2. 验证代码流
    在更复杂的程序中常见的另一个问题是程序调用函数太多或太少次(包括根本不调用)。 在这种情况下,将语句放在函数顶部以打印函数名称会很有帮助。这样,当程序运行时,您可以看到调用哪些函数。

Tips
打印信息以进行调试时,请使用std :: cerr而不是std :: cout。这样做的一个原因是std :: cout可能被缓冲,这意味着当你要求std :: cout输出信息和实际输出信息之间可能会有一个暂停。如果你使用std :: cout输出然后你的程序立即崩溃,std :: cout可能或者可能没有实际输出。这可能会误解您的问题所在。另一方面,std :: cerr是无缓冲的,这意味着你发送给它的任何东西都会立即输出。这有助于确保尽快显示所有调试输出(以某些性能为代价,我们通常在调试时不关心)。

比如可以通过这种输出方式调试

#include <iostream>

int getValue()
{
std::cerr << "getValue() called\n";
   return 4;
}

int main()
{
std::cerr << "main() called\n";
   std::cout << getValue;

   return 0;
}

调试语句不缩放,方便后面找到它们

只有python的语法才会严格要求缩进,其他语言大部分都是通过大括号之类的进行区分

  1. 打印值
    主要输出变量(包括参数)或表达式的值,以确保它们是正确的。
int add(int x, int y)
{
std::cerr << "add() called (x=" << x <<", y=" << y << ")" << '\n';
   return x + y;
}

使用输出进行调试虽然简单直接,但是并不是很好的方式,因为会导致代码输出混乱和,还要删除代码,调试代码不可复用,增加工作量并且易出错

  1. 使用条件编译
    举例如下:
#include <iostream>
#define ENABLE_DEBUG // comment out to disable debugging
 
int getUserInput()
{
#ifdef ENABLE_DEBUG
std::cerr << "getUserInput() called\n";
#endif
	std::cout << "Enter a number: ";
	int x;
	std::cin >> x;
	return x;
}
 
int main()
{
#ifdef ENABLE_DEBUG
std::cerr << "main() called\n";
#endif
    int x = getUserInput();
    std::cout << "You entered: " << x;
 
    return 0;
}

如果把定义包含进头文件里面,就可以更方便的扩展,但是还是会造成代码混乱。

  1. 使用日志记录
    略,待补充

以上调试方法都是假定程序必须从头执行到尾,以上方法都需要改动代码。接下来介绍使用IDE进行调试的技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值