VC6 0除錯技巧

2021-06-18 17:48:06 字數 3536 閱讀 9885

一、基本的除錯設定

1、ctrl+f10:執行到當前游標處2l

開啟project settings對話方塊(可以通過快捷鍵alt+f7開啟,也可以通過ide選單project/settings開啟)

l選擇c/c++頁,category中選擇general ,則出現乙個debug info下拉列表框,可供選擇的除錯資訊 方式包括:

命令列   

project settings 說明

無none

沒有除錯資訊

/zd

line numbers only

目標檔案或者可執行檔案中只包含全域性和匯出符號以及**行資訊,不包含符號除錯資訊

/z7

c 7.0- compatible

目標檔案或者可執行檔案中包含行號和所有符號除錯資訊,包括變數名及型別,函式及原型等

/zi

program database

建立乙個程式庫(pdb),包括型別資訊和符號除錯資訊。

/zi

program database for edit and continue

除了前面/zi的功能外,這個選項允許對**進行除錯過程中的修改和繼續執行。這個選項同時使#pragma設定的優化功能無效

l選擇link頁,選中核取方塊"generate debug info",這個選項將使聯結器把除錯資訊寫進可執行檔案和dll

l如果c/c++頁中設定了program database以上的選項,則link incrementally可以選擇。選中這個選項,將使程式可以在上一次編譯的基礎上被編譯(即增量編譯),而不必每次都從頭開始編譯。

二、除錯的一些技巧

1、使用assert

和verify

(原則:盡量簡單)

assert:它接收乙個表示式,如果這個表示式為true,則無動作,否則中斷當前程式執行。對於系統中出現這個巨集導致的中斷,應該認為你的函式呼叫未能滿足系統的呼叫此函式的前提條件。例如,對於乙個還沒有建立的視窗呼叫setwindowtext等。

verify

:和assert功能類似,所不同的是,在release版本中,assert不計算輸入的表示式的值,而verify計算表示式的值。

assert(x)

:x條件表示式必須為真。否則會出現斷言對話方塊。在release整個x會被忽弱。

verify(x): x條件表示式必須為真。在release版中,x語句會保留下來。

舉例:assert(func()) 

和verify(func()) 在debug下都會執行func函式並判斷返回值(在debug下兩者等同),

在release下assert(func())整句會被去掉,func()沒有被呼叫,而verify(func())中的func()會被呼叫,但不判斷返回值。所有大家千萬不要寫assert(func())這樣的語句,不然的話,debug正常,到release下就不正常(func()不呼叫),而且有很難查出問題

2、防禦性的程式設計

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

if(dest == 0)

char* returnstring = dest;

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

return returnstring;}

3、使用trace

例子: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來檢測返回值,通過得到錯誤**來分析錯誤原因

使用方法是:

lpvoid lpmsgbuf; 

formatmessage(

format_message_allocate_buffer¦

format_message_from_system¦

format_message_ignore_inserts, 

null, 

getlasterror(), 

makelangid(lang_neutral, sublang_default), // default language 

(lptstr) &lpmsgbuf, 

0, null

); // process any inserts in lpmsgbuf. 

// ... 

// display the string. 

messagebox( null, (lpctstr)lpmsgbuf, "error", mb_ok¦ mb_iconinformation ); 

// free the buffer. 

localfree( lpmsgbuf ); 

lpvoid lpmsgbuf;

但是也要注意:由於用getlasterror插得**七零八碎。在watch窗裡使用變數@err時就可以立即看到當前的lasterror碼。

而使用@err,hr即可看到錯誤資訊。

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

三、除錯技巧

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

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

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

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

、可以除錯的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來常見執行緒。

life is like a box of chocolate, you never know what you are going to get.

vc6 0 除錯小結

現在都用vs2008了,vc6的速度還是很懷念,來個小結吧。斷點相關快捷鍵 1.f9在當前游標所在的行下斷點,如果當前行已經有斷點,則取消斷點.f5除錯狀態執行程式,程式執行到有斷點的地方會停下來.f10單步執行程式.ctrl f10執行到游標所在行.f11和f10的區別是,如果當前執行語句是函式呼...

VC 6 0遠端除錯

先明確下概念,遠端除錯嘛,自然是兩個機器之間除錯。程式執行在目標機器上,偵錯程式執行在本機。當然,目標機器上還是要有少許輔助程式才能跟本機的偵錯程式connect上,以便通訊。一般來說,只需要copy四個檔案到目標機器上就行了 msvcmon.exe dm.dll tln0t.dll和msdis11...

VC 6 0遠端除錯

vc開發環境之所以提供遠端除錯的能力,是因為有些情況下單機除錯會讓你崩潰掉。比如,除錯gui程式的wm paint訊息,因為要單步除錯,所以偵錯程式會對介面的重繪產生 heisenberg不確定性原理 當然還有些別的情況也適用,比如程式在測試環境執行的好好的,但是在客戶那行為總是異常,這時候如果可以...