printf除錯是嵌入式除錯的基本手段,而且是非常重要的手段,我認為相比單步除錯更加有用有效,特別是微控制器之後跑系統,單步除錯效率更加低下了,我們在工作遇到bug的時候,我們第一時間就想知道那些該死的日誌有沒有儲存下來,這樣好讓我們程式設計師裝逼一波把問題解決。
printf巨集定義除錯非常重要,有些日誌在開發的時候才需要開啟,發布的時候需要關閉,但是在**上又需要保留下次除錯,所以我們在除錯的時候才開啟除錯巨集定義,而且printf會占用空間,很多晶元的空間非常有限,更應該關閉除錯巨集。
下面就直接進入正題,說一下除錯的技巧
編譯器內建巨集
先介紹幾個編譯器內建的巨集定義,這些巨集定義不僅可以幫助我們完成跨平台的原始碼編寫,靈活使用也可以巧妙地幫我們輸出非常有用的除錯資訊。
ansi c標準中有幾個標準預定義巨集(也是常用的):開啟巨集的時候輸出__line__:在源**中插入當前源**行號;
__file__:在原始檔中插入當前源檔名;
__date__:在原始檔中插入當前的編譯日期
__time__:在原始檔中插入當前編譯時間;
__stdc__:當要求程式嚴格遵循ansi c標準時該標識被賦值為1;
__cplusplus:當編寫c++程式時該識別符號被定義。
關閉巨集的時候輸出
輸出如下
date: oct 5 2018,file: /code/main.c, line: 00013: hello world
sandbox> exited with status 0
參考:
// log define
#define gtp_error(fmt,arg...) printk("<> "fmt"\n",##arg)
#if debug_switch
#define gtp_info(fmt,arg...) printk("<> "fmt"\n",##arg)
#define gtp_debug(fmt,arg...) dowhile(0)
#define gtp_debug_array(array, num) do\
}\printk("\n");\
}\}while(0)
#define gtp_debug_func() dowhile(0)
#else
#define gtp_info(fmt,arg...)
#define gtp_debug(fmt,arg...)
#define gtp_debug_array(array, num)
#define gtp_debug_func()
#endif
用於除錯的巨集
在linux程式設計中,gdb是個不錯的除錯工具。但是當檔案數量上百,甚至上千之後,使用gdb除錯就是一場災難。因此在程式中加入合理的列印資訊,能更高效的定位到問題的所在。下面就是定義的巨集。分別是warning,info,error。利用了,file function line 變數。cpp vi...
C 除錯巨集 LINE FILE
date file line funcdname stdc time timestamp 使用方法 printf s d s date line file unicode 使用方法 include define widen2 x l x define widen x widen2 x define ...
ios 巨集定義除錯
nslog遮蔽輸出 使用nslog的乙個風險是 它的執行會占用時間和裝置資源。當我們用simulator時,nslog的資源占用並不引人注意,風險也不會顯示出來。但是如果你寫的是乙個即時戰略遊戲,而你在每乙個action中都加入了nslog 那麼nslog將成為乙個魔鬼。災難的具體表現常常是 你在s...