- 調試方法和技巧
- 作者:非凡
- 便於調試的代碼風格:
- 1. 不用全局變量
- 2. 所有變量都要初始化,成員變量在構造函數中初始化
- 3. 儘量使用const
- 4. 詳盡的註釋
- VC++編譯選項:
- 1. 總是使用/W4警告級別
- 2. 在調試版本里總是使用/GZ編譯選項,用來發現在Release版本中才有的錯誤
- 3. 沒有警告的編譯:保證在編譯後沒有任何警告,但是在消除警告前要進行仔細檢查
- 調試方法:
- 1、使用 Assert(原則:儘量簡單)
- assert只在debug下生效,release下不會被編譯。
- 例子:
- char* strcpy(char* dest,char* source)
- {
- assert(source!=0);
- assert(dest!=0);
- char* returnstring = dest;
- while((*dest++ = *source++)!= ‘/0’)
- {
- ;
- }
- return returnstring;
- }
- 2、防禦性的編程
- 例子:
- char* strcpy(char* dest,char* source)
- {
- if(source == 0)
- {
- assert(false);
- reutrn 0;
- }
- if(dest == 0)
- {
- assert(false);
- return 0;
- }
- char* returnstring = dest;
- while((*dest++ = *source++)!= ‘/0’)
- {
- ;
- }
- return returnstring;
- }
- 3、使用Trace
- 以下的例子只能在debug中顯示,
- 例子:
- a)、TRACE
- CString csTest = “test”;
- TRACE(“CString is %s/n”,csTest);
- b)、ATLTRACE
- c)、afxDump
- CTime time = CTime::GetCurrentTime();
- #ifdef _DEBUG
- afxDump << time << “/n”;
- #endif
- 4、用GetLastError來檢測返回值,通過得到錯誤代碼來分析錯誤原因
- 5、把錯誤信息記錄到文件中
- 異常處理
- 程序設計時一定要考慮到異常如何處理,當錯誤發生後,不應簡單的報告錯誤並退出程序,應當儘可能的想辦法恢復到出錯前的狀態或者讓程序從頭開始運行,並且對於某些錯誤,應該能夠容錯,即允許錯誤的存在,但是程序還是能夠正常完成任務。
- 調試技巧
- 1、VC++中F5進行調試運行
- a)、在output Debug窗口中可以看到用TRACE打印的信息
- b)、 Call Stack窗口中能看到程序的調用堆棧
- 2、當Debug版本運行時發生崩潰,選擇retry進行調試,通過看Call Stack分析出錯的位置及原因
- 3、使用映射文件調試
- a)、創建映射文件:Project settings中link項,選中Generate mapfile,輸出程序代碼地址:/MAPINFO: LINES,得到引出序號:/MAPINFO: EXPORTS。
- 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)、使用錯誤的函數原型處理用戶定義消息
- 正確的函數原型爲:
- afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
- 3、謹慎使用TerminateThread:使用TerminateThread會造成資源泄漏,不到萬不得已,不要使用。
- 4、使用_beginthreadex,不要使用Create Thread來常見線程。
- 參考資料:
- 《Windows程序調試》
調試方法和技巧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.