版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、調(diào)試是一個(gè)程序員最基本的技能,其重要性甚至超過學(xué)習(xí)一門語言。不會(huì)調(diào)試的程序員就意味著他即使會(huì)一門語言,卻不能編制出任何好的軟件。這里我簡(jiǎn)要的根據(jù)自己的經(jīng)驗(yàn)列出調(diào)試中比較常用的技巧,希望對(duì)大家有用。本文約定,在選擇菜單時(shí),通過/表示分級(jí)菜單,例如File/Open表示頂級(jí)菜單File 的子菜單 open 。1 設(shè)置為了調(diào)試一個(gè)程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個(gè)從AppWi zard 創(chuàng)建的工程中包含的Debug Configuration自動(dòng)包含調(diào)試信息,但是是不是Debug 版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計(jì)者可以在任意的Configuration 中增加調(diào)試信息
2、,包括Release 版本。為了增加調(diào)試信息,可以按照下述步驟進(jìn)行:a 打開Project settings對(duì)話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE 菜單Project/Settings打開b 選擇C/C+頁,Category 中選擇general ,則出現(xiàn)一個(gè)Debug Info下拉列表框,可供選擇的調(diào)試信息方式包括:None:沒有調(diào)試信息Line Numbers Only:目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號(hào)以及代碼行信息,不包含符號(hào)調(diào)試信息C7 Compatible:目標(biāo)文件或者可執(zhí)行文件中包含行號(hào)和所有符號(hào)調(diào)試信息, 包括變量名及類型. 函數(shù)及原型 等Progr
3、am Database:創(chuàng)建一個(gè)程序庫(PDB,包括類型信息和符號(hào)調(diào)試信息。Program Database for Edit and Continue:除了上面的功能外,這個(gè)選項(xiàng)允許對(duì)代碼進(jìn)行調(diào)試過程中的修改和繼續(xù)執(zhí)行。 這個(gè)選項(xiàng)同時(shí)使#pragma設(shè)置的優(yōu)化功能無效c 選擇Link 頁,選中復(fù)選框"Generate Debug Info",這個(gè)選項(xiàng)將使連接器把調(diào)試信息寫進(jìn)可執(zhí)行文件和DLL .如果C/C+頁中設(shè)置了Program Database以上的選項(xiàng),則Link incrementally 可以選擇。選中這個(gè)選項(xiàng),將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯
4、),而不必每次都從頭開始編譯。2 斷點(diǎn)斷點(diǎn)是調(diào)試器設(shè)置的一個(gè)代碼位置。當(dāng)程序運(yùn)行到斷點(diǎn)時(shí),程序中斷執(zhí)行,回到調(diào)試器。斷點(diǎn)是 最常用的技巧。調(diào)試時(shí),只有設(shè)置了斷點(diǎn)并使程序回到調(diào)試器,才能對(duì)程序進(jìn)行在線調(diào)試。設(shè)置斷點(diǎn):可以通過下述方法設(shè)置一個(gè)斷點(diǎn)。首先把光標(biāo)移動(dòng)到需要設(shè)置斷點(diǎn)的代碼行上,然后按F9快捷鍵彈出Breakpoints 對(duì)話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過菜單Edit /Breakpoints打開。打開后點(diǎn)擊Break at編輯框的右側(cè)的箭頭,選擇 合適的位置信息。一般情況下,直接選擇line xxx就足夠了,如果想設(shè)置不是當(dāng)前位置的斷點(diǎn),可以選擇Advanced
5、,然后填寫函數(shù)、行號(hào)和可執(zhí)行文件信息。去掉斷點(diǎn):把光標(biāo)移動(dòng)到給定斷點(diǎn)所在的行,再次按F9就可以取消斷點(diǎn)。同前面所述,打開Breakpoints 對(duì)話框后,也可以按照界面提示去掉斷點(diǎn)。條件斷點(diǎn):可以為斷點(diǎn)設(shè)置一個(gè)條件,這樣的斷點(diǎn)稱為條件斷點(diǎn)。對(duì)于新加的斷點(diǎn),可以單擊Conditions 按鈕,為斷點(diǎn)設(shè)置一個(gè)表達(dá)式。當(dāng)這個(gè)表達(dá)式發(fā)生改變時(shí),程序就 被中斷。底下設(shè)置包括“觀察數(shù)組或者結(jié)構(gòu)的元素個(gè)數(shù)”,似乎可以設(shè)置一個(gè)指針?biāo)赶虻膬?nèi)存區(qū)的大小,但是我設(shè)置一個(gè)比較的值但是改動(dòng) 范圍之外的內(nèi)存區(qū)似乎也導(dǎo)致斷點(diǎn)起效。最后一個(gè)設(shè)置可以讓程序先執(zhí)行多少次然后才到達(dá)斷點(diǎn)。數(shù)據(jù)斷點(diǎn):數(shù)據(jù)斷點(diǎn)只能在Breakpoin
6、ts 對(duì)話框中設(shè)置。選擇“Data”頁,就顯示了設(shè)置數(shù)據(jù)斷點(diǎn)的對(duì)話框。在編輯框中輸入一個(gè)表達(dá)式,當(dāng)這個(gè) 表達(dá)式的值發(fā)生變化時(shí),數(shù)據(jù)斷點(diǎn)就到達(dá)。一般情況下,這個(gè)表達(dá)式應(yīng)該由運(yùn)算符和全局變量構(gòu)成,例如:在編輯框中輸入 g_bFlag這個(gè)全局變量的名字,那么當(dāng)程序中有g(shù)_bFlag= !g_bFlag時(shí),程序就將停在這個(gè)語句處。消息斷點(diǎn):VC 也支持對(duì)Windows 消息進(jìn)行截獲。他有兩種方式進(jìn)行截獲:窗口消息處理函數(shù)和特定消息中斷。在Breakpoints 對(duì)話框中選擇Messages 頁,就可以設(shè)置消息斷點(diǎn)。如果在上面那個(gè)對(duì)話框中寫入消息處理函數(shù)的名字,那么 每次消息被這個(gè)函數(shù)處理,斷點(diǎn)就到達(dá)(
7、我覺得如果采用普通斷點(diǎn)在這個(gè)函數(shù)中截獲,效果應(yīng)該一樣)。如果在底下的下拉 列表框選擇一個(gè)消息,則每次這種消息到達(dá),程序就中斷。3 WatchVC支持查看變量、表達(dá)式和內(nèi)存的值。所有這些觀察都必須是在斷點(diǎn)中斷的情況下進(jìn)行。觀看變量的值最簡(jiǎn)單,當(dāng)斷點(diǎn)到達(dá)時(shí),把光標(biāo)移動(dòng)到這個(gè)變量上,停留一會(huì)就可以看到變量的值。VC 提供一種被成為Watch 的機(jī)制來觀看變量和表達(dá)式的值。在斷點(diǎn)狀態(tài)下,在變量上單擊右鍵,選擇Quick Watch, 就彈出一個(gè)對(duì)話框,顯示這個(gè)變量的值。單擊Debug 工具條上的Watch 按鈕,就出現(xiàn)一個(gè)Watch 視圖(Watch1,Watch2,Watc h3,Watch4),在
8、該視圖中輸入變量或者表達(dá)式,就可以觀察 變量或者表達(dá)式的值。注意:這個(gè)表達(dá)式不能有副作用,例如+運(yùn)算符絕對(duì)禁止用于這個(gè)表達(dá)式中,因?yàn)檫@個(gè)運(yùn)算符將修改變量的值,導(dǎo)致 軟件的邏輯被破壞。4 Memory由于指針指向的數(shù)組,Watch 只能顯示第一個(gè)元素的值。為了顯示數(shù)組的后續(xù)內(nèi)容,或者要顯示一片內(nèi)存的內(nèi)容,可以使用memory 功能。在 Debug工具條上點(diǎn)memory 按鈕,就彈出一個(gè)對(duì)話框,在其中輸入地址,就可以顯示該地址指向的內(nèi)存的內(nèi)容。5 VariblesDebug工具條上的Varibles 按鈕彈出一個(gè)框,顯示所有當(dāng)前執(zhí)行上下文中可見的變量的值。特別是當(dāng)前指令涉及的變量,以紅色顯示。6
9、寄存器Debug 工具條上的Reigsters 按鈕彈出一個(gè)框,顯示當(dāng)前的所有寄存器的值。7 進(jìn)程控制VC 允許被中斷的程序繼續(xù)運(yùn)行、單步運(yùn)行和運(yùn)行到指定光標(biāo)處,分別對(duì)應(yīng)快捷鍵F5、F10/F11和CTRL+F10。各個(gè)快捷鍵功能如下:快捷鍵 說明F5 繼續(xù)運(yùn)行F10 單步,如果涉及到子函數(shù),不進(jìn)入子函數(shù)內(nèi)部F11 單步,如果涉及到子函數(shù),進(jìn)入子函數(shù)內(nèi)部CTRL+F10 運(yùn)行到當(dāng)前光標(biāo)處。8 Call Stack調(diào)用堆棧反映了當(dāng)前斷點(diǎn)處函數(shù)是被那些函數(shù)按照什么順序調(diào)用的。單擊Debug 工具條上的Call stack就顯示Call Stack對(duì)話框。在CallStack 對(duì)話框中顯示了一個(gè)調(diào)用
10、系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級(jí)函數(shù)。單擊這些函數(shù)名可以跳到對(duì)應(yīng)的函數(shù)中去。9 其他調(diào)試手段系統(tǒng)提供一系列特殊的函數(shù)或者宏來處理Debug 版本相關(guān)的信息,如下:10 宏名/函數(shù)名 說明TRACE 使用方法和printf 完全一致,他在output 框中輸出調(diào)試信息ASSERT 它接收一個(gè)表達(dá)式,如果這個(gè)表達(dá)式為TRUE ,則無動(dòng)作,否則中斷當(dāng)前程序執(zhí)行。對(duì)于系統(tǒng)中出現(xiàn)這個(gè)宏 導(dǎo)致的中斷,應(yīng)該認(rèn)為你的函數(shù)調(diào)用未能滿足系統(tǒng)的調(diào)用此函數(shù)的前提條件。例如,對(duì)于一個(gè)還沒有創(chuàng)建的窗口調(diào)用SetWindowText 等。 VERIFY 和ASSERT 功能類似,所不同的是,在Releas
11、e 版本中,ASSERT 不計(jì)算輸入的表達(dá)式的值,而VERIFY 計(jì)算表達(dá)式的值。11 了解調(diào)試, 首先要知道" 斷點(diǎn)" 這個(gè)概念. 斷點(diǎn)就是程序運(yùn)行中可能會(huì)中斷的地方, 方便開發(fā)者在程序運(yùn)行的過程中查看程序當(dāng)前的運(yùn)行狀態(tài), 比如變量的值, 函數(shù)的返回值等等. 究竟怎么使用斷點(diǎn)呢?(1.F9在當(dāng)前光標(biāo)所在的行下斷點(diǎn), 如果當(dāng)前行已經(jīng)有斷點(diǎn), 則取消斷點(diǎn).F5調(diào)試狀態(tài)運(yùn)行程序, 程序執(zhí)行到有斷點(diǎn)的地方會(huì)停下來.F10單步執(zhí)行程序.CTRL+F10運(yùn)行到光標(biāo)所在行.F11和F10的區(qū)別是, 如果當(dāng)前執(zhí)行語句是函數(shù)調(diào)用, 則會(huì)進(jìn)入函數(shù)里面.SHIFT+F11跳出當(dāng)前所在函數(shù).特別
12、說明:a.有的地方不能下斷點(diǎn). 比如空行, 基本類型定義語句(不初始化, 等等非執(zhí)行語句. 比如 int i; / 此行不能下斷點(diǎn)int j=0;/ 這里可以下CStringstr;/ 這里可以下intk = Max(i,j;/ 這里可以下b.不是所有斷點(diǎn)都會(huì)(斷. 比如下斷點(diǎn)的語句在程序里面沒有被執(zhí)行.c.此外,ALT+F9還可以下條件斷點(diǎn),不過這個(gè)不常用,有興趣的可以自己研究:(2如何調(diào)試Release 版的程序?有些程序在debug 下運(yùn)行的很好, 但在release 下卻總是失敗, 默認(rèn)情況下release 是不能調(diào)試的. 怎么解決呢?其實(shí)"debug" 和&quo
13、t;release" 都只是一個(gè)代號(hào)而已, 各自對(duì)應(yīng)一組不同的編譯選項(xiàng).在release 的默認(rèn)設(shè)置下,ALT+F7 ,調(diào)出工程設(shè)置對(duì)話框, 切換到link 選項(xiàng)卡, 勾選"Genera te debug info",然后再切換到C/C+選項(xiàng)卡, 在"Optimizations" 里面選"Disable(Debug",在下面的"Debug info"里面選"Program Database for Edit and Continue".然后點(diǎn)OK 保存設(shè)置, 重新編譯程序, 下斷點(diǎn)即可.(3上面兩點(diǎn)已經(jīng)能應(yīng)付很多種情況了, 但是有時(shí)候即使在debug 下也不能下斷點(diǎn), 我以前也曾經(jīng)遇到過這種問題, 一個(gè)調(diào)了4層的dll, 就是不能下斷點(diǎn). 其實(shí)還除了上面的方法, 還有一種最底層的實(shí)現(xiàn)技術(shù):使用匯編.細(xì)心的人可能會(huì)發(fā)現(xiàn), 有時(shí)候在調(diào)試狀態(tài)下當(dāng)程序出現(xiàn)異常的時(shí)候, 光標(biāo)會(huì)指向匯編代碼, 而這個(gè)代碼就是int 3,這其實(shí)是一個(gè)中斷.在你的代碼的任意地方加
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《基于工作流的項(xiàng)目申報(bào)系統(tǒng)研究》
- 學(xué)生社團(tuán)組織中的領(lǐng)導(dǎo)力培養(yǎng)
- 2024通信行業(yè)通信網(wǎng)絡(luò)規(guī)劃與設(shè)計(jì)保密合同3篇
- 2025年中國(guó)救生服行業(yè)市場(chǎng)深度分析及發(fā)展前景預(yù)測(cè)報(bào)告
- 三維可視化橋梁安全監(jiān)測(cè)解決方案
- 工業(yè)互聯(lián)網(wǎng)平臺(tái)在智能供應(yīng)鏈中的實(shí)踐
- 商業(yè)世界中的家庭旅行文化打造
- 《破產(chǎn)重整程序中債轉(zhuǎn)股法律問題研究》
- 2024版股權(quán)轉(zhuǎn)讓合同范本2篇
- 2024框架合同合作標(biāo)的概述
- 校長(zhǎng)在評(píng)估反饋會(huì)上的表態(tài)發(fā)言稿(5篇)
- 個(gè)人貸款業(yè)務(wù)營(yíng)銷技巧課件
- 新人教版小學(xué)三年級(jí)數(shù)學(xué)上冊(cè)知識(shí)點(diǎn)整理歸納培訓(xùn)課件
- 霉菌性陰道炎VVC的分類及診治
- 預(yù)制艙技術(shù)方案思源弘瑞課件
- 四年級(jí)科學(xué)《運(yùn)動(dòng)與摩擦力》說課課件
- 訴訟費(fèi)退費(fèi)確認(rèn)表
- 全球變暖視野下中國(guó)與墨西哥的能源現(xiàn)狀分析
- 新外研版八年級(jí)上冊(cè)英語全冊(cè)教案(教學(xué)設(shè)計(jì))
- 2022年(高級(jí))茶藝師職業(yè)資格考試參考題庫-下(多選、判斷題部分)
- 邊坡安全施工組織方案
評(píng)論
0/150
提交評(píng)論