• <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ì)

            最新評論

            Windbg簡明教程

             



            Windbg是Microsoft公司免費(fèi)調(diào)試器調(diào)試集合中的GUI的調(diào)試器,支持Source和Assembly兩種模式的調(diào)試。Windbg不僅可以調(diào)試應(yīng)用程序,還可以進(jìn)行Kernel Debug(新版本對于XP+操作系統(tǒng)支持Live kernel debug),同時結(jié)合Microsoft的Symbol Server調(diào)試應(yīng)用程序和Kernel非常得利。Windbg支持x86,IA64,AMD64。
            Windbg下載地址:
            http://www.microsoft.com/whdc/devtools/debugging/default.mspx
            下面我來說一下Windbg的基本用法:
            基本設(shè)置
            由于Windbg是GUI調(diào)試器,所以在設(shè)置方面可以通過菜單,也可以通過命令。我只說明最方便的辦法:),那請先打開Windbg吧
            符號路徑設(shè)置,Ctrl+S在彈出的窗口中輸入你的符號路徑,路徑的格式只要符合Windows操作系統(tǒng)路徑格式即可,路徑可以多個,中間以分號間隔,如:d:\symbols\win2k3_en;個人感覺Windbg的強(qiáng)大功能之一在于Windbg會自動到Microsoft的服務(wù)器上下載符號表文件(.dbg或.pdb,有時DLL和EXE也會下載),只要在符合表路徑里做如下設(shè)置:srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols,這樣如果相關(guān)符號表在d:\symbolslocal目錄沒有找到的話,Windbg會自動在Microsoft的Symbol Servers上下載。如果你是調(diào)試自己的應(yīng)用程序的話,建議你將自己應(yīng)用程序的*.pdb文件的路徑放在前面這樣對Windbg來說查找起來比較快。
            源文件路徑設(shè)置:Ctrl+P在彈出的窗口里指定你的源代碼文件的路徑,路徑格式只要符合Windows操作系統(tǒng)的格式即可,可以指定多個,中間以分號間隔。
            可以將你的設(shè)置進(jìn)行保存,F(xiàn)ile->Save Workspace。
            開始調(diào)試
            可以創(chuàng)建一個子進(jìn)程進(jìn)行調(diào)試,也可以對正在運(yùn)行的程序進(jìn)行調(diào)試,方法如下:Ctrl+E打開一個應(yīng)用程序并可指定運(yùn)行參數(shù)進(jìn)行調(diào)試;F6從對話框中選擇當(dāng)前正在運(yùn)行的進(jìn)程調(diào)試。
            對于調(diào)試子進(jìn)程,通常Windbg會在應(yīng)用程序運(yùn)行之前中斷,此時你可下一些想要的斷點(diǎn):
            以Notepad.exe為例,如果你還沒有符號表文件的而又設(shè)置了MicrosoftSymbol Servers的話,你得先等一下,因?yàn)閃indbg會自己自動到Microsoft上下載相關(guān)的符號表,在命令提示符的位置如果沒有出現(xiàn)0:000>這個標(biāo)記表示W(wǎng)indbg正在忙。
            表達(dá)式格式:
            無論在那條指定里都會涉及這個問題:數(shù)制,語法。Windbg支持C++和MASM兩個表達(dá)式格式,@@用于即時改變語法格式,即在MASM下使用@@指令來使用C++的語法解釋器,反之亦然。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á)式語法是MASM,.expr 指令用于設(shè)置表達(dá)式語法解釋器。本文均使用MASM為默認(rèn)語法解釋器。大小問題,通常如果不特別說明,Windbg對指令不區(qū)分大小
            斷點(diǎn)指令:BP,BM,BA,BL,BC,BD,BE
            BP 在指定的地址設(shè)置斷點(diǎn)
            bp notepad!WinMain,在Notepad的WinMain函數(shù)處下斷點(diǎn)。
            斷點(diǎn)的位置可以用符號表示,也以直接使用地址及Windbg的Pseudo-Register(虛擬寄存器),如$exentry表示進(jìn)程的入口點(diǎn),可以使用bp @$exentry在進(jìn)程的入口點(diǎn)設(shè)置斷點(diǎn),對于Notepad當(dāng)前入口點(diǎn)為01006420,也可以直接 bp 01006420,等效于bp notepad!WinMainCRTStartup.
            BM 使用模式匹配設(shè)置斷點(diǎn),需要符號表支持
            bm值一提,在符號表合法的情況下(符號表中包含私有符號的時候),bm可能通過模式一次下多個斷點(diǎn),bm mydriver!FastIo*指定可以將所有與FastIo*模式相匹配的函數(shù)下斷點(diǎn),如FastIoRead,FastIoWrite等。但是bm需要full or export symbols支持,Microsoft的提供的符號表不是都支持的,通常我們自己編譯的程序的符號表(Windbg顯示為private pdb symbols)默認(rèn)是支持的。
            BA (Break on Access)
            顧名思義,對內(nèi)存訪問下斷點(diǎn)。對于在多核或多處理器調(diào)試的時候很有用,對于調(diào)試多線程也很有用,應(yīng)該說用處很多,比如對一個全局變量設(shè)置斷點(diǎn),ba mydriver!gMonitoredDevices,如果如果你認(rèn)為這個變量的值被莫名的修改了,相信通過BA設(shè)置的斷點(diǎn),你很快就能找到是誰修改的。
            BL(List),BC(Clear),BE(Enable),BD(Disable)
              這四個指令是分別用于列表,清除,開啟和禁用斷點(diǎn),也是使用非常頻繁的指令。
            條件斷點(diǎn)
              以上所提到的斷點(diǎn)指令通過與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'"
            這個條件斷點(diǎn),截取WM_CHAR消息,并將字符(包括中文)顯示出來。
            條件斷點(diǎn)的最簡形式:bp Address "j (Condition) 'OptionalCommands'; 'gc' "
            Address是指令的地址,Condition是一個條件表達(dá)式,如果@eax=1,'OptionalCommands'是在斷點(diǎn)被擊中并且表達(dá)式成立時要執(zhí)行的指令;gc指定是從一個條件斷點(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ǔ)充一個DV,用于查看本地變量用的
            這些指令區(qū)分大小。
            棧指令k[b|p|P|v]
            這四條指令顯示的內(nèi)容類似,但是每個指令都有特色,KB顯示三個參數(shù),Kp顯示所有的參數(shù),但需要Full Symbols或Private PDBSymbols支持。KP與Kp相似,只是KP將參數(shù)換行顯示了。Kv用于顯示FPO和調(diào)用約定,KD,用于顯示Stack的Dump,在跟蹤棧時比較有用。
            這些指令區(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}
              請參見文檔吧:)
            反匯編指令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)指令對整個函數(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單步跟蹤到指定地址,如果沒有參數(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)大指令,對執(zhí)行流程做Profile,執(zhí)行一下看看結(jié)果吧
            P,PA,PC相信不用多做解釋,大家也都明白了
            源代碼操作指令 .,lsf,lsc,ls,l,lsp
            .指令打一個源文件,可以打開一個全路徑的文件,也可以通過函數(shù)地址來打開并定位到源文件中函數(shù)的位置,如. –a myapp!main,. j:\mydriver\mydriver.c
            lsf指定一個源文件為當(dāng)前源文件,使用lsc可顯示當(dāng)前指定的源文件ls可顯示源文件的代碼。Lsf可以使用全路徑,如果源路徑已經(jīng)設(shè)置,也可以直接指定源文件名稱。如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)試時顯示范圍比如,顯示當(dāng)前行的前50,后50,lsp 100
            但通常使用Windbg時,可以直接用Ctrl+O來打開并查看源文件
            寄存器指令 r
            相信大家對這個指令都很熟悉,在Windbg中r指令除了可以顯示修改CPU寄存器之外,Pseudo-Register可使用這個命令來修改。對eax 操作,r eax 顯示其值,r eax=2,修改其值;r $t2=10,修改Pseudo-Register的值,r @$t2顯示其值。
            Search 指令 s,#
            S指令對內(nèi)存區(qū)別進(jìn)行查找,可用于查找數(shù)字,字符串,但不支持模式查找。s -d @esp L100 8187bc40,從esp指向的內(nèi)存地址0x100個字節(jié)內(nèi)查找 DWORD  8187bc40。查找字符串 s -a 0012ff40 L20 "Hello" 。s -sa 和 s -su 顯示內(nèi)存可打印的ASCII和Unicode字符串。
            #指令可以查詢匯編指令模式, # "call[ ]+esp" kernel32 L1000查找call esp 指令。
            其他常用指令 lm,!peb,x,dt
            lm 查看當(dāng)前載入的模塊
            !peb 查看當(dāng)前進(jìn)程環(huán)境塊(PEB)
            x 查看模塊的符號,如x mydriver!*FastIo*,顯示所有與*FastIo*匹配的符號列表
            dt 查看類型數(shù)據(jù),還可用于查看模塊類型的符號列表,如 dt dgguarder!_IMAGE_DOS_HEADER 00400000
            從00400000處查看_IMAGE_DOS_HEADER類型的數(shù)據(jù)
            上下文的概念
              Windbg下上下文的概念很重要,根據(jù)文檔中說明有多種上下文概念,
            Session Context,
            Process Context
            Register Context(其實(shí)也就是線程上下文)
            Local Context(這個關(guān)系的本地如果解析本地變量的問題)
            調(diào)試Win32應(yīng)用程序,Session Context和Process Context是確定的,主要是Register Context,也即Thread Context,可以使用~指令來查看,改變當(dāng)前的Thread Context 。~*顯示所有線程列表,~xs用于切換上下文(x是數(shù)字),如:~1s,將上下文切換到1號線程。
            .frame用來設(shè)置Local Context。

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

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


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


            99久久久精品免费观看国产| 精品久久久久久久久免费影院| 国产美女亚洲精品久久久综合| 久久久久成人精品无码中文字幕| 久久99国产精一区二区三区| 久久激情五月丁香伊人| 欧美精品国产综合久久| 国内精品伊人久久久久| 国产一区二区久久久| 狠狠色丁香婷婷久久综合不卡| 亚洲国产香蕉人人爽成AV片久久 | 久久久久高潮综合影院| 久久一日本道色综合久久| 久久国产精品视频| 久久久久亚洲AV无码永不| 久久精品女人天堂AV麻| 久久久久无码精品国产| 一级a性色生活片久久无| 国产精品一久久香蕉国产线看| 久久亚洲sm情趣捆绑调教| 一本久久久久久久| 国产成人久久激情91| 中文精品久久久久人妻不卡| 欧美精品丝袜久久久中文字幕| 91亚洲国产成人久久精品网址| 久久精品无码一区二区无码 | 久久久久久国产a免费观看黄色大片 | 四虎国产精品成人免费久久| 99久久精品免费看国产一区二区三区| 久久99久国产麻精品66| 久久人人爽人人人人片av| 欧美久久久久久精选9999| 国产L精品国产亚洲区久久| 国产精品一久久香蕉国产线看| 久久精品中文字幕无码绿巨人 | 九九精品99久久久香蕉| 亚洲精品无码成人片久久| 色综合久久无码五十路人妻| 一本色道久久综合狠狠躁| 无码精品久久久久久人妻中字| 亚洲精品乱码久久久久久按摩|