zoukankan      html  css  js  c++  java
  • 嵌入式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语言程序设计现代方法》

      

      

            

  • 相关阅读:
    【学习笔记】2020寒假数据结构集训总结
    ThreadPoolExecutor源码分析
    Java并发专题(三)深入理解volatile关键字
    内部类与静态内部类
    Java并发专题(二)线程安全
    Java并发专题(一)认识线程
    Redis部署
    MySQL部署
    JDK部署
    SpringBoot+solr
  • 原文地址:https://www.cnblogs.com/gongxing/p/6170111.html
Copyright © 2011-2022 走看看