• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            Windbg簡(jiǎn)明教程

             



            Windbg是Microsoft公司免費(fèi)調(diào)試器調(diào)試集合中的GUI的調(diào)試器,支持Source和Assembly兩種模式的調(diào)試。Windbg不僅可以調(diào)試應(yīng)用程序,還可以進(jìn)行Kernel Debug(新版本對(duì)于XP+操作系統(tǒng)支持Live kernel debug),同時(shí)結(jié)合Microsoft的Symbol Server調(diào)試應(yīng)用程序和Kernel非常得利。Windbg支持x86,IA64,AMD64。
            Windbg下載地址:
            http://www.microsoft.com/whdc/devtools/debugging/default.mspx
            下面我來(lái)說(shuō)一下Windbg的基本用法:
            基本設(shè)置
            由于Windbg是GUI調(diào)試器,所以在設(shè)置方面可以通過(guò)菜單,也可以通過(guò)命令。我只說(shuō)明最方便的辦法:),那請(qǐng)先打開(kāi)Windbg吧
            符號(hào)路徑設(shè)置,Ctrl+S在彈出的窗口中輸入你的符號(hào)路徑,路徑的格式只要符合Windows操作系統(tǒng)路徑格式即可,路徑可以多個(gè),中間以分號(hào)間隔,如:d:\symbols\win2k3_en;個(gè)人感覺(jué)Windbg的強(qiáng)大功能之一在于Windbg會(huì)自動(dòng)到Microsoft的服務(wù)器上下載符號(hào)表文件(.dbg或.pdb,有時(shí)DLL和EXE也會(huì)下載),只要在符合表路徑里做如下設(shè)置:srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols,這樣如果相關(guān)符號(hào)表在d:\symbolslocal目錄沒(méi)有找到的話(huà),Windbg會(huì)自動(dòng)在Microsoft的Symbol Servers上下載。如果你是調(diào)試自己的應(yīng)用程序的話(huà),建議你將自己應(yīng)用程序的*.pdb文件的路徑放在前面這樣對(duì)Windbg來(lái)說(shuō)查找起來(lái)比較快。
            源文件路徑設(shè)置:Ctrl+P在彈出的窗口里指定你的源代碼文件的路徑,路徑格式只要符合Windows操作系統(tǒng)的格式即可,可以指定多個(gè),中間以分號(hào)間隔。
            可以將你的設(shè)置進(jìn)行保存,F(xiàn)ile->Save Workspace。
            開(kāi)始調(diào)試
            可以創(chuàng)建一個(gè)子進(jìn)程進(jìn)行調(diào)試,也可以對(duì)正在運(yùn)行的程序進(jìn)行調(diào)試,方法如下:Ctrl+E打開(kāi)一個(gè)應(yīng)用程序并可指定運(yùn)行參數(shù)進(jìn)行調(diào)試;F6從對(duì)話(huà)框中選擇當(dāng)前正在運(yùn)行的進(jìn)程調(diào)試。
            對(duì)于調(diào)試子進(jìn)程,通常Windbg會(huì)在應(yīng)用程序運(yùn)行之前中斷,此時(shí)你可下一些想要的斷點(diǎn):
            以Notepad.exe為例,如果你還沒(méi)有符號(hào)表文件的而又設(shè)置了MicrosoftSymbol Servers的話(huà),你得先等一下,因?yàn)閃indbg會(huì)自己自動(dòng)到Microsoft上下載相關(guān)的符號(hào)表,在命令提示符的位置如果沒(méi)有出現(xiàn)0:000>這個(gè)標(biāo)記表示W(wǎng)indbg正在忙。
            表達(dá)式格式:
            無(wú)論在那條指定里都會(huì)涉及這個(gè)問(wèn)題:數(shù)制,語(yǔ)法。Windbg支持C++和MASM兩個(gè)表達(dá)式格式,@@用于即時(shí)改變語(yǔ)法格式,即在MASM下使用@@指令來(lái)使用C++的語(yǔ)法解釋器,反之亦然。Windbg數(shù)制的表示0x表示16進(jìn)制,0n表示10進(jìn)制,0t表示8進(jìn)制,0y表示2進(jìn)制;Windbg默認(rèn)數(shù)制為16進(jìn)制,n指認(rèn)用于設(shè)置數(shù)制;默認(rèn)表達(dá)式語(yǔ)法是MASM,.expr 指令用于設(shè)置表達(dá)式語(yǔ)法解釋器。本文均使用MASM為默認(rèn)語(yǔ)法解釋器。大小問(wèn)題,通常如果不特別說(shuō)明,Windbg對(duì)指令不區(qū)分大小
            斷點(diǎn)指令:BP,BM,BA,BL,BC,BD,BE
            BP 在指定的地址設(shè)置斷點(diǎn)
            bp notepad!WinMain,在Notepad的WinMain函數(shù)處下斷點(diǎn)。
            斷點(diǎn)的位置可以用符號(hào)表示,也以直接使用地址及Windbg的Pseudo-Register(虛擬寄存器),如$exentry表示進(jìn)程的入口點(diǎn),可以使用bp @$exentry在進(jìn)程的入口點(diǎn)設(shè)置斷點(diǎn),對(duì)于Notepad當(dāng)前入口點(diǎn)為01006420,也可以直接 bp 01006420,等效于bp notepad!WinMainCRTStartup.
            BM 使用模式匹配設(shè)置斷點(diǎn),需要符號(hào)表支持
            bm值一提,在符號(hào)表合法的情況下(符號(hào)表中包含私有符號(hào)的時(shí)候),bm可能通過(guò)模式一次下多個(gè)斷點(diǎn),bm mydriver!FastIo*指定可以將所有與FastIo*模式相匹配的函數(shù)下斷點(diǎn),如FastIoRead,FastIoWrite等。但是bm需要full or export symbols支持,Microsoft的提供的符號(hào)表不是都支持的,通常我們自己編譯的程序的符號(hào)表(Windbg顯示為private pdb symbols)默認(rèn)是支持的。
            BA (Break on Access)
            顧名思義,對(duì)內(nèi)存訪(fǎng)問(wèn)下斷點(diǎn)。對(duì)于在多核或多處理器調(diào)試的時(shí)候很有用,對(duì)于調(diào)試多線(xiàn)程也很有用,應(yīng)該說(shuō)用處很多,比如對(duì)一個(gè)全局變量設(shè)置斷點(diǎn),ba mydriver!gMonitoredDevices,如果如果你認(rèn)為這個(gè)變量的值被莫名的修改了,相信通過(guò)BA設(shè)置的斷點(diǎn),你很快就能找到是誰(shuí)修改的。
            BL(List),BC(Clear),BE(Enable),BD(Disable)
              這四個(gè)指令是分別用于列表,清除,開(kāi)啟和禁用斷點(diǎn),也是使用非常頻繁的指令。
            條件斷點(diǎn)
              以上所提到的斷點(diǎn)指令通過(guò)與J指令很容易形成條件斷點(diǎn)。比如:
            bp USER32!GetMessageW "r $t1=poi(esp+4);r $t2=poi(@$t1+4); j(@$t2 = 0x102 ) 'du @$t1+8 L2;gc';'gc'"
            這個(gè)條件斷點(diǎn),截取WM_CHAR消息,并將字符(包括中文)顯示出來(lái)。
            條件斷點(diǎn)的最簡(jiǎn)形式:bp Address "j (Condition) 'OptionalCommands'; 'gc' "
            Address是指令的地址,Condition是一個(gè)條件表達(dá)式,如果@eax=1,'OptionalCommands'是在斷點(diǎn)被擊中并且表達(dá)式成立時(shí)要執(zhí)行的指令;gc指定是從一個(gè)條件斷點(diǎn)返回,是不可少的一部分。
            數(shù)據(jù)查看指令 d{a|b|c|d|D|f|p|q|u|w|W}
            d{b|c|d|D|f|p|q}分別是顯示:
            byte&ASCII, double-word&ASCII,double-word,double-precision,float,pointer-sized,quad-word數(shù)據(jù);
            DA用于顯示ASCII,DU用于顯示UNICODE;
            BYB,BYD,顯示binary和Byte及binary和DWORD
            補(bǔ)充一個(gè)DV,用于查看本地變量用的
            這些指令區(qū)分大小。
            棧指令k[b|p|P|v]
            這四條指令顯示的內(nèi)容類(lèi)似,但是每個(gè)指令都有特色,KB顯示三個(gè)參數(shù),Kp顯示所有的參數(shù),但需要Full Symbols或Private PDBSymbols支持。KP與Kp相似,只是KP將參數(shù)換行顯示了。Kv用于顯示FPO和調(diào)用約定,KD,用于顯示Stack的Dump,在跟蹤棧時(shí)比較有用。
            這些指令區(qū)分大小。
            KD顯示的內(nèi)容:
            0012fbd0  0012fbf0
            0012fbd4  77e2158f USER32!UserCallWinProc+0x18
            0012fbd8  0016011e
            0012fbdc  00000030
            0012fbe0  750a0c3f
            0012fbe4  00000000
            0012fbe8  00000000
            0012fbec  dcbaabcd
            0012fbf0  0012fc2c
            0012fbf4  77e1279c USER32!DefDlgProcWorker+0xbf
            0012fbf8  004018e0 DGGuarder!MainDLGproc [j:\mydriver\dgguarder2\dgguarder.c @ 350]
            0012fbfc  0016011e
            0012fc00  00000030
            0012fc04  750a0c3f
            0012fc08  00000000
            0012fc0c  00629d08
            0012fc10  00000030
            0012fc14  00619828
            0012fc18  77e0f626 USER32!__ClientLoadMenu+0x38
            0012fc1c  77e0f635 USER32!__ClientLoadMenu+0x47
              KP顯示的內(nèi)容:
            ChildEBP RetAddr  
            0012fbd0 77e2158f DGGuarder!MainDLGproc(
               struct HWND__ * hwnd = 0x0016011e,
               unsigned int message = 0x30,
               unsigned int wParam = 0x750a0c3f,
               long lParam = 0)+0x227 [j:\mydriver\dgguarder2\dgguarder.c @ 415]
            0012fbf0 77e1279c USER32!UserCallWinProc+0x18
            0012fc5c 77e0b981 USER32!DefDlgProcWorker+0xbf
            0012fd14 77e140bb USER32!InternalCreateDialog+0x695
            0012fd44 77e1410f USER32!InternalDialogBox+0xaa
            0012fd64 77df41ec USER32!DialogBoxIndirectParamAorW+0x34
            0012fd90 00401cdc USER32!DialogBoxParamA+0x4a
            0012fe88 00408684 DGGuarder!WinMain(
               struct HINSTANCE__ * hInstance = 0x00400000,
               struct HINSTANCE__ * hPrevInstance = 0x00000000,
               char * lpCmdLine = 0x00132902 "",
               int nCmdShow = 10)+0x5c [j:\mydriver\dgguarder2\dgguarder.c @ 469]
            0012ffc0 77e88989 DGGuarder!WinMainCRTStartup(void)+0x194 [f:\vs70builds\3077\vc\crtbld\crt\src\crt0.c @ 251]
            0012fff0 00000000 KERNEL32!BaseProcessStart+0x3d
            數(shù)據(jù)修改指令e{b|d|D|f|p|q|w}
              請(qǐng)參見(jiàn)文檔吧:)
            反匯編指令u,uf
            u @$exentry L10
            0:001> u @$exentry L10
            notepad!WinMainCRTStartup:
            01006420 55               push    ebp
            01006421 8bec             mov     ebp,esp
            01006423 6aff             push    0xff
            01006425 6888180001       push    0x1001888
            0100642a 68d0650001       push    0x10065d0
            0100642f 64a100000000     mov     eax,fs:[00000000]
            01006435 50               push    eax
            01006436 64892500000000   mov     fs:[00000000],esp
            0100643d 83c498           add     esp,0xffffff98
            01006440 53               push    ebx
            01006441 56               push    esi
            01006442 57               push    edi
            01006443 8965e8           mov     [ebp-0x18],esp
            01006446 c745fc00000000   mov     dword ptr [ebp-0x4],0x0
            0100644d 6a02             push    0x2
            0100644f ff1560110001 call dword ptr [notepad!_imp____set_app_type (01001160)]
            uf (Unassemble Function)指令對(duì)整個(gè)函數(shù)進(jìn)行反匯編
            uf GetLanguageCount
            0:000> uf GetLanguageCount
            DGGuarder!GetLanguageCount [j:\mydriver\dgguarder2\language.c @ 54]:
               54 00403c00 55               push    ebp
               54 00403c01 8bec             mov     ebp,esp
               54 00403c03 81ecc0000000     sub     esp,0xc0
               54 00403c09 53               push    ebx
               54 00403c0a 56               push    esi
               54 00403c0b 57               push    edi
               54 00403c0c 8dbd40ffffff     lea     edi,[ebp-0xc0]
               54 00403c12 b930000000       mov     ecx,0x30
               54 00403c17 b8cccccccc       mov     eax,0xcccccccc
               54 00403c1c f3ab             rep     stosd
               56 00403c1e 6a00             push    0x0
               56 00403c20 6828b44100       push    0x41b428
               56 00403c25 6820b44100       push    0x41b420
               56 00403c2a e8b1edffff       call    DGGuarder!ReadInt (004029e0)
               56 00403c2f 83c40c           add     esp,0xc
               58 00403c32 5f               pop     edi
               58 00403c33 5e               pop     esi
               58 00403c34 5b               pop     ebx
               58 00403c35 81c4c0000000     add     esp,0xc0
               58 00403c3b 3bec             cmp     ebp,esp
               58 00403c3d e85e0f0000       call    DGGuarder!_RTC_CheckEsp (00404ba0)
               58 00403c42 8be5             mov     esp,ebp
               58 00403c44 5d               pop     ebp
               58 00403c45 c3               ret
            跟蹤指令T,TA,TB,TC,WT,P,PA,PC
              T指令單步執(zhí)行,在源碼調(diào)試狀態(tài)下,可指源碼的一行,根據(jù)不同的選項(xiàng)也可以為一行ASM指令;
            TA單步跟蹤到指定地址,如果沒(méi)有參數(shù)將運(yùn)行到斷點(diǎn)處。
            TB執(zhí)行到分支指令,分支指令包括calls, returns, jumps, counted loops, and while loops
            TC執(zhí)行到Call指令
            WT Trace and Watch Data,一條強(qiáng)大指令,對(duì)執(zhí)行流程做Profile,執(zhí)行一下看看結(jié)果吧
            P,PA,PC相信不用多做解釋?zhuān)蠹乙捕济靼琢?br>源代碼操作指令 .,lsf,lsc,ls,l,lsp
            .指令打一個(gè)源文件,可以打開(kāi)一個(gè)全路徑的文件,也可以通過(guò)函數(shù)地址來(lái)打開(kāi)并定位到源文件中函數(shù)的位置,如. –a myapp!main,. j:\mydriver\mydriver.c
            lsf指定一個(gè)源文件為當(dāng)前源文件,使用lsc可顯示當(dāng)前指定的源文件ls可顯示源文件的代碼。Lsf可以使用全路徑,如果源路徑已經(jīng)設(shè)置,也可以直接指定源文件名稱(chēng)。如lsf mydriver.c,lsf j:\mydriver\mydriver.c
            lsc顯示當(dāng)前源文件
            ls顯示當(dāng)前源文件的代碼,如ls 200顯示第200行
            l 用于設(shè)置源文件選項(xiàng)
            lsp 設(shè)置源文件行在調(diào)試時(shí)顯示范圍比如,顯示當(dāng)前行的前50,后50,lsp 100
            但通常使用Windbg時(shí),可以直接用Ctrl+O來(lái)打開(kāi)并查看源文件
            寄存器指令 r
            相信大家對(duì)這個(gè)指令都很熟悉,在Windbg中r指令除了可以顯示修改CPU寄存器之外,Pseudo-Register可使用這個(gè)命令來(lái)修改。對(duì)eax 操作,r eax 顯示其值,r eax=2,修改其值;r $t2=10,修改Pseudo-Register的值,r @$t2顯示其值。
            Search 指令 s,#
            S指令對(duì)內(nèi)存區(qū)別進(jìn)行查找,可用于查找數(shù)字,字符串,但不支持模式查找。s -d @esp L100 8187bc40,從esp指向的內(nèi)存地址0x100個(gè)字節(jié)內(nèi)查找 DWORD  8187bc40。查找字符串 s -a 0012ff40 L20 "Hello" 。s -sa 和 s -su 顯示內(nèi)存可打印的ASCII和Unicode字符串。
            #指令可以查詢(xún)匯編指令模式, # "call[ ]+esp" kernel32 L1000查找call esp 指令。
            其他常用指令 lm,!peb,x,dt
            lm 查看當(dāng)前載入的模塊
            !peb 查看當(dāng)前進(jìn)程環(huán)境塊(PEB)
            x 查看模塊的符號(hào),如x mydriver!*FastIo*,顯示所有與*FastIo*匹配的符號(hào)列表
            dt 查看類(lèi)型數(shù)據(jù),還可用于查看模塊類(lèi)型的符號(hào)列表,如 dt dgguarder!_IMAGE_DOS_HEADER 00400000
            從00400000處查看_IMAGE_DOS_HEADER類(lèi)型的數(shù)據(jù)
            上下文的概念
              Windbg下上下文的概念很重要,根據(jù)文檔中說(shuō)明有多種上下文概念,
            Session Context,
            Process Context
            Register Context(其實(shí)也就是線(xiàn)程上下文)
            Local Context(這個(gè)關(guān)系的本地如果解析本地變量的問(wèn)題)
            調(diào)試Win32應(yīng)用程序,Session Context和Process Context是確定的,主要是Register Context,也即Thread Context,可以使用~指令來(lái)查看,改變當(dāng)前的Thread Context 。~*顯示所有線(xiàn)程列表,~xs用于切換上下文(x是數(shù)字),如:~1s,將上下文切換到1號(hào)線(xiàn)程。
            .frame用來(lái)設(shè)置Local Context。

            PAUSE
            好了,基本的指令都已經(jīng)列出了來(lái)了,Kernel Debug現(xiàn)在先不寫(xiě)了,其實(shí)跟Win32也差不多。如果再有時(shí)間再寫(xiě)吧。本文對(duì)指令沒(méi)有說(shuō)的太細(xì),詳細(xì)說(shuō)明見(jiàn)Windbg文檔,希望見(jiàn)諒

            posted on 2008-01-18 18:29 大龍 閱讀(8590) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久99国产精品一区二区| 久久国产福利免费| 国产精品久久波多野结衣| 韩国三级中文字幕hd久久精品| 久久久国产亚洲精品| 久久线看观看精品香蕉国产| 伊人久久大香线蕉综合网站| 亚洲欧美精品伊人久久| 漂亮人妻被中出中文字幕久久| 久久99国产精一区二区三区| 久久人妻少妇嫩草AV蜜桃| a级毛片无码兔费真人久久| 国产精品99久久久精品无码| 久久久精品波多野结衣| 97精品久久天干天天天按摩| 亚洲国产精品无码久久一线| 久久精品无码专区免费 | 日韩欧美亚洲综合久久影院Ds| 久久久久99精品成人片欧美| 久久天天婷婷五月俺也去| 国产成人久久777777| 国产精品久久久久9999高清| 日韩精品无码久久久久久| 亚洲国产香蕉人人爽成AV片久久 | 久久九九亚洲精品| 亚洲av伊人久久综合密臀性色| 看全色黄大色大片免费久久久| 97久久精品人人澡人人爽| 久久精品国产清高在天天线| 久久精品国产99久久久古代| 中文字幕精品久久久久人妻| 四虎久久影院| 日韩人妻无码一区二区三区久久99 | 国产成人无码精品久久久久免费 | 久久夜色撩人精品国产| 国产一区二区精品久久凹凸| 国产精品免费久久久久久久久| 国产精品成人99久久久久| 国内精品伊人久久久久网站| 久久综合日本熟妇| 亚洲人成无码www久久久|