函数与调试

正常程序的调试使用gdb。但有时也会在程序中通过使用printf(),打印关键信息进行bug定位及调试。接下来通过实践不断优化改善:

1,通过在程序中直接使用printf()函数进行开发调试。但在开发调试测试结束后,必须删除相应的调试打印函数(printf)。因为过多的打印函数存在会影响效率,所以上线时会删掉调试打印函数。但这样就导致了生成程序出现bug需测试环境调试定位时,又得重新书写printf进行打印调试。


2,通过使用DEBUG来控制printf函数的调用使用如下:

voidtest(void){/*dosomething*/#ifdefDEBUGprintf("TetsDebug\n");#endif/*dosomething*/}

若想打印出printf信息,只要在编译时加入DEBUG选项即可。使用如下:gcc -DDEBUG main.c

此时虽然在DEBUG是已经满足要求,需要调试时才会执行。更不会影响生产线的执行效率。但过多的#ifdef和#endif嵌套会影响代码风格,且会影响可读性。故有了下一版本。


3,使用宏处理。

定义个DEBUG_WRITE宏,在调试状态时指向write_debug函数;非调试状态DEBUG_WRITE定义变成了(void)。

使用stderr而不是stdout的原因是:stderr不存在缓存。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stdarg.h>#ifdefDEBUG#defineWRITE_DEBUG(arg)write_debugarg#else#defineWRITE_DEBUG(arg)#endif/***@briefdebug日志信息打印函数**@paramfmt*/voidwrite_debug(char*fmt,...){va_listvl;va_start(vl,fmt);vfprintf(stderr,fmt,vl);va_end(vl);}intmain(intargc,char*argv[]){intnum=10;char*str="szyu";/*使用时里面的括号不能省略*/WRITE_DEBUG(("num...%d,str...%s\n",num,str));return0;}

较之前版本,风格统一且不影响可读性。


本文参考自《征服C指针》