調試方法和技巧

  1. 調試方法和技巧
  2. 作者:非凡
  3. 便於調試的代碼風格:
  4.    1. 不用全局變量
  5.    2. 所有變量都要初始化,成員變量在構造函數中初始化
  6.    3. 儘量使用const
  7.    4. 詳盡的註釋
  8. VC++編譯選項:
  9.    1. 總是使用/W4警告級別
  10.    2. 在調試版本里總是使用/GZ編譯選項,用來發現在Release版本中才有的錯誤
  11.    3. 沒有警告的編譯:保證在編譯後沒有任何警告,但是在消除警告前要進行仔細檢查
  12. 調試方法:
  13. 1、使用 Assert(原則:儘量簡單)
  14.   assert只在debug下生效,release下不會被編譯。
  15. 例子:
  16. char* strcpy(char* dest,char* source)
  17. {
  18.     assert(source!=0);
  19.     assert(dest!=0);
  20.     char* returnstring = dest;
  21.     
  22.     while((*dest++ = *source++)!= ‘/0’)
  23.     {
  24.         ;
  25.     }
  26.     return returnstring;
  27. }      
  28. 2、防禦性的編程
  29. 例子:
  30. char* strcpy(char* dest,char* source)
  31. {
  32.     if(source == 0)
  33.     {
  34.         assert(false);
  35.         reutrn 0;
  36.     }
  37.     if(dest == 0)
  38.     {
  39.         assert(false);
  40.         return 0;
  41.     }
  42.     char* returnstring = dest;
  43.     while((*dest++ = *source++)!= ‘/0’)
  44.     {
  45.         ;
  46.     }
  47.     return returnstring;
  48. }      
  49. 3、使用Trace
  50. 以下的例子只能在debug中顯示,
  51. 例子:
  52. a)、TRACE
  53. CString csTest = “test”;
  54. TRACE(“CString is %s/n”,csTest);
  55. b)、ATLTRACE
  56. c)、afxDump
  57. CTime time = CTime::GetCurrentTime();
  58. #ifdef _DEBUG
  59. afxDump << time << “/n”;
  60. #endif
  61. 4、用GetLastError來檢測返回值,通過得到錯誤代碼來分析錯誤原因
  62. 5、把錯誤信息記錄到文件中
  63. 異常處理
  64.   程序設計時一定要考慮到異常如何處理,當錯誤發生後,不應簡單的報告錯誤並退出程序,應當儘可能的想辦法恢復到出錯前的狀態或者讓程序從頭開始運行,並且對於某些錯誤,應該能夠容錯,即允許錯誤的存在,但是程序還是能夠正常完成任務。
  65. 調試技巧
  66. 1、VC++中F5進行調試運行
  67. a)、在output Debug窗口中可以看到用TRACE打印的信息
  68. b)、 Call Stack窗口中能看到程序的調用堆棧
  69. 2、當Debug版本運行時發生崩潰,選擇retry進行調試,通過看Call Stack分析出錯的位置及原因
  70. 3、使用映射文件調試
  71. a)、創建映射文件:Project settings中link項,選中Generate mapfile,輸出程序代碼地址:/MAPINFO: LINES,得到引出序號:/MAPINFO: EXPORTS。
  72. b)、程序發佈時,應該把所有模塊的映射文件都存檔。
  73. c)、查看映射文件:見” 通過崩潰地址找出源代碼的出錯行”文件。
  74. 4、可以調試的Release版本
  75.   Project settings中C++項的Debug Info選擇爲Program Database,Link項的Debug中選擇Debug Info和Microsoft format。
  76. 5、查看API的錯誤碼,在watch窗口輸入@err可以查看或者@err,hr,其中”,hr”表示錯誤碼的說明。
  77. 6、Set Next Statement:該功能可以直接跳轉到指定的代碼行執行,一般用來測試異常處理的代碼。
  78. 7、調試內存變量的變化:當內存發生變化時停下來。
  79. 常見錯誤
  80. 1、在函數返回的時候程序崩潰的原因
  81. a)、寫自動變量越界
  82. b)、函數原型不匹配
  83. 2、MFC
  84. a)、使用錯誤的函數原型處理用戶定義消息
  85. 正確的函數原型爲:
  86. afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
  87. 3、謹慎使用TerminateThread:使用TerminateThread會造成資源泄漏,不到萬不得已,不要使用。
  88. 4、使用_beginthreadex,不要使用Create Thread來常見線程。
  89. 參考資料:
  90. 《Windows程序調試》
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章