談在Debug和Release模式下輸出除錯資訊 .
1、輸出巨集和函式
①使用TRACE,其語法類似printf,用於向Output視窗輸出資訊。該巨集僅僅在程式的Debug版本中出現,在release版本中無效。
②使用printf時,在Debug和Release版本下都會輸出資訊。
③使用TRACE和printf時,既可以輸出字串,也可以輸出格式化資訊,如(以TRACE為例)
TRACE(_T("This is a test\n"));
TRACE(_T("This is NO.%d test\n"), cnt);
④使用OutputDebugString
VOID OutputDebugString(LPCTSTR lpOutputString); // lpOutputString: pointer to string to be displayed
該函式在Debug和Release版本中都有效,但是隻能輸出字串,如果想輸出變數值,需要自己先格式化。例如:
CString str;
str.Format(_T("This is NO.%d test\n"), cnt);
OutputDebugString(str);
⑤在Windows CE下,還可以使用RETAILMSG巨集來輸出格式化資訊。如下所示:
RETAILMSG(TRUE, (_T("This is NO.%d test\n"), cnt));
2、檢視輸出的除錯資訊
對於Debug版本的程式,通常是在VC IDE環境中執行,因此這時可以直接通過IDE的Output視窗來檢視輸出的除錯資訊。
對於Release版本的程式,可以通過DebugView工具來檢視系統DEBUGER中的除錯資訊,這時不要在IDE環境中執行程式,需要直接執行.exe檔案。這個工具在網上可以下載。
對於Windows CE下的Release版本程式,可以通過串列埠線將其除錯串列埠接到電腦上,然後在DNW軟體中檢視輸出資訊。
最後,還想提一下另外兩個很有用的巨集:ASSERT和VERIFY。前者只在Debug下有效,後者在Debug和Release都有效。通常ASSERT用的比較多,但是需要注意兩點:
第一,是在條件為假時輸出診斷資訊;
第二,由於ASSERT只在Debug版本下有效,因此千萬別在其條件中執行函式,我曾經就犯過錯。如
ASSERT( func() == 3);
這條語句是執行func()函式,同時判斷其返回值是否是3,如果不是3說明程式有錯,則輸出診斷資訊。在Debug下一切正常,但是在Release下,由於ASSERT無效,導致func()函式沒有執行。