嵌入式C语言代码的调试技巧
在项目开发的过程中,不可避免的会遇到调试代码的情况。
刚开始写代码时,我们想看具体执行到哪儿时,往往这么写:
printf("***** Code is here! *****\n");
随着调试信息的不断增多,我们项目中的printf()函数到处都是,因此,当调试完成时,发现需要注释掉所有的调试代码将非常痛苦。于是,我们通过宏定义对代码进行了这样的改造:
首先,定义调试宏:
#define _DEBUG_IS_MY
然后,在需要添加调试代码的地方,添加以下代码:
#ifdef _DEBUG_IS_MY
printf("***** Code is here! *****\r\n");
#endif
这样,似乎解决了问题,但这会使项目代码显得很臃肿,并且太多重复代码(#ifdef _DEBUG_IS_MY ……#endif),这是程序员不能容忍的。
因此,参考很多底层代码和网络资料,看到确实已经有很优秀和成熟的写法:
/*
* 自定义调试宏。
* 1.快速切换debug版本和relese版本工程
* 2.简化打印调试语句的编写,提高开发调试效率
*/
#define _MY_DEBUG_ 1
#ifdef _MY_DEBUG_
#define MY_DEBUG_PRINT_INFO(...) printf(__VA_ARGS__)
#define MY_DEBUG_PRINT_VAR(X, ...) printf("file: "__FILE__", Line: %d:"X"\r\n",__LINE__,##__VA_ARGS__)
#else
#define MY_DEBUG_PRINT_INFO(...)
#define MY_DEBUG_PRINT_VAR(X, ...)
#endif
在程序中需要添加调试代码处,直接调用:
MY_DEBUG_PRINT_INFO("code is here!");
或
MY_DEBUG_PRINT_VAR("code is here!");
或
MY_DEBUG_PRINT_VAR("recev_flag = %d .", recev_flag);
即可实现调试信息正常输出,如下图所示:
注意:
1、windows下的回车换行符为“\r\n”。
2、用到了预定义宏,这些宏提供了当前编译和编译器本身的信息。
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
以上两个宏,还可以用作错误检测。例如被零除的问题。
#define CHECK_ZERO(divisor) \
if (0 == divisor) \
printf("attemp to divide by 0 on line %d of file %s ***\r\n", __LINE__, __FILE__);
CHECK_ZERO宏应该在除法运算前被调用。
CHECK_ZERO(j);
k = i / j;
如果 j为0,会打印出以上提示语。
参考以下博客:
1、http://www.360doc.com/content/14/0703/10/7324690_391662898.shtml
2、http://blog.csdn.net/aobai219/article/details/6092292
3、http://blog.csdn.net/cp1300/article/details/7773239
4、《C语言程序设计现代方法》