vc調(diào)試技巧(全)_第1頁
vc調(diào)試技巧(全)_第2頁
vc調(diào)試技巧(全)_第3頁
vc調(diào)試技巧(全)_第4頁
vc調(diào)試技巧(全)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、調(diào)試是一個程序員最基本的技能,其重要性甚至超過學(xué)習(xí)一門語言。不會調(diào)試的程序員就意味著他即使會一門語言,卻不能編制出任何好的軟件。這里我簡要的根據(jù)自己的經(jīng)驗列出調(diào)試中比較常用的技巧,希望對大家有用。本文約定,在選擇菜單時,通過/表示分級菜單,例如File/Open表示頂級菜單File 的子菜單 open 。1 設(shè)置為了調(diào)試一個程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個從AppWi zard 創(chuàng)建的工程中包含的Debug Configuration自動包含調(diào)試信息,但是是不是Debug 版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計者可以在任意的Configuration 中增加調(diào)試信息

2、,包括Release 版本。為了增加調(diào)試信息,可以按照下述步驟進(jìn)行:a 打開Project settings對話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE 菜單Project/Settings打開b 選擇C/C+頁,Category 中選擇general ,則出現(xiàn)一個Debug Info下拉列表框,可供選擇的調(diào)試信息方式包括:None:沒有調(diào)試信息Line Numbers Only:目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號以及代碼行信息,不包含符號調(diào)試信息C7 Compatible:目標(biāo)文件或者可執(zhí)行文件中包含行號和所有符號調(diào)試信息, 包括變量名及類型. 函數(shù)及原型 等Progr

3、am Database:創(chuàng)建一個程序庫(PDB,包括類型信息和符號調(diào)試信息。Program Database for Edit and Continue:除了上面的功能外,這個選項允許對代碼進(jìn)行調(diào)試過程中的修改和繼續(xù)執(zhí)行。 這個選項同時使#pragma設(shè)置的優(yōu)化功能無效c 選擇Link 頁,選中復(fù)選框"Generate Debug Info",這個選項將使連接器把調(diào)試信息寫進(jìn)可執(zhí)行文件和DLL .如果C/C+頁中設(shè)置了Program Database以上的選項,則Link incrementally 可以選擇。選中這個選項,將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯

4、),而不必每次都從頭開始編譯。2 斷點斷點是調(diào)試器設(shè)置的一個代碼位置。當(dāng)程序運行到斷點時,程序中斷執(zhí)行,回到調(diào)試器。斷點是 最常用的技巧。調(diào)試時,只有設(shè)置了斷點并使程序回到調(diào)試器,才能對程序進(jìn)行在線調(diào)試。設(shè)置斷點:可以通過下述方法設(shè)置一個斷點。首先把光標(biāo)移動到需要設(shè)置斷點的代碼行上,然后按F9快捷鍵彈出Breakpoints 對話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過菜單Edit /Breakpoints打開。打開后點擊Break at編輯框的右側(cè)的箭頭,選擇 合適的位置信息。一般情況下,直接選擇line xxx就足夠了,如果想設(shè)置不是當(dāng)前位置的斷點,可以選擇Advanced

5、,然后填寫函數(shù)、行號和可執(zhí)行文件信息。去掉斷點:把光標(biāo)移動到給定斷點所在的行,再次按F9就可以取消斷點。同前面所述,打開Breakpoints 對話框后,也可以按照界面提示去掉斷點。條件斷點:可以為斷點設(shè)置一個條件,這樣的斷點稱為條件斷點。對于新加的斷點,可以單擊Conditions 按鈕,為斷點設(shè)置一個表達(dá)式。當(dāng)這個表達(dá)式發(fā)生改變時,程序就 被中斷。底下設(shè)置包括“觀察數(shù)組或者結(jié)構(gòu)的元素個數(shù)”,似乎可以設(shè)置一個指針?biāo)赶虻膬?nèi)存區(qū)的大小,但是我設(shè)置一個比較的值但是改動 范圍之外的內(nèi)存區(qū)似乎也導(dǎo)致斷點起效。最后一個設(shè)置可以讓程序先執(zhí)行多少次然后才到達(dá)斷點。數(shù)據(jù)斷點:數(shù)據(jù)斷點只能在Breakpoin

6、ts 對話框中設(shè)置。選擇“Data”頁,就顯示了設(shè)置數(shù)據(jù)斷點的對話框。在編輯框中輸入一個表達(dá)式,當(dāng)這個 表達(dá)式的值發(fā)生變化時,數(shù)據(jù)斷點就到達(dá)。一般情況下,這個表達(dá)式應(yīng)該由運算符和全局變量構(gòu)成,例如:在編輯框中輸入 g_bFlag這個全局變量的名字,那么當(dāng)程序中有g(shù)_bFlag= !g_bFlag時,程序就將停在這個語句處。消息斷點:VC 也支持對Windows 消息進(jìn)行截獲。他有兩種方式進(jìn)行截獲:窗口消息處理函數(shù)和特定消息中斷。在Breakpoints 對話框中選擇Messages 頁,就可以設(shè)置消息斷點。如果在上面那個對話框中寫入消息處理函數(shù)的名字,那么 每次消息被這個函數(shù)處理,斷點就到達(dá)(

7、我覺得如果采用普通斷點在這個函數(shù)中截獲,效果應(yīng)該一樣)。如果在底下的下拉 列表框選擇一個消息,則每次這種消息到達(dá),程序就中斷。3 WatchVC支持查看變量、表達(dá)式和內(nèi)存的值。所有這些觀察都必須是在斷點中斷的情況下進(jìn)行。觀看變量的值最簡單,當(dāng)斷點到達(dá)時,把光標(biāo)移動到這個變量上,停留一會就可以看到變量的值。VC 提供一種被成為Watch 的機(jī)制來觀看變量和表達(dá)式的值。在斷點狀態(tài)下,在變量上單擊右鍵,選擇Quick Watch, 就彈出一個對話框,顯示這個變量的值。單擊Debug 工具條上的Watch 按鈕,就出現(xiàn)一個Watch 視圖(Watch1,Watch2,Watc h3,Watch4),在

8、該視圖中輸入變量或者表達(dá)式,就可以觀察 變量或者表達(dá)式的值。注意:這個表達(dá)式不能有副作用,例如+運算符絕對禁止用于這個表達(dá)式中,因為這個運算符將修改變量的值,導(dǎo)致 軟件的邏輯被破壞。4 Memory由于指針指向的數(shù)組,Watch 只能顯示第一個元素的值。為了顯示數(shù)組的后續(xù)內(nèi)容,或者要顯示一片內(nèi)存的內(nèi)容,可以使用memory 功能。在 Debug工具條上點memory 按鈕,就彈出一個對話框,在其中輸入地址,就可以顯示該地址指向的內(nèi)存的內(nèi)容。5 VariblesDebug工具條上的Varibles 按鈕彈出一個框,顯示所有當(dāng)前執(zhí)行上下文中可見的變量的值。特別是當(dāng)前指令涉及的變量,以紅色顯示。6

9、寄存器Debug 工具條上的Reigsters 按鈕彈出一個框,顯示當(dāng)前的所有寄存器的值。7 進(jìn)程控制VC 允許被中斷的程序繼續(xù)運行、單步運行和運行到指定光標(biāo)處,分別對應(yīng)快捷鍵F5、F10/F11和CTRL+F10。各個快捷鍵功能如下:快捷鍵 說明F5 繼續(xù)運行F10 單步,如果涉及到子函數(shù),不進(jìn)入子函數(shù)內(nèi)部F11 單步,如果涉及到子函數(shù),進(jìn)入子函數(shù)內(nèi)部CTRL+F10 運行到當(dāng)前光標(biāo)處。8 Call Stack調(diào)用堆棧反映了當(dāng)前斷點處函數(shù)是被那些函數(shù)按照什么順序調(diào)用的。單擊Debug 工具條上的Call stack就顯示Call Stack對話框。在CallStack 對話框中顯示了一個調(diào)用

10、系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級函數(shù)。單擊這些函數(shù)名可以跳到對應(yīng)的函數(shù)中去。9 其他調(diào)試手段系統(tǒng)提供一系列特殊的函數(shù)或者宏來處理Debug 版本相關(guān)的信息,如下:10 宏名/函數(shù)名 說明TRACE 使用方法和printf 完全一致,他在output 框中輸出調(diào)試信息ASSERT 它接收一個表達(dá)式,如果這個表達(dá)式為TRUE ,則無動作,否則中斷當(dāng)前程序執(zhí)行。對于系統(tǒng)中出現(xiàn)這個宏 導(dǎo)致的中斷,應(yīng)該認(rèn)為你的函數(shù)調(diào)用未能滿足系統(tǒng)的調(diào)用此函數(shù)的前提條件。例如,對于一個還沒有創(chuàng)建的窗口調(diào)用SetWindowText 等。 VERIFY 和ASSERT 功能類似,所不同的是,在Releas

11、e 版本中,ASSERT 不計算輸入的表達(dá)式的值,而VERIFY 計算表達(dá)式的值。11 了解調(diào)試, 首先要知道" 斷點" 這個概念. 斷點就是程序運行中可能會中斷的地方, 方便開發(fā)者在程序運行的過程中查看程序當(dāng)前的運行狀態(tài), 比如變量的值, 函數(shù)的返回值等等. 究竟怎么使用斷點呢?(1.F9在當(dāng)前光標(biāo)所在的行下斷點, 如果當(dāng)前行已經(jīng)有斷點, 則取消斷點.F5調(diào)試狀態(tài)運行程序, 程序執(zhí)行到有斷點的地方會停下來.F10單步執(zhí)行程序.CTRL+F10運行到光標(biāo)所在行.F11和F10的區(qū)別是, 如果當(dāng)前執(zhí)行語句是函數(shù)調(diào)用, 則會進(jìn)入函數(shù)里面.SHIFT+F11跳出當(dāng)前所在函數(shù).特別

12、說明:a.有的地方不能下斷點. 比如空行, 基本類型定義語句(不初始化, 等等非執(zhí)行語句. 比如 int i; / 此行不能下斷點int j=0;/ 這里可以下CStringstr;/ 這里可以下intk = Max(i,j;/ 這里可以下b.不是所有斷點都會(斷. 比如下斷點的語句在程序里面沒有被執(zhí)行.c.此外,ALT+F9還可以下條件斷點,不過這個不常用,有興趣的可以自己研究:(2如何調(diào)試Release 版的程序?有些程序在debug 下運行的很好, 但在release 下卻總是失敗, 默認(rèn)情況下release 是不能調(diào)試的. 怎么解決呢?其實"debug" 和&quo

13、t;release" 都只是一個代號而已, 各自對應(yīng)一組不同的編譯選項.在release 的默認(rèn)設(shè)置下,ALT+F7 ,調(diào)出工程設(shè)置對話框, 切換到link 選項卡, 勾選"Genera te debug info",然后再切換到C/C+選項卡, 在"Optimizations" 里面選"Disable(Debug",在下面的"Debug info"里面選"Program Database for Edit and Continue".然后點OK 保存設(shè)置, 重新編譯程序, 下斷點即可.(3上面兩點已經(jīng)能應(yīng)付很多種情況了, 但是有時候即使在debug 下也不能下斷點, 我以前也曾經(jīng)遇到過這種問題, 一個調(diào)了4層的dll, 就是不能下斷點. 其實還除了上面的方法, 還有一種最底層的實現(xiàn)技術(shù):使用匯編.細(xì)心的人可能會發(fā)現(xiàn), 有時候在調(diào)試狀態(tài)下當(dāng)程序出現(xiàn)異常的時候, 光標(biāo)會指向匯編代碼, 而這個代碼就是int 3,這其實是一個中斷.在你的代碼的任意地方加

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論