1. 程式人生 > >談在Debug和Release模式下輸出除錯資訊 .

談在Debug和Release模式下輸出除錯資訊 .

在除錯程式時,有時候設定斷點單步執行並不能查出問題的所在,比如程式可能在執行一段時間後死掉了,或者對於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軟體中檢視輸出資訊。

      最後,還想提一下另外兩個很有用的巨集:ASSERTVERIFY。前者只在Debug下有效,後者在Debug和Release都有效。通常ASSERT用的比較多,但是需要注意兩點:

第一,是在條件為假時輸出診斷資訊;

第二,由於ASSERT只在Debug版本下有效,因此千萬別在其條件中執行函式,我曾經就犯過錯。如

        ASSERT( func() == 3);

這條語句是執行func()函式,同時判斷其返回值是否是3,如果不是3說明程式有錯,則輸出診斷資訊。在Debug下一切正常,但是在Release下,由於ASSERT無效,導致func()函式沒有執行。