<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          printf 宏 調(diào)試技巧

          共 2690字,需瀏覽 6分鐘

           ·

          2020-11-26 09:16

          5a069adb3c8ac6aa56bdce22a584d9f7.webp


          關(guān)于調(diào)試printf、printk相關(guān)的文章


          C語言 printf詳解

          BUG_ON()、panic()、dump_stack()幾種內(nèi)核調(diào)試手段



          1.
          前言printf調(diào)試是嵌入式調(diào)試的基本手段,而且是非常重要的手段,我認(rèn)為相比單步調(diào)試更加有用有效,特別是單片機之后跑系統(tǒng),單步調(diào)試效率更加低下了,我們在工作遇到bug的時候,我們第一時間就想知道那些該死的日志有沒有保存下來,這樣好讓我們程序員裝逼一波把問題解決。
          printf宏定義調(diào)試非常重要,有些日志在開發(fā)的時候才需要打開,發(fā)布的時候需要關(guān)閉,但是在代碼上又需要保留下次調(diào)試,所以我們在調(diào)試的時候才打開調(diào)試宏定義,而且printf會占用空間,很多芯片的空間非常有限,更應(yīng)該關(guān)閉調(diào)試宏。
          下面就直接進(jìn)入正題,說一下調(diào)試的技巧


          2.正文


          1 編譯器內(nèi)置宏


          先介紹幾個編譯器內(nèi)置的宏定義,這些宏定義不僅可以幫助我們完成跨平臺的源碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的調(diào)試信息。

          ANSI C標(biāo)準(zhǔn)中有幾個標(biāo)準(zhǔn)預(yù)定義宏(也是常用的):

          __LINE__:在源代碼中插入當(dāng)前源代碼行號;

          __FILE__:在源文件中插入當(dāng)前源文件名;

          __DATE__:在源文件中插入當(dāng)前的編譯日期

          __TIME__:在源文件中插入當(dāng)前編譯時間;

          __STDC__:當(dāng)要求程序嚴(yán)格遵循ANSI C標(biāo)準(zhǔn)時該標(biāo)識被賦值為1;

          __cplusplus:當(dāng)編寫C++程序時該標(biāo)識符被定義。


          編譯器在進(jìn)行源碼編譯的時候,會自動將這些宏替換為相應(yīng)內(nèi)容。


          2 最基本的用法


          打開宏的時候輸出
          f1e5675085f3a3c95ce7952c1a8354e9.webp


          關(guān)閉宏的時候輸出
          cedee9843583dac74503a4cd310acbb6.webp


          3 換個高級的用法
          ?

          代碼如下

          #include?

          #define?__DEBUG__

          #ifdef?__DEBUG__
          #define?DEBUG(format,...)?printf("Date:?"__DATE__",File:?"__FILE__",?Line:?%05d:?"format"\n",?__LINE__,?##__VA_ARGS__)
          #else
          #define?DEBUG(format,...)
          #endif

          int?main(int?argc,?char?**argv)?{
          ????char?str[]="Hello?World";
          ????DEBUG("%s",str);
          ????return?0;
          }


          輸出如下

          Date:?Oct??5?2018,File:?/code/main.c,?Line:?00013:?Hello?World
          sandbox>?exited?with?status?0


          在線編譯器網(wǎng)址:https://tool.lu/coderunner/


          ?4 ## __VA_ARGS__ ... 宏和可變參數(shù)

          在GNU C中,宏可以接受可變數(shù)目的參數(shù),就象函數(shù)一樣

          例如:?

          #define?pr_debug(fmt,arg...)?\?
          printk(KERN_DEBUG?fmt,?##arg)

          用可變參數(shù)宏(variadic macros)傳遞可變參數(shù)表?
          你可能很熟悉在函數(shù)中使用可變參數(shù)表,如:

          void?printf(const?char*?format,?...);

          直到最近,可變參數(shù)表還是只能應(yīng)用在真正的函數(shù)中,不能使用在宏中。

          C99編譯器標(biāo)準(zhǔn)允許你可以定義可變參數(shù)宏(variadic macros),這樣你就可以


          使用擁有可以變化的參數(shù)表的宏。可變參數(shù)宏就像下面這個樣子:

          #define?debug(...)?printf(__VA_ARGS__)


          缺省號代表一個可以變化的參數(shù)表。使用保留名 __VA_ARGS__ 把參數(shù)傳遞給宏。

          當(dāng)宏的調(diào)用展開時,實際的參數(shù)就傳遞給 printf()了


          例如:?

          debug("Y?=?%d\n",?y);

          而處理器會把宏的調(diào)用替換成:?

          printf("Y?=?%d\n",?y);

          因為debug()是一個可變參數(shù)宏,你能在每一次調(diào)用中傳遞不同數(shù)目的參數(shù):?

          debug("test");//?一個參數(shù)

          用GCC和C99的可變參數(shù)宏, 更方便地打印調(diào)試信息


          可變參數(shù)宏不被ANSI/ISO C++ 所正式支持。因此,你應(yīng)當(dāng)檢查你的編譯器,看它是否支持這項技術(shù)。?


          可變參數(shù)的宏里的'##'操作說明帶有可變參數(shù)的宏(Macros with a Variable Number of Arguments)?


          更詳細(xì)請查看如下鏈接

          http://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html


          ?

          #5 舉個栗子-Linux內(nèi)核調(diào)試宏

          下面是Android touchscreen驅(qū)動的調(diào)試宏用法,看這樣的寫法就是一個大神了,給大家借鑒。
          //?Log?define
          #define?GTP_ERROR(fmt,arg...)??????????printk("<<-GTP-ERROR->>?"fmt"\n",##arg)
          #if?DEBUG_SWITCH
          #define?GTP_INFO(fmt,arg...)???????????printk("<<-GTP-INFO->>?"fmt"\n",##arg)
          #define?GTP_DEBUG(fmt,arg...)??????????do{\
          ?????????????????????????????????????????if(GTP_DEBUG_ON)\
          ?????????????????????????????????????????printk("<<-GTP-DEBUG->>?[%d]"fmt"\n",__LINE__,?##arg);\
          ???????????????????????????????????????}while(0)
          #define?GTP_DEBUG_ARRAY(array,?num)????do{\
          ?????????????????????????????????????????s32?i;\
          ?????????????????????????????????????????u8*?a?=?array;\
          ?????????????????????????????????????????if(GTP_DEBUG_ARRAY_ON)\
          ?????????????????????????????????????????{\
          ????????????????????????????????????????????printk("<<-GTP-DEBUG-ARRAY->>\n");\
          ????????????????????????????????????????????for?(i?=?0;?i?????????????????????????????????????????????{\
          ????????????????????????????????????????????????printk("%02x???",?(a)[i]);\
          ????????????????????????????????????????????????if?((i?+?1?)?%10?==?0)\
          ????????????????????????????????????????????????{\
          ????????????????????????????????????????????????????printk("\n");\
          ????????????????????????????????????????????????}\
          ????????????????????????????????????????????}\
          ????????????????????????????????????????????printk("\n");\
          ????????????????????????????????????????}\
          ???????????????????????????????????????}while(0)
          #define?GTP_DEBUG_FUNC()???????????????do{\
          ?????????????????????????????????????????if(GTP_DEBUG_FUNC_ON)\
          ?????????????????????????????????????????printk("?????<<-GTP-FUNC->>???????Func:%s@Line:%d\n",__func__,__LINE__);\
          ???????????????????????????????????????}while(0)

          #else
          #define?GTP_INFO(fmt,arg...)
          #define?GTP_DEBUG(fmt,arg...)
          #define?GTP_DEBUG_ARRAY(array,?num)
          #define?GTP_DEBUG_FUNC()
          #endif



          推薦閱讀:? ??專輯|Linux文章匯總? ??專輯|程序人生? ??專輯|C語言
          db35ffcfec89493478a9029a8039bbaf.webp

          嵌入式Linux微信掃描二維碼,關(guān)注我的公眾號?



          瀏覽 24
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日大黑逼视频 | 国产毛片电影 | 色 aⅴ 性 欧美 色点点点丁香五月天 | 在线观看欧美日本a | 女人18片毛片120分钟免费观看 |