C++的调试技�?

目录

  1. 1. 调试标记
    1. 1.1. 通过预处理器调试标记
    2. 1.2. 运行期调试标�?
  2. 2. C语言assert()�?

在开发C++程序的过程中,当遇到需要调试程序的场景,优秀的调试器例如GDB等可以使调试的过程变得更有效率,使程序的运行更加透明,但总有不能使用调试器的场景例如嵌入式开发不存在显示屏等情况,这时可以利用一些调试技巧对程序进行调试

调试标记

当进行程序开发时,可能会在源程序中添加一些调试的代码方便测试,但是后来程序完成的时候需要找到这些代码一一进行删除,在程序运行的过程中可能有会发现需要这些代码。这些麻烦可以利用调试标记解决�?

通过预处理器调试标记

可以利用预处理器标记来分离出用于调试的代码和确保程序正常工作的代码,通过预处理器定义#define FOOBAR(一般用DEBUG,但不能用NDEBUG)和ifdef ifndef 等预处理语句可以实现这个目的,当认为调试完成了,可以利用undef来表示调试已经完成,例如如下的代码片段�?

#define DEBUG 
#undef DEBUG
//***
#ifdef DEBUG
//***
#endif

运行期调试标�?

某些情况下,运行期打开调试标记会更加方便(例如每次定义预处理标记都会导致程序的重新编译),为了实现打开或关闭调试,可以定义一个bool型数据变�?```c++
//****
bool debug = false;

int main(int argc, char* argv[]){
if(string(argv[i])== “–debug=on”) debug = true;
//****
}


## 将变量和表达式表示为字符�?
若在编写程序的时候可以将字符串和变量名与其内容一一用输出打印函数组成打印表达式,但这样的话工作量非常的大,可以通过宏定义和字符串化运算�?*#* 来将变量转化为一个字符数组。在预处理语句中的参数前使用#来标记就可以实现这个功能�?```c++
#define PR(x) cout << #x << " = " << endl;

它与如下语句具有同样的效果:

cout << "a = " << a  << endl;

在实际使用的时候也可以使用ifdef来使得P(A) 不起作用

C语言assert()�?

头文件<cassert>中,有assert()方便的调试宏。当使用assert时,参数为一个表示为真的表达式,预处理器产生测试断言的代码,若测试结果不为真,则发生一个错误信息,返回错误信息并终止程序运行�?

#include <cassert>
using namespace std;

int main(){
int i=100;
assert(i!=100);//fails
}

在完成调试后,可以通过编译器参数命令行或者在#include<cassert> 前定�?#define NDEBUG 来消除宏产生的测试代码�?