vc6.0安裝教程與調(diào)試技巧_第1頁
vc6.0安裝教程與調(diào)試技巧_第2頁
vc6.0安裝教程與調(diào)試技巧_第3頁
vc6.0安裝教程與調(diào)試技巧_第4頁
vc6.0安裝教程與調(diào)試技巧_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、vc6.0的安裝過程1.首先解壓安裝文件的壓縮包VC6.UWinEAE壓縮文件407,285KB2.然后再選擇安裝的版本,VC6CN表示的是中文版,VC6EN表示英文版。xVC&.0VC6VC6EW3打開VC6CN文件夾,其中有如下圖標(biāo),鼠標(biāo)雙擊。SETUPMiizrosoftC:rpor.4.如下圖所示就是我們安裝的第一步,單擊下一步。5.選擇“接受協(xié)議”后單擊下一步。6本軟件屬于破解版,故無需輸入產(chǎn)品ID號碼,直接單擊下一步。7選擇“安裝visualC+6.0中文企業(yè)版”,這就是我們要安裝的程序,單擊下一步。8.單擊下一步。isualC+6.0中文企業(yè)IK安裝向?qū)+6.0中文企業(yè)版轆謡餌

2、歸嚴(yán)5工作站的產(chǎn)品和躥選擇“服務(wù)器應(yīng)用程序”可以跳過工作站程序的安裝直接進(jìn)入服務(wù)器安裝選項(xiàng)自定岌-服務(wù)器安裝程序選項(xiàng)倍叢裝強(qiáng)託巫衛(wèi)旺亙衛(wèi)里丈査亞膜r服務(wù)器應(yīng)用程序丨下一歩退出I9.如下界面,單擊“繼續(xù)”,開始安裝軟件。FroductIII:82903-2T0-T5926T6-9T491確運(yùn)潔將此編號寫在您的登記卡上的指定位置-軟件安裝完成后,單擊“幫助”菜單中的“關(guān)于.”命令可查看此編號雷倔停礙韻您向11.選擇“是”,繼續(xù)安裝。12.選擇“typical”繼續(xù)安裝VisualC+6.Enterprise安裝程序潔選擇安裝類型,并單擊相應(yīng)按鈕-arTypicalEmtupwillinstallt

3、hmmosttypicalcomporLerLtE.Expecttouse267_308MBofhardiirivespaceCustOBwi11alluwyoutocustomizewhichcomporLerLtoinst:=lL1文件夾:C:.MicrosoftVisualStudioVC9813.選擇“ok”。選擇“確定”VindoTSKTDebugSymbolsSeitLLphasinstalltiilaniconinthe:MicrosoftVisualC+6.0Toolsprogi_:djngi_oup,th:qtwillallowyoutoinstallNTsystEmEj-T

4、Tibuls(.DBG)filesfromyum-VisualC+CD-ROM.Ifthe:Ej-TTibol5are:TetitL三tallolthe:VisualC+detodeiterrTiirLethe:contmxtofcalledtunctiotL弓.Foreasierapplicationdebuggingiti弓弓tronglyrecorrinierLdedth:qtyouinstallthesefiles.Seethe:VisualC+Reailneformoreinformation.選擇“確定”,16取消“安裝MSDN”前面的勾號,選擇“退出”。17.選擇“是”,取消MS

5、DN的安裝。目錄中選擇“MicrosoftVisualC+6.0”就可以運(yùn)行程序了。也可以將這個圖標(biāo)發(fā)送到桌面快捷方式,這樣就可以直接在桌面上運(yùn)行程序。調(diào)試技巧調(diào)試程序可以幫助的了解程序是怎樣運(yùn)行的。1、如何快速地規(guī)范代碼縮進(jìn)格式選中所需要規(guī)范的代碼,按shift+F82、如何在Release狀態(tài)下進(jìn)行調(diào)試ProjectSettingProjectSettings對話框,選擇Release狀態(tài)。CC+標(biāo)簽頁中的Category選General,Optimizations選Disable(Debug),Debuginfo選ProgramDatabase。在in標(biāo)簽頁中選中Generatedebu

6、ginfo復(fù)選框。注:只是一個介乎Debug和Release的中間狀態(tài),所有的ASSERT、VERIFY都不起作用,函數(shù)調(diào)用方式已經(jīng)是真正的調(diào)用,而不查表,但是這種狀態(tài)下QuickWatch、調(diào)用隊(duì)列跟蹤功能仍然有效,和Debug版一樣。3、Release和Debug有什么不同。Release版稱為發(fā)行版,Debug版稱為調(diào)試版。Debug中可以單步執(zhí)行、跟蹤等功能,但生成的可執(zhí)行文件比較大,代碼運(yùn)行速度較慢。Release版運(yùn)行速度較快,可執(zhí)行文件較小,但在其編譯條件小無法執(zhí)行調(diào)試功能。Release的exe文件鏈接的是標(biāo)準(zhǔn)的MFCDLL(UseMFCinasharedorstaticdll

7、),比如MFC42.DLL。這些DLL在安裝Windows的時候,已經(jīng)配置,所以這些程序能夠在沒有安裝VisualC+6.0的機(jī)器上運(yùn)行。而Debug版本的exe鏈接了調(diào)試版本的MFCDLL文件,如MFC42D.DLL。在沒有安裝VisualC+6.0的機(jī)器上不能運(yùn)行,因?yàn)槿盡FC42D.DLL等,除非選擇usestaticdllwhenlink。4、ASSERT和VERIFY有什么區(qū)別ASSERT里面的內(nèi)容在Release版本中不編譯,VERIFY里面的內(nèi)容仍然編譯,但不再判斷真假。所以后者更安全一點(diǎn)。例如ASSERT(file.Open(strFileName),旦到了Release版本中

8、,這一行就忽略了,file根本就不Open()了,而且沒有任何出錯的信息。如果用VERIFY。就不會有這個問題。5、Workspace和Project之間是什么樣的關(guān)系每個Workspace可以包括幾個project,但只有一個處于Active狀態(tài),各個project之間可以有依賴關(guān)系,在project的Setting中可以設(shè)定,比如那個Active狀態(tài)的project可以依賴于其他的提供其函數(shù)調(diào)用的靜態(tài)庫。6、如何在非MFC程序中使用ClassWizard在工程目錄下新建一個空的.RC文件,然后加入到工程中就可以了。7、如何設(shè)置斷點(diǎn)按F9在當(dāng)前光標(biāo)處增加一個斷點(diǎn)和取消一個斷點(diǎn)。另外,在編輯狀

9、態(tài)下,按Ctrl+B組合鍵,彈出斷點(diǎn)設(shè)置對話框。然后單擊【Condition】按鈕彈出設(shè)置斷點(diǎn)條件的對話框進(jìn)行設(shè)置。8、在編輯狀態(tài)下發(fā)現(xiàn)成員變量或函數(shù)不能顯示提示,如何打開顯示功能這似乎是目前這個VisualC+6.0版本的一個bug,可按如下步驟使其正常,如再出現(xiàn),可如法炮制:(1)關(guān)閉Project,(2)刪除工程名.neb文件,(3)重新打開工程9、如何將一個通過ClassWizard生成的類徹底刪除首先在工作區(qū)的FileView中選中該類的.h和.cpp文件,按delete刪除,然后在文件管理器中將這兩個文件刪除,再運(yùn)行ClassWizard,這時出現(xiàn)是否移走該類的提示,選擇remov

10、e就可以了。10、如何將再Workspace中消失的類找出來打開該類對應(yīng)的頭文件,然后將其類名隨便改一下,這個時候工作區(qū)就會出現(xiàn)新的類,再將這個類改回原來的名字就可以了。還可以用以下方法:(1)關(guān)閉VC,刪除文件夾中的*.clw文件,然后重新打開VC,重建。(2)備份.h和.cpp文件,然后刪除.h和.cpp文件,重新加入。(3)在ClassWizard中為這個類生成一個消息處理函數(shù),你就可以在ClassView中看到了,這樣可以不用關(guān)閉、重啟VC。你可以手工刪除加進(jìn)的函數(shù)。11、如何清除所有的斷點(diǎn)菜單【Edt】一【reakpoints】,打開reakpoint對話框,單擊【RemoveAll

11、】按鈕即可??旖萱I是Ctrl+Shit+F812、如何再ClassWizard中選擇未列出的信息打開ClassWizard對話框,然后切換到Classn頁面。改變Messageilter如選擇WindowMessage頁面就會出現(xiàn)Window的信息。13、如何檢測程序中的括號是否匹配把光標(biāo)移動到需要檢測的括號前面,按快捷鍵Ctrl+如果括號匹配正確,光標(biāo)就跳到匹配的括號處,否則光標(biāo)不移動,并且機(jī)箱喇叭還會發(fā)出一聲警告。14、如何查看一個宏(或變量、函數(shù))的定義把光標(biāo)移動到要查看的一個宏上,就比如說最常見的DECLARE_MAP_MESSAGE上按一下F12(或右鍵菜單中的相關(guān)菜單),如果沒有建

12、立瀏覽文件,就會出現(xiàn)提示對話框,按【確定】按鈕,然后就會跳到該宏(或變量、函數(shù))定義的地方。15、如何添加Lib文件到當(dāng)前工程單擊菜單Project】一【Settings】彈出Projectsetting對話框,切換到Link”簽頁,在Objectlibrarymodule處輸入Lib文件名稱,不同的Lib之間用空格格開。16、如何快速刪除項(xiàng)目下的Debug文件夾中臨時文件在工作區(qū)的FileView視圖中選中對應(yīng)的項(xiàng)目,單擊右鍵彈出菜單,選擇【Clean(selectiononly)】菜單即可。17、如何快速生成一個現(xiàn)有工程除了工程名外完全相同的新工程。在新建工程的New對話框中選擇Custo

13、mAppwizard”,輸入新工程的名字,單擊【OK】按鈕。出現(xiàn)CustomAppWizard”,輸入新工程的名字,單擊【OK】按鈕。出現(xiàn)CustomAppWizardStep1o2對話框,選擇AnexistingProject如,單擊【Next】按鈕。出現(xiàn)CustomAppWizarStep2o2對話框,選擇現(xiàn)有工程的工程文件名,最后單擊【Finish】按鈕。編譯后就生成一個與現(xiàn)有工程相同但可以重新取名的工程AppWizard?,F(xiàn)在就可以項(xiàng)用MFCAppWizard一樣用這個定制的向?qū)?。如果不想用了,可以在VisualC+6.0安裝目錄下CommonMSDev98Template目錄中刪除該

14、Wizard對應(yīng)的.awx和.pdb文件。18、如何解決VisualC+6.0不正確連接的問題情景:明明之間改動了一個文件,卻要把整個項(xiàng)目全部重新編譯鏈接一次。剛剛鏈接好,一運(yùn)行,又提示重新編譯鏈接一次。這是因?yàn)槌霈F(xiàn)了未來文件(修改時間和創(chuàng)建時間比系統(tǒng)時間晚)的緣故??梢赃@樣處理:找到工程文件夾下的debug目錄,將創(chuàng)建和修改時間都比系統(tǒng)時間晚的文件全部刪除,然后再重新RebuildAl一次。19、引起LNK2001的常見錯誤都有哪些遇至U的LNK2001錯誤主要為:unresoledexternalsmbolsmbol如果鏈接程序不能在所有的庫和目標(biāo)文件內(nèi)找到所引用的函數(shù)、變量或標(biāo)簽,將產(chǎn)生

15、此錯誤信息。一般來說,發(fā)生錯誤的原因有兩個:一時所引用的函數(shù)、變量不存在,拼寫不正確或者使用錯誤;其次可能使用了不同版本的鏈接庫。一下是可能產(chǎn)生LNK2001錯誤的原因:1、由于編碼錯誤導(dǎo)致的LNK2001錯誤1)不相匹配的程序代碼或模塊定義(.DEF)文件導(dǎo)致LNK2OO1。例如,如果在C+源文件了內(nèi)聲明了一變量ar1卻視圖在另一個文件內(nèi)以變量a訪問改變量。2)如果使用的內(nèi)聯(lián)函數(shù)是在.cpp文件內(nèi)定義的,而不是在頭文件內(nèi)定義將導(dǎo)致LNK2001錯誤。3)調(diào)用函數(shù)是如果所用的參數(shù)類型頭函數(shù)聲明是的類型不符將會產(chǎn)生LNK2001錯誤。4)視圖從基類的構(gòu)造函數(shù)或析構(gòu)函數(shù)中調(diào)用虛擬函數(shù)時將會導(dǎo)致LN

16、K2001錯誤。5)要注意函數(shù)和變量的可公用性,只有全局變量、函數(shù)時可公用的。靜態(tài)函數(shù)和靜態(tài)變量具有相同的使用范圍限制。當(dāng)試圖從文件外部方位任何沒有在該文件內(nèi)聲明的靜態(tài)變量時將導(dǎo)致編譯錯誤或LNK2001錯誤。2、由于編譯和聯(lián)機(jī)的設(shè)置而造成的LNK2001錯誤1)如果編譯時使用的時/NOD(/NODERAULTLIB)選項(xiàng),程序所需要的運(yùn)行庫和MFC時將得至又編譯器寫入目標(biāo)文件模塊,但除非在文件中明確包含這些庫名,否則這些庫不會北鏈接進(jìn)工程文件。這種情況下使用/NOD將導(dǎo)致LNK2001錯誤2)如果沒有為wWinMainCRTStartup設(shè)定程序入口,在使用Unicode和MFC時講的到un

17、resoledexternalon_WinMain1的LNK2001錯誤信息。3)使用/MD選項(xiàng)編譯時,既然所有的運(yùn)行庫都被保留在動態(tài)鏈接庫之內(nèi),源文件中對func的引用,在目標(biāo)文件里即對imp_fun啲引用。如果試圖使用靜態(tài)庫LIBC.LIB或LIBCMT.LIB進(jìn)行鏈接,將在impfunc上發(fā)生LNK2001錯誤。如果不使用/MD選項(xiàng)編譯,在使用MSVCxx.LIB鏈接時也會發(fā)生LNK2001錯誤。4)使用/ML選項(xiàng)編譯時,如用LIBCMT.LIB鏈接回在_errno上發(fā)生LNK2001錯誤。5)當(dāng)編譯調(diào)試版的應(yīng)用程序時,如果采用發(fā)行版模態(tài)庫進(jìn)行鏈接也會產(chǎn)生LNK2001錯誤;同樣,使用調(diào)

18、試版模態(tài)庫鏈接發(fā)行版應(yīng)用程序時也會產(chǎn)生相同的錯誤。6)不同版本的庫和編譯器的混合使用也能產(chǎn)生問題,因?yàn)樾掳娴膸炖锟赡馨缦鹊陌姹緵]有的符號和說明。7)在不同的模塊中使用內(nèi)聯(lián)和非內(nèi)聯(lián)的編譯選項(xiàng)能夠?qū)е翷NK2001錯誤。如果創(chuàng)建C+庫時打開了函數(shù)內(nèi)聯(lián)(/Ob1或/0b2),但是在描述該函數(shù)的相應(yīng)頭問卷安里卻關(guān)閉了函數(shù)內(nèi)聯(lián)(沒有inline關(guān)鍵字),只是將得到錯誤信息。為避免該問題的發(fā)生,應(yīng)該在相應(yīng)的頭文件中用inline關(guān)鍵字標(biāo)志為內(nèi)聯(lián)函數(shù)。8)不正確的/SUBSYSTEM或ENTRY設(shè)置也能導(dǎo)致LNK2001錯誤。20、如何調(diào)試一個沒有源碼的exe文件調(diào)用的dll在VisualC+6.0中,

19、進(jìn)入ProjectSetting對寸話框然后選擇Debug標(biāo)簽頁。通常VisualStudio默認(rèn)executablefordebugsession為可執(zhí)行文件名,但可以將他改成任何你想要的程序。甚至可以指定不同的工作目錄以及傳遞參數(shù)到你的程序。這個技術(shù)常用來調(diào)試Dlls、名字空間擴(kuò)展、COM對象和其他從某些EXE以及從第三方的EXE中調(diào)用的plug-in程序。21、VisualC+6.0工程中的項(xiàng)目文件都表示什么。.opt:工程關(guān)于開發(fā)化境的參數(shù)文件,如工具條位置等信息。.aps(AppStudioFile):資源輔助文件,二進(jìn)制格式,一般不用去管他。.clw:ClassWizard信息文件

20、,實(shí)際上是INI文件格式,又興趣可以研究一下。有時候ClassWizard出了問題,手工修改CLW文件可以解決。如果此文件不存在的話,每次用ClassWizard的時候會提示是否重建。.dsp(DevelopStudioProject):項(xiàng)目文件,文本格式,不過不熟悉的不要手工修改。.dsw(DevelopStudioWorkspace):是工作區(qū)文件,其他特點(diǎn)和.dsp差不多。.plg:是編譯信息文件,編譯時的error和warning信息文件(實(shí)際上時一個html文件),一般用處不大。在單擊菜單【Tool】一【Option】彈出的對話框里面有個選項(xiàng)可以控制這個文件的生成。.hpj(Help

21、Project):是生成幫助文件的工程,用microsoftHelpCompiler可以處理。.mdp(MicrosoftDevStudioProject):是舊版本的項(xiàng)目文件,如果要打開此文件的話,會提示你是否轉(zhuǎn)換成新的.dsp格式。.bsc:是用于瀏覽項(xiàng)目信息的,如果用SourceBrower的話就必須用這個文件。如果不用這個功能的話,可以在ProjectOptions里面去掉GenerateBrowseInfoFile,這樣可以加快編譯速度。.map:是執(zhí)行文件的影像信息記錄文件,除非對系統(tǒng)底層,這個文件一般用不著。.pch(Pre-CompiledFile):可以加快編譯速度,但是文件

22、非常大。.pdb(ProgramDatabase):記錄了程序有關(guān)的一些數(shù)據(jù)和調(diào)試信息,在調(diào)試的時候可能有用。.exp:只有在編譯DLL的時候才會生成,記錄了DLL文件的一些信息,一般也沒有用。.neb:無編譯瀏覽文件(nocompilebrowser)0當(dāng)自動完成功能出問題時可以刪除此文件,編譯工程后會自動生成推薦不錯的VC調(diào)試入門概述調(diào)試是一個程序員最基本的技能,其重要性甚至超過學(xué)習(xí)一門語言。不會調(diào)試的程序員就意味著他即使會一門語言,卻不能編制出任何好的軟件。這里我簡要的根據(jù)自己的經(jīng)驗(yàn)列出調(diào)試中比較常用的技巧,希望對大家有用。本文約定,在選擇菜單時,通過/表示分級菜單,例如File/Ope

23、n表示頂級菜單File的子菜單Open。設(shè)置為了調(diào)試一個程序,首先必須使程序中包含調(diào)試信息。一般情況下,一個從AppWizard創(chuàng)建的工程中包含的DebugConfiguration自動包含調(diào)試信息,但是是不是Debug版本并不是程序包含調(diào)試信息的決定因素,程序設(shè)計(jì)者可以在任意的Configuration中增加調(diào)試信息,包括Release版本。為了增加調(diào)試信息,可以按照下述步驟進(jìn)行:打開Projectsettings對話框(可以通過快捷鍵ALT+F7打開,也可以通過IDE菜單Project/Settings打開)選擇C/C+頁,Category中選擇general,則出現(xiàn)一個DebugInfo

24、下拉列表框,可供選擇的調(diào)試信息方式包括:命令行Projectsettings說明無None沒有調(diào)試信息/ZdLineNumbersOnly目標(biāo)文件或者可執(zhí)行文件中只包含全局和導(dǎo)出符號以及代碼行信息,不包含符號調(diào)試信息/Z7C7.0-Compatible目標(biāo)文件或者可執(zhí)行文件中包含行號和所有符號調(diào)試信息,包括變量名及類型,函數(shù)及原型等/ZiProgramDatabase創(chuàng)建一個程序庫(PDB),包括類型信息和符號調(diào)試信息。/ZIProgramDatabaseforEditandContinue除了前面/Zi的功能外,這個選項(xiàng)允許對代碼進(jìn)行調(diào)試過程中的修改和繼續(xù)執(zhí)行。這個選項(xiàng)同時使#pragma設(shè)

25、置的優(yōu)化功能無效選擇Link頁,選中復(fù)選框GenerateDebugInfo,這個選項(xiàng)將使連接器把調(diào)試信息寫進(jìn)可執(zhí)行文件和DLL如果C/C+頁中設(shè)置了ProgramDatabase以上的選項(xiàng),則Linkincrementally可以選擇。選中這個選項(xiàng),將使程序可以在上一次編譯的基礎(chǔ)上被編譯(即增量編譯),而不必每次都從頭開始編譯。斷點(diǎn)斷點(diǎn)是調(diào)試器設(shè)置的一個代碼位置。當(dāng)程序運(yùn)行到斷點(diǎn)時,程序中斷執(zhí)行,回到調(diào)試器。斷點(diǎn)是最常用的技巧。調(diào)試時,只有設(shè)置了斷點(diǎn)并使程序回到調(diào)試器,才能對程序進(jìn)行在線調(diào)試。設(shè)置斷點(diǎn):可以通過下述方法設(shè)置一個斷點(diǎn)。首先把光標(biāo)移動到需要設(shè)置斷點(diǎn)的代碼行上,然后按F9快捷鍵彈出

26、Breakpoints對話框,方法是按快捷鍵CTRL+B或ALT+F9,或者通過菜單Edit/Breakpoints打開。打開后點(diǎn)擊Breakat編輯框的右側(cè)的箭頭,選擇合適的位置信息。一般情況下,直接選擇linexxx就足夠了,如果想設(shè)置不是當(dāng)前位置的斷點(diǎn),可以選擇Advaneed,然后填寫函數(shù)、行號和可執(zhí)行文件信息。去掉斷點(diǎn):把光標(biāo)移動到給定斷點(diǎn)所在的行,再次按F9就可以取消斷點(diǎn)。同前面所述,打開Breakpoints對話框后,也可以按照界面提示去掉斷點(diǎn)。條件斷點(diǎn):可以為斷點(diǎn)設(shè)置一個條件,這樣的斷點(diǎn)稱為條件斷點(diǎn)。對于新加的斷點(diǎn),可以單擊Conditions按鈕,為斷點(diǎn)設(shè)置一個表達(dá)式。當(dāng)這個

27、表達(dá)式發(fā)生改變時,程序就被中斷。底下設(shè)置包括“觀察數(shù)組或者結(jié)構(gòu)的元素個數(shù)”,似乎可以設(shè)置一個指針?biāo)赶虻膬?nèi)存區(qū)的大小,但是我設(shè)置一個比較的值但是改動范圍之外的內(nèi)存區(qū)似乎也導(dǎo)致斷點(diǎn)起效。最后一個設(shè)置可以讓程序先執(zhí)行多少次然后才到達(dá)斷點(diǎn)。數(shù)據(jù)斷點(diǎn):數(shù)據(jù)斷點(diǎn)只能在Breakpoints對話框中設(shè)置。選擇“Data”頁,就顯示了設(shè)置數(shù)據(jù)斷點(diǎn)的對話框。在編輯框中輸入一個表達(dá)式,當(dāng)這個表達(dá)式的值發(fā)生變化時,數(shù)據(jù)斷點(diǎn)就到達(dá)。一般情況下,這個表達(dá)式應(yīng)該由運(yùn)算符和全局變量構(gòu)成,例如:在編輯框中輸入g_bFlag這個全局變量的名字,那么當(dāng)程序中有g(shù)_bFlag=!g_bFlag時,程序就將停在這個語句處。消息斷點(diǎn)

28、:VC也支持對Windows消息進(jìn)行截獲。他有兩種方式進(jìn)行截獲:窗口消息處理函數(shù)和特定消息中斷。在Breakpoints對話框中選擇Messages頁,就可以設(shè)置消息斷點(diǎn)。如果在上面那個對話框中寫入消息處理函數(shù)的名字,那么每次消息被這個函數(shù)處理,斷點(diǎn)就到達(dá)(我覺得如果采用普通斷點(diǎn)在這個函數(shù)中截獲,效果應(yīng)該一樣)。如果在底下的下拉列表框選擇一個消息,則每次這種消息到達(dá),程序就中斷。WatchVC支持查看變量、表達(dá)式和內(nèi)存的值。所有這些觀察都必須是在斷點(diǎn)中斷的情況下進(jìn)行。觀看變量的值最簡單,當(dāng)斷點(diǎn)到達(dá)時,把光標(biāo)移動到這個變量上,停留一會就可以看到變量的值。VC提供一種被成為Watch的機(jī)制來觀看變

29、量和表達(dá)式的值。在斷點(diǎn)狀態(tài)下,在變量上單擊右鍵,選擇QuickWatch,就彈出一個對話框,顯示這個變量的值。單擊Debug工具條上的Watch按鈕,就出現(xiàn)一個Watch視圖(Watch1,Watch2,Watch3,Watch4),在該視圖中輸入變量或者表達(dá)式,就可以觀察變量或者表達(dá)式的值。注意:這個表達(dá)式不能有副作用,例如+運(yùn)算符絕對禁止用于這個表達(dá)式中,因?yàn)檫@個運(yùn)算符將修改變量的值,導(dǎo)致軟件的邏輯被破壞。Memory由于指針指向的數(shù)組,Watch只能顯示第一個元素的值。為了顯示數(shù)組的后續(xù)內(nèi)容,或者要顯示一片內(nèi)存的內(nèi)容,可以使用memory功能。在Debug工具條上點(diǎn)memory按鈕,就彈

30、出一個對話框,在其中輸入地址,就可以顯示該地址指向的內(nèi)存的內(nèi)容。VariblesDebug工具條上的Varibles按鈕彈出一個框,顯示所有當(dāng)前執(zhí)行上下文中可見的變量的值。特別是當(dāng)前指令涉及的變量,以紅色顯示。寄存器Debug工具條上的Reigsters按鈕彈出一個框,顯示當(dāng)前的所有寄存器的值。進(jìn)程控制VC允許被中斷的程序繼續(xù)運(yùn)行、單步運(yùn)行和運(yùn)行到指定光標(biāo)處,分別對應(yīng)快捷鍵F5、F10/F11和CTRL+F10。各個快捷鍵功能如下:快捷鍵說明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)處。CallStack

31、調(diào)用堆棧反映了當(dāng)前斷點(diǎn)處函數(shù)是被那些函數(shù)按照什么順序調(diào)用的。單擊Debug工具條上的Callstack就顯示CallStack對話框。在CallStack對話框中顯示了一個調(diào)用系列,最上面的是當(dāng)前函數(shù),往下依次是調(diào)用函數(shù)的上級函數(shù)。單擊這些函數(shù)名可以跳到對應(yīng)的函數(shù)中去。其他調(diào)試手段系統(tǒng)提供一系列特殊的函數(shù)或者宏來處理Debug版本相關(guān)的信息,如下:宏名/函數(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)用此

32、函數(shù)的前提條件。例如,對于一個還沒有創(chuàng)建的窗口調(diào)用SetWindowText等。VERIFY和ASSERT功能類似,所不同的是,在Release版本中,ASSERT不計(jì)算輸入的表達(dá)式的值,而VERIFY計(jì)算表達(dá)式的值。關(guān)注一個好的程序員不應(yīng)該把所有的判斷交給編譯器和調(diào)試器,應(yīng)該在程序中自己加以程序保護(hù)和錯誤定位,具體措施包括:對于所有有返回值的函數(shù),都應(yīng)該檢查返回值,除非你確信這個函數(shù)調(diào)用絕對不會出錯,或者不關(guān)心它是否出錯。一些函數(shù)返回錯誤,需要用其他函數(shù)獲得錯誤的具體信息。例如accept返回INVALID_SOCKET表示accept失敗,為了查明具體的失敗原因,應(yīng)該立刻用WSAGetLa

33、stError獲得錯誤碼,并針對性的解決問題。有些函數(shù)通過異常機(jī)制拋出錯誤,應(yīng)該用TRY-CATCH語句來檢查錯誤程序員對于能處理的錯誤,應(yīng)該自己在底層處理,對于不能處理的,應(yīng)該報(bào)告給用戶讓他們決定怎么處理。如果程序出了異常,卻不對返回值和其他機(jī)制返回的錯誤信息進(jìn)行判斷,只能是加大了找錯誤的難度。另外:VC中要編制程序不應(yīng)該一開始就寫cpp/h文件,而應(yīng)該首先創(chuàng)建一個合適的工程。因?yàn)橹挥羞@樣,VC才能選擇合適的編譯、連接選項(xiàng)。對于加入到工程中的cpp文件,應(yīng)該檢查是否在第一行顯式的包含stdafx.h頭文件,這是MicrosoftVisualStudio為了加快編譯速度而設(shè)置的預(yù)編譯頭文件。在

34、這個#“cludestdafx.h行前面的所有代碼將被忽略,所以其他頭文件應(yīng)該在這一行后面被包含。對于.c文件,由于不能包含stdafx.h,因此可以通過Projectsettings把它的預(yù)編譯頭設(shè)置為“不使用”,方法是:彈出Projectsettings對話框選擇C/C+Category選擇PrecompilationHeader選擇不使用預(yù)編譯頭。ps:DLL的調(diào)試假設(shè):要調(diào)試hook.dllhook.hhook.lib1。建立一個新工程Test,將hook整個工程目錄拷貝到Test目錄下2。在Test工程中需要用到hook.dll的源文件中(或stdafx.h中)加入#inelude.

35、hookhook.h這樣在該源文件中使用:就可以索引到hook.h中所有的導(dǎo)出函數(shù)、變量以及類3。在Test的工程設(shè)置-Link-Object/librarymodules中加入./hook/debug/hook.lib4。編譯連接好Test之后,發(fā)現(xiàn)未找到hook.dll.這需要設(shè)置path.可以在工程設(shè)置-Debug-Workingdirectory中加入e:Testhookdebug也可以在autoexe.bat中設(shè)置路徑5。通過工程-1nsertProjectintoWorkspace將hook.dsp工程加入Test項(xiàng)目中。6。設(shè)置hook工程為活動工程,在工程DebugExecut

36、ableforDebugsession中加入:e:testdebugtest.exe7?,F(xiàn)在設(shè)置斷點(diǎn),按F5可以正常調(diào)試了注意:當(dāng)調(diào)試的DLL被映射到其他的應(yīng)用程序(非TEST)進(jìn)程空間并運(yùn)行時,在該DLL中設(shè)置的斷點(diǎn)無效,當(dāng)然可以通過MessageBox來查看變量,若該DLL是MFC擴(kuò)展DLL,則還可以用TRACE或afxDump來查看變量。有效的dll調(diào)試方法:方法:對DLL的工程DEBUG,在DLL工程的ProjectSetting-Debug-Executablefordebugsession中加入你的.exe的路徑和名字。可以在dll中設(shè)置斷點(diǎn),.exe程序必須要調(diào)用dll中函數(shù)。調(diào)

37、試方法和技巧便于調(diào)試的代碼風(fēng)格:不用全局變量所有變量都要初始化,成員變量在構(gòu)造函數(shù)中初始化盡量使用const詳盡的注釋VC+編譯選項(xiàng):總是使用/W4警告級別在調(diào)試版本里總是使用/GZ編譯選項(xiàng),用來發(fā)現(xiàn)在Release版本中才有的錯誤沒有警告的編譯:保證在編譯后沒有任何警告,但是在消除警告前要進(jìn)行仔細(xì)檢查調(diào)試方法:1、使用Assert(原則:盡量簡單)assert只在debug下生效,release下不會被編譯。例子:char*strcpy(char*dest,char*source)assert(source!=0);assert(dest!=0);char*returnstring=dest;while(*dest+=*source+)!=0),returnreturnstring;2、防御性的編程例子:char*strcpy(char*d

溫馨提示

  • 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

提交評論