2013年10月9日

進階版 Debug Message

寫程式往往會 print 一堆變數或是訊息用來 Debug
而 Release Code 時,又不希望這些 Debug Message 鋪天蓋地的出現

或是, 印了一堆訊息,卻不知道某個訊息是
哪個檔案的哪個 function 的哪一行所印出來印出來的訊息?


由於上述問題,於是長久以來
我都會用 define 寫一個專門印 debug message  之用的巨集
並利用 #define _DEBUG_ 開啟
當 Release Code 時 , 將這行註解掉,所有的 message 就會統統消失

印出訊息包含程式檔案名稱、message 所在的行號及 function name 資訊

除了可以直接印一行字串之外
也可以印出多個變數並可以定自訂 format

#ifdef _DEBUG_
 #define Dbg(f,m...)     printf( "%s(line:%d)|%s()| "#m": "f"\n" \
     ,__FILE__,  __LINE__, __FUNCTION__ ,##m)
#else
 #define Dbg(m)
#endif






範例:
#include


#define _DEBUG_


#ifdef _DEBUG_
 #define Dbg(f,m...)     printf( "%s(line:%d)|%s()| "#m": "f"\n" \
     ,__FILE__,  __LINE__, __FUNCTION__ ,##m)
#else
 #define Dbg(m)
#endif


int main()
{
int MyVal = 100;
int MyVal2 = 1024;


Dbg("Spark Test Msg");
Dbg("%d",MyVal);
Dbg("0x%08x", MyVal);
Dbg("(Hex) 0x%x", MyVal);
Dbg("(Hex) 0x%x, 0x%x", MyVal, MyVal2);


return 0;
}




輸出結果:
[root@localhost tmp]# ./a.out                                                   
t.c(line:18)|main()| : Spark Test Msg                                           
t.c(line:19)|main()| MyVal: 100                                                 
t.c(line:20)|main()| MyVal: 0x00000064
t.c(line:21)|main()| MyVal: (Hex) 0x64
t.c(line:22)|main()| MyVal, MyVal2: (Hex) 0x64, 0x400





沒有留言: