除錯方法和技巧

2021-06-22 10:05:05 字數 3031 閱讀 2183

便於除錯的**風格:

1.不用全域性變數

2.所有變數都要初始化,成員變數在建構函式中初始化

3.盡量使用const

4.詳盡的注釋

vc++編譯選項:

1.總是使用/w4警告級別

2.在除錯版本裡總是使用/gz編譯選項,用來發現在release版本中才有的錯誤

3.沒有警告的編譯:保證在編譯後沒有任何警告,但是在消除警告前要進行仔細檢查

除錯方法:

1.使用 assert(原則:盡量簡單)

assert只在debug下生效,release下不會被編譯。

例子:01.char*strcpy(char* dest,char* source)

02.

11.returnreturnstring;

12.}

2、防禦性的程式設計

例子:01.char*strcpy(char* dest,char* source)

02.

08.

09.if(dest == 0)

10.

14.char* returnstring = dest;

15.while((*dest++ = *source++)!= 『\0』)

16.

19.returnreturnstring;

20.}

3、使用trace

以下的例子只能在debug中顯示,

例子:a)、trace

1.cstring cstest = 「test」;

2.trace(「cstring is %s\n」,cstest);

b)、atltrace

c)、afxdump

1.ctimetime= ctime::getcurrenttime();

2.#ifdef _debug

3.afxdump <<time<< 「\n」;

4.#endif

4、用getlasterror來檢測返回值,通過得到錯誤**來分析錯誤原因

5、把錯誤資訊記錄到檔案中

異常處理

程式設計時一定要考慮到異常如何處理,當錯誤發生後,不應簡單的報告錯誤並退出程式,應當盡可能的想辦法恢復到出錯前的狀態或者讓程式從頭開始執行,並且對於某些錯誤,應該能夠容錯,即允許錯誤的存在,但是程式還是能夠正常完成任務。

除錯技巧

1、vc++中f5進行除錯執行

a)、在output debug視窗中可以看到用trace列印的資訊

b)、 call stack視窗中能看到程式的呼叫堆疊

2、當debug版本執行時發生崩潰,選擇retry進行除錯,通過看call stack分析出錯的位置及原因

3、使用對映檔案除錯

b)、程式發布時,應該把所有模組的對映檔案都存檔。

c)、檢視對映檔案:見」 通過崩潰位址找出源**的出錯行」檔案。

4、可以除錯的release版本

project settings中c++項的debug info選擇為program database,link項的debug中選擇debug info和microsoft format。

5、檢視api的錯誤碼,在watch視窗輸入@err可以檢視或者@err,hr,其中」,hr」表示錯誤碼的說明。

6、set next statement:該功能可以直接跳轉到指定的**行執行,一般用來測試異常處理的**。

7、除錯記憶體變數的變化:當記憶體發生變化時停下來。

常見錯誤

1、在函式返回的時候程式崩潰的原因

a)、寫自動變數越界

b)、函式原型不匹配

2、mfc

a)、使用錯誤的函式原型處理使用者定義訊息

正確的函式原型為:

1.afx_msglresultonmymessage(wparamwparam,lparamlparam);

3、謹慎使用terminatethread:使用terminatethread會造成資源洩漏,不到萬不得已,不要使用。

4、使用_beginthreadex,不要使用create thread來常見執行緒。

除錯方法和技巧

除錯方法和技巧 便於除錯的 風格1.不用全域性變數 2.所有變數都要初始化,成員變數在建構函式中初始化 3.盡量使用const 4.詳盡的注釋 vc 編譯選項1.總是使用 w4警告級別 2.在除錯版本裡總是使用 gz編譯選項,用來發現在release版本中才有的錯誤 3.沒有警告的編譯 保證在編譯後...

VC 除錯方法和技巧

vc 除錯方法和技巧 便於除錯的 風格 1.不用全域性變數 2.所有變數都要初始化,成員變數在建構函式中初始化 3.盡量使用const 4.詳盡的注釋。vc 編譯選項 1.總是使用 w4警告級別 2.在除錯版本裡總是使用 gz編譯選項,用來發現在release版本中才有的錯誤 3.沒有警告的編譯 保...

程式除錯方法和技巧1

除錯方法和技巧 便於除錯的 風格 1.不用全域性變數 2.所有變數都要初始化,成員變數在建構函式中初始化 3.盡量使用const 4.詳盡的注釋 vc 編譯選項 1.總是使用 w4警告級別 2.在除錯版本裡總是使用 gz編譯選項,用來發現在release版本中才有的錯誤 3.沒有警告的編譯 保證在編...