前面的文章简单的提及过debug宏,但没进行详细的分析。首先,debug宏是用于程序调试的宏,一般而言,程序调试的方法有许多,利用调试器进行的常见调试方案有单步调试、裸机LED调试、log文件信息等。
单步调试是指利用调试器(IDE或JLINK等工具)适用于初步学习单片机的新手,好处是直观,坏处是限制大,调试速度慢。
裸机LED调试,利用LED或者蜂鸣器硬件进行调试,好处不怎么受硬件限制,适用于裸机、单片机,坏处是信息显示不直观。
printf打印调试,是一种程序开发很常用的调试方式,但因为在单片机中由于一般未对printf进行移植,所以用不了,串口通信未实现时也用不了。
log文件,也就是日志文件,是系统在运行时进行的记录,并在文件中可见相应信息,以便日后追查,适用于系统级调试与大型程序调试。
调试信息不能太多也不能太少,太少找不到问题,太多淹没有用的信息。
debug版本,包含了调试信息输出的版本,会打印出调试的信息或log文件用于调试,坏处是调试信息占用系统,运行效率低。
release版本,正式版,去除了调试信息,是正式发布的版本效率高于debug版本。
二者的代码相同,只有条件编译上不同。
#ifdef BEBUG
#define def() printf();
#else
#define def()
#endif
在宏定义中__xxx__是预定义宏,该功能是c语言自带的。例如:
__FILE__ 代表文件
__FUNCTION__ 代表函数
__LINE__ 代表行
实际的使用方式为:
#define __DEBUG__
#ifdef __DEBUG__
#define DBG(...) fprintf(stderr,"DBG(%s,%s(),%d):"__FILE__,\
__FUNCTION__,__LINE__);fprintf(stderr,__VA_ARGS__);
#else
#define DEBUG(...)
#endif
在函数中调用DBG(),DBG("tiao shi\n"); =>DBU(xxx.c,main(),14:tiao shi)。内容为文件名,所在函数名,行号,调试信息
其中__VA__ARGS__用于在宏中替换中,表示可变参列表。
#define LOG(...) PRINTF(__VA_ARGS__)
...
LOG("score is %d\n",96); =>score is 96