編寫的程序有可能出現(xiàn)異常,,結(jié)果與預(yù)想的有差異等情況,,這時就需要調(diào)試程序,下面列出一些調(diào)試的方法(僅限本地調(diào)試方法),。
啟動調(diào)試器
常用的啟動調(diào)試器的方法自不說?,F(xiàn)說一下在沒有源代碼,或不允許停止應(yīng)用程序的情況下調(diào)試的方法: 啟動應(yīng)用程序,,然后啟動visual studio,,打開工程,選擇“調(diào)試”中的“附加到進程”,,如下圖(示例圖都是英文版的),。
如果希望停止調(diào)試,但是不想停止應(yīng)用程序的運行,,可以選擇“調(diào)試”中的“全部分離”,,如下圖。
設(shè)置斷點
斷點設(shè)置在visual studio調(diào)試中最常用到的方法,。最通常的方法不必說,。下面介紹些你可能不曾用到,但有時是非常方便的方法,。
設(shè)置函數(shù)斷點
我們可以在函數(shù)內(nèi)的指定位置添加斷點,。方法是選擇“調(diào)試”->“新建斷點”->“在函數(shù)處中斷”,然后會彈出如下對話框:
輸入函數(shù)名和行號即可,注意填寫的是空白行和注釋行的行號,,會自動調(diào)整為代碼行的行號,。
如果想在動態(tài)鏈接庫的導(dǎo)出函數(shù)上加斷點,如果已經(jīng)加載了符號文件,,則需要按照 _funcname@param*4格式來寫,。例如要在LoadLibraryW上添加斷點,,可以如下寫:_LoadLibraryW@4;如果沒有加載符號文件,,需要設(shè)置“加載DLL導(dǎo)出”(如下圖),,然后在文本框輸入導(dǎo)出函數(shù)名。例如:LoadLibraryW,。 這種情況下沒有函數(shù)前的下劃線和后面的參數(shù),。
設(shè)置數(shù)據(jù)斷點
當(dāng)希望某個變量變化時中斷或某個地址變化時中斷,可以設(shè)置數(shù)據(jù)斷點,。啟動程序后,,中斷程序,然后在斷點窗口選擇新建,,選擇新建數(shù)據(jù)斷點(如下圖),,彈出如下對話框:
輸入一個地址或地址表達式,選擇字節(jié)計數(shù)和語言,,注意是地址,,所以如果是看某個成員變量是否變化,記得加“&”,。
數(shù)據(jù)斷點變化實際上是指定內(nèi)存的變化,,如果輸入的變量的地址發(fā)生變化,該斷點將不代表該變量的變化,。
設(shè)置斷點中斷條件
當(dāng)在指定代碼上設(shè)置了斷點,,可以進一步設(shè)置中斷條件和斷點命中次數(shù),方法是在斷點窗口,,選擇該斷點,,點擊右鍵,在右鍵菜單中選擇相應(yīng)項,。
在條件表達式中需要注意:只能使用C類型的比較運算符,;不能調(diào)用函數(shù);不能包含宏,。不過可以使用偽寄存器,。下面列出一些偽寄存器?!?/span>
@ERR 最后一個錯誤值,,GetLastError返回的值
@TIB 線程信息塊地址??梢杂脕碇付ň€程條件,。
@CLK 時鐘寄存器
@EAX @EBX @ECX @EDX @ESI @EDI @EIP @ESP @EBP @EFL Intel CPU寄存器
@CS @DS @ES @SS @FS @GS Intel CPU段寄存器
@ST0 @ST1 @ST2 @ST3 @ST4 @ST5 @ST6 @ST7 Intel CPU浮點寄存器
從堆棧窗口設(shè)置斷點
在堆棧窗口,在中斷模式下,右擊函數(shù)調(diào)用,,然后從快捷菜單“斷點”子菜單中選擇“插入斷點”,。斷點符號出現(xiàn)在函數(shù)調(diào)用名稱旁的左邊距中。
通過代碼設(shè)置斷點
在代碼中也可以設(shè)置斷點,,使用DebugBreak()函數(shù)可以拋出一個中斷異常,。這樣可以用代碼來控制各種中斷條件。
設(shè)置跟蹤點
有的時候我們只是想跟蹤代碼運行,,希望運行到代碼某些位置后可以輸出信息而不是中斷程序執(zhí)行,,這時候可以設(shè)置跟蹤點。方法是在代碼行右鍵選擇斷點,、插入跟蹤點,。彈出一個對話框設(shè)置命中斷點條件后的輸出信息,。代碼左側(cè)會顯示一個菱形的跟蹤點標記,。
設(shè)置地址斷點
當(dāng)希望在沒有源代碼的地方加斷點,比如CreateProcess函數(shù)的入口加斷點,,可以設(shè)置地址斷點,,不過需要先找到該函數(shù)的入口地址,這可以通過反匯編代碼(在調(diào)試菜單的窗口子菜單中打開反匯編代碼的窗口)找到,。找到后,,在該匯編代碼處右鍵單擊代碼行,在彈出菜單中選擇斷點,,插入斷點,。
服務(wù)程序調(diào)試
由于服務(wù)程序本身是由系統(tǒng)啟動,所以不能采用visual studio直接啟動調(diào)試,,也不能采用進程綁定的方法,。需要在服務(wù)進程啟動的時候自動啟動調(diào)試器,具體設(shè)置方法如下:
打開注冊表,,定位到HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/currentversion/image file execution options下,。
新建項,命名為服務(wù)程序的名字,,例如MyService.exe,。在該項下新建字符串類型的鍵,命名為debugger,鍵值為vsjitdebugger.exe,。關(guān)閉注冊表,。如下圖:
配置服務(wù)程序啟動用戶,使用登錄用戶啟動服務(wù),。否則以localsystem啟動的服務(wù)程序打開的調(diào)試器無法顯示窗口,。
配置完成,當(dāng)啟動服務(wù)的時候就會自動啟動調(diào)試器,需要注意的是服務(wù)在啟動時有時間限制,,不要讓調(diào)試器中斷時間過長,。
|