便于調(diào)試的代碼風(fēng)格:

逆風(fēng)者

  1. 不用全局變量
  2. 所有變量都要初始化,成員變量在構(gòu)造函數(shù)中初始化
  3. 盡量使用const
  4. 詳盡的注釋

VC 編譯選項(xiàng):

  1. 總是使用/W4警告級(jí)別
  2. 在調(diào)試版本里總是使用/GZ編譯選項(xiàng),用來發(fā)現(xiàn)在Release版本中才有的錯(cuò)誤
  3. 沒有警告的編譯:保證在編譯后沒有任何警告,但是在消除警告前要進(jìn)行仔細(xì)檢查

調(diào)試方法:

1、使用 Assert(原則:盡量簡(jiǎn)單)
  assert只在debug下生效,release下不會(huì)被編譯。

例子:

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來檢測(cè)返回值,通過得到錯(cuò)誤代碼來分析錯(cuò)誤原因

5、把錯(cuò)誤信息記錄到文件中

異常處理

  程序設(shè)計(jì)時(shí)一定要考慮到異常如何處理,當(dāng)錯(cuò)誤發(fā)生后,不應(yīng)簡(jiǎn)單的報(bào)告錯(cuò)誤并退出程序,應(yīng)當(dāng)盡可能的想辦法恢復(fù)到出錯(cuò)前的狀態(tài)或者讓程序從頭開始運(yùn)行,并且對(duì)于某些錯(cuò)誤,應(yīng)該能夠容錯(cuò),即允許錯(cuò)誤的存在,但是程序還是能夠正常完成任務(wù)。

調(diào)試技巧

1、VC 中F5進(jìn)行調(diào)試運(yùn)行

a)、在output Debug窗口中可以看到用TRACE打印的信息
b)、 Call Stack窗口中能看到程序的調(diào)用堆棧

2、當(dāng)Debug版本運(yùn)行時(shí)發(fā)生崩潰,選擇retry進(jìn)行調(diào)試,通過看Call Stack分析出錯(cuò)的位置及原因
3、使用映射文件調(diào)試

a)、創(chuàng)建映射文件:Project settings中l(wèi)ink項(xiàng),選中Generate mapfile,輸出程序代碼地址:/MAPINFO: LINES,得到引出序號(hào):/MAPINFO: EXPORTS。
b)、程序發(fā)布時(shí),應(yīng)該把所有模塊的映射文件都存檔。
c)、查看映射文件:見” 通過崩潰地址找出源代碼的出錯(cuò)行”文件。

4、可以調(diào)試的Release版本

  Project settings中C 項(xiàng)的Debug Info選擇為Program Database,Link項(xiàng)的Debug中選擇Debug Info和Microsoft format。

5、查看API的錯(cuò)誤碼,在watch窗口輸入@err可以查看或者@err,hr,其中”,hr”表示錯(cuò)誤碼的說明。
6、Set Next Statement:該功能可以直接跳轉(zhuǎn)到指定的代碼行執(zhí)行,一般用來測(cè)試異常處理的代碼。
7、調(diào)試內(nèi)存變量的變化:當(dāng)內(nèi)存發(fā)生變化時(shí)停下來。

常見錯(cuò)誤

1、在函數(shù)返回的時(shí)候程序崩潰的原因
a)、寫自動(dòng)變量越界
b)、函數(shù)原型不匹配

2、MFC

a)、使用錯(cuò)誤的函數(shù)原型處理用戶定義消息

正確的函數(shù)原型為:

逆風(fēng)編程精品

afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);

3、謹(jǐn)慎使用TerminateThread:使用TerminateThread會(huì)造成資源泄漏,不到萬不得已,不要使用。

4、使用_beginthreadex,不要使用Create Thread來常見線程。

參考資料:
《Windows程序調(diào)試》