<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    dream.in.java

    能以不變應(yīng)萬變是聰明人做事的準(zhǔn)則。萬事從小事做起,積累小成功,問鼎大成功,是成功者的秘訣。

    VC6調(diào)試器

    要成為一位優(yōu)秀的軟件工程師,調(diào)試能力必不可缺。本文將較詳細(xì)介紹VC6調(diào)試器的主要用法。
      windows平臺(tái)的調(diào)試器主要分為兩大類:
      1 用戶模式(user-mode)調(diào)試器:它們都基于win32 Debugging API,有使用方便的界面,主要用于調(diào)試用戶模式下的應(yīng)用程序。這類調(diào)試器包括Visual C++調(diào)試器、WinDBG、BoundChecker、Borland C++ Builder調(diào)試器、NTSD等。
      2 內(nèi)核模式(kernel-mode)調(diào)試器:內(nèi)核調(diào)試器位于CPU和操作系統(tǒng)之間,一旦啟動(dòng),操作系統(tǒng)也會(huì)中止運(yùn)行,主要用于調(diào)試驅(qū)動(dòng)程序或用戶模式調(diào)試器不易調(diào)試的程序。這類調(diào)試器包括WDEB386、WinDBG和softice等。其中WinDBG和softice也可以調(diào)試用戶模式代碼。
      國外一位調(diào)試高手曾說,他70%調(diào)試時(shí)間是在用VC++,其余時(shí)間是使用WinDBG和softice。畢竟,調(diào)試用戶模式代碼,VC6調(diào)試器的效率是非常高的。因此,我將首先在本篇介紹VC6調(diào)試器的主要用法,其他調(diào)試器的用法及一些調(diào)試技能在后續(xù)文章中闡述。

    一 位置斷點(diǎn)(Location Breakpoint)
      大家最常用的斷點(diǎn)是普通的位置斷點(diǎn),在源程序的某一行按F9就設(shè)置了一個(gè)位置斷點(diǎn)。但對(duì)于很多問題,這種樸素的斷點(diǎn)作用有限。譬如下面這段代碼: void CForDebugDlg::OnOK() { for (int i = 0; i < 1000; i++) //A { int k = i * 10 - 2; //B SendTo(k); //C int tmp = DoSome(i); //D int j = i / tmp; //E }}            
      執(zhí)行此函數(shù),程序崩潰于E行,發(fā)現(xiàn)此時(shí)tmp為0,假設(shè)tmp本不應(yīng)該為0,怎么這個(gè)時(shí)候?yàn)?呢?所以最好能夠跟蹤此次循環(huán)時(shí)DoSome函數(shù)是如何運(yùn)行的,但由于是在循環(huán)體內(nèi),如果在E行設(shè)置斷點(diǎn),可能需要按F5(GO)許多次。這樣手要不停的按,很痛苦。使用VC6斷點(diǎn)修飾條件就可以輕易解決此問題。步驟如下。
      1 Ctrl+B打開斷點(diǎn)設(shè)置框,如下圖:

    Figure 1設(shè)置高級(jí)位置斷點(diǎn)
      2 然后選擇D行所在的斷點(diǎn),然后點(diǎn)擊condition按鈕,在彈出對(duì)話框的最下面一個(gè)編輯框中輸入一個(gè)很大數(shù)目,具體視應(yīng)用而定,這里1000就夠了。
      3 按F5重新運(yùn)行程序,程序中斷。Ctrl+B打開斷點(diǎn)框,發(fā)現(xiàn)此斷點(diǎn)后跟隨一串說明:...487 times remaining。意思是還剩下487次沒有執(zhí)行,那就是說執(zhí)行到513(1000-487)次時(shí)候出錯(cuò)的。因此,我們按步驟2所講,更改此斷點(diǎn)的skip次數(shù),將1000改為513。
      4 再次重新運(yùn)行程序,程序執(zhí)行了513次循環(huán),然后自動(dòng)停在斷點(diǎn)處。這時(shí),我們就可以仔細(xì)查看DoSome是如何返回0的。這樣,你就避免了手指的痛苦,節(jié)省了時(shí)間。
      再看位置斷點(diǎn)其他修飾條件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以輸入一些條件,當(dāng)這些條件滿足時(shí),斷點(diǎn)才啟動(dòng)。譬如,剛才的程序,我們需要i為100時(shí)程序停下來,我們就可以輸入在編輯框中輸入“i==100”。
      另外,如果在此編輯框中如果只輸入變量名稱,則變量發(fā)生改變時(shí),斷點(diǎn)才會(huì)啟動(dòng)。這對(duì)檢測(cè)一個(gè)變量何時(shí)被修改很方便,特別對(duì)一些大程序。
      用好位置斷點(diǎn)的修飾條件,可以大大方便解決某些問題。

    二 數(shù)據(jù)斷點(diǎn)(Data Breakpoint)
      軟件調(diào)試過程中,有時(shí)會(huì)發(fā)現(xiàn)一些數(shù)據(jù)會(huì)莫名其妙的被修改掉(如一些數(shù)組的越界寫導(dǎo)致覆蓋了另外的變量),找出何處代碼導(dǎo)致這塊內(nèi)存被更改是一件棘手的事情(如果沒有調(diào)試器的幫助)。恰當(dāng)運(yùn)用數(shù)據(jù)斷點(diǎn)可以快速幫你定位何時(shí)何處這個(gè)數(shù)據(jù)被修改。譬如下面一段程序: #include "stdafx.h"#include int main(int argc, char* argv[]){ char szName1[10]; char szName2[4]; strcpy(szName1,"shenzhen"); printf("%s\n", szName1); //A strcpy(szName2, "vckbase"); //B printf("%s\n", szName1); printf("%s\n", szName2); return 0;}      
      這段程序的輸出是       szName1: shenzhen szName1: ase szName2: vckbase    
    szName1何時(shí)被修改呢?因?yàn)闆]有明顯的修改szName1代碼。我們可以首先在A行設(shè)置普通斷點(diǎn),F(xiàn)5運(yùn)行程序,程序停在A行。然后我們?cè)僭O(shè)置一個(gè)數(shù)據(jù)斷點(diǎn)。如下圖:

    Figure 2 數(shù)據(jù)斷點(diǎn)
      F5繼續(xù)運(yùn)行,程序停在B行,說明B處代碼修改了szName1。B處明明沒有修改szName1呀?但調(diào)試器指明是這一行,一般不會(huì)錯(cuò),所以還是靜下心來看看程序,哦,你發(fā)現(xiàn)了:szName2只有4個(gè)字節(jié),而strcpy了7個(gè)字節(jié),所以覆寫了szName1。
      數(shù)據(jù)斷點(diǎn)不只是對(duì)變量改變有效,還可以設(shè)置變量是否等于某個(gè)值。譬如,你可以將Figure 2中紅圈處改為條件”szName2[0]==''''y''''“,那么當(dāng)szName2第一個(gè)字符為y時(shí)斷點(diǎn)就會(huì)啟動(dòng)。
      可以看出,數(shù)據(jù)斷點(diǎn)相對(duì)位置斷點(diǎn)一個(gè)很大的區(qū)別是不用明確指明在哪一行代碼設(shè)置斷點(diǎn)。

    三 其他
      1 在call stack窗口中設(shè)置斷點(diǎn),選擇某個(gè)函數(shù),按F9設(shè)置一個(gè)斷點(diǎn)。這樣可以從深層次的函數(shù)調(diào)用中迅速返回到需要的函數(shù)。
      2 Set Next StateMent命令(debug過程中,右鍵菜單中的命令)
      此命令的作用是將程序的指令指針(EIP)指向不同的代碼行。譬如,你正在調(diào)試上面那段代碼,運(yùn)行在A行,但你不愿意運(yùn)行B行和C行代碼,這時(shí),你就可以在D行,右鍵,然后“Set Next StateMent”。調(diào)試器就不會(huì)執(zhí)行B、C行。只要在同一函數(shù)內(nèi),此指令就可以隨意跳前或跳后執(zhí)行。靈活使用此功能可以大量節(jié)省調(diào)試時(shí)間。
      3 watch窗口
      watch窗口支持豐富的數(shù)據(jù)格式化功能。如輸入0x65,u,則在右欄顯示101。
      實(shí)時(shí)顯示windows API調(diào)用的錯(cuò)誤:在左欄輸入@err,hr。
      在watch窗口中調(diào)用函數(shù)。提醒一下,調(diào)用完函數(shù)后馬上在watch窗口中清除它,否則,單步調(diào)試時(shí)每一步調(diào)試器都會(huì)調(diào)用此函數(shù)。
      4 messages斷點(diǎn)不怎么實(shí)用。基本上可以用前面講述的斷點(diǎn)代替。
    總結(jié)
      調(diào)試最重要的還是你要思考,要猜測(cè)你的程序可能出錯(cuò)的地方,然后運(yùn)用你的調(diào)試器來證實(shí)你的猜測(cè)。而熟練使用上面這些技巧無疑會(huì)加快這個(gè)過程。最后,大家如果有關(guān)于調(diào)試方面的問題,我樂意參與探討。

    posted on 2009-03-14 10:39 YXY 閱讀(179) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 综合一区自拍亚洲综合图区 | 一级毛片免费播放| 91免费在线视频| 99热这里有免费国产精品| 最近中文字幕无吗高清免费视频| 男女啪啪永久免费观看网站| 亚洲欧洲日本在线| 亚洲一区动漫卡通在线播放| av片在线观看永久免费| 日本三级2019在线观看免费| 中文字幕亚洲一区| 亚洲日韩乱码中文字幕| 免费av片在线观看网站| 国产免费观看网站| 亚洲人成77777在线观看网| 免费看黄的成人APP| 亚洲精品成a人在线观看| 又黄又大的激情视频在线观看免费视频社区在线| 无码专区AAAAAA免费视频| 亚洲视频一区在线| 你懂得的在线观看免费视频| 亚洲AV无码一区二区乱子伦| 美女黄网站人色视频免费| 午夜网站免费版在线观看| 精品亚洲成在人线AV无码| 成人国产mv免费视频| 亚洲人成人网毛片在线播放| 国产亚洲精品免费| 91在线视频免费观看| 亚洲最大中文字幕| 免费A级毛片av无码| 日本亚洲色大成网站www久久| 免费a级毛片永久免费| 综合偷自拍亚洲乱中文字幕 | a级毛片毛片免费观看久潮| 亚洲国产美国国产综合一区二区| 日本精品久久久久久久久免费 | 亚洲毛片αv无线播放一区| 亚洲阿v天堂在线2017免费| 精品亚洲成AV人在线观看| 久9这里精品免费视频|