嵌入式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語言程序設計現代方法》

  

  

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM