嵌入式C语言代码的调试技巧

  在项目开发的过程中,不可避免的会遇到调试代码的情况。

  刚开始写代码时,我们想看具体执行到哪儿时,往往这么写:

    printf("***** Code is here! ***** ");

  随着调试信息的不断增多,我们项目中的printf()函数到处都是,因此,当调试完成时,发现需要注释掉所有的调试代码将非常痛苦。于是,我们通过宏定义对代码进行了这样的改造:

    首先,定义调试宏:

    #define  _DEBUG_IS_MY

    然后,在需要添加调试代码的地方,添加以下代码:

    #ifdef  _DEBUG_IS_MY

      printf("***** Code is here! ***** ");

    #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" ",__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下的回车换行符为“ ”。

2、用到了预定义宏,这些宏提供了当前编译和编译器本身的信息。

  __LINE__:在源代码中插入当前源代码行号;

  __FILE__:在源文件中插入当前源文件名;

  以上两个宏,还可以用作错误检测。例如被零除的问题。

  #define  CHECK_ZERO(divisor)  

    if (0 == divisor)  

      printf("attemp to divide by 0 on line %d of file %s *** ", __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语言程序设计现代方法》

  

  

        

原文地址:https://www.cnblogs.com/gongxing/p/6170111.html