一、基本的除錯設定
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不確定性原理 當然還有些別的情況也適用,比如程式在測試環境執行的好好的,但是在客戶那行為總是異常,這時候如果可以...