程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC++調試方法和技巧

VC++調試方法和技巧

編輯:關於VC++

便於調試的代碼風格:

不用全局變量

所有變量都要初始化,成員變量在構造函數中初始化

盡量使用const

詳盡的注釋

VC++編譯選項:

總是使用/W4警告級別

在調試版本裡總是使用/GZ編譯選項,用來發現在Release版本中才有的錯誤

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

調試方法:

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來常見線程。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved