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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式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语言程序设计现代方法》

  

  

        

 












以上是关于嵌入式C语言代码的调试技巧的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式开发中常见3个的C语言技巧

C语言VS2017 - 实用调试技巧

C语言学习笔记实用的调试技巧

浅析嵌入式C优化技巧

C语言调试小技巧

VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码