• <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>
            posts - 23,  comments - 20,  trackbacks - 0
            服務(wù)器又出問(wèn)題了   實(shí)在是沒(méi)辦法了  因?yàn)槟堑缅e(cuò)誤我這邊沒(méi)辦法重現(xiàn)  也不知道如何寫(xiě)dump文件 而經(jīng)理又不讓安裝VS  沒(méi)辦法  最后只能使用WinDbg 來(lái)調(diào)試了  網(wǎng)上找了相關(guān)資料
            先Copy下來(lái)吧  以后還是會(huì)用的   還有  要買(mǎi)書(shū)了  在學(xué)校的時(shí)候看見(jiàn)了<軟件調(diào)試>  只是覺(jué)得厚   沒(méi)怎么看  現(xiàn)在后悔了...  要買(mǎi)了

            先Copy資料吧


            本篇文章得主要目的是介紹WINDBG的主要功能以及相關(guān)的命令。關(guān)于這些命令的詳細(xì)語(yǔ)法,請(qǐng)參閱幫助文件。對(duì)文章中提到的許多命令,WINDBG有相應(yīng)的菜單選項(xiàng)。
            1.如何得到幫助

             在命令(Command)窗口中輸入.hh 命會(huì)調(diào)出幫助文件令。

             .hh keyword

            會(huì)顯示關(guān)于keyword的詳細(xì)命令。

            2.啟動(dòng)Debugger

             Windbg可以用于如下三種調(diào)試:

             a.遠(yuǎn)程調(diào)試:你可以從機(jī)器A上調(diào)試在機(jī)器B上執(zhí)行的程序。具體步驟如下:

            ? 在機(jī)器B上啟動(dòng)一個(gè)調(diào)試窗口(Debug Session)。你可以直接在Windbg下運(yùn)行一個(gè)程序或者將Windbg附加(Attach)到一個(gè)進(jìn)程。

            ? 在機(jī)器B的Windbg命令窗口上啟動(dòng)一個(gè)遠(yuǎn)程調(diào)試接口(remote):

            .server npipe:pipe=PIPE_NAME

            PIPE_NAME是該接口的名字。

            ? 在機(jī)器A上運(yùn)行:

            windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAME

            SERVER_NAME是機(jī)器B的名字。

            b.Dump文件調(diào)試:如果在你的客戶的機(jī)器上出現(xiàn)問(wèn)題,你可能不能使用遠(yuǎn)程調(diào)試來(lái)解決問(wèn)題。你可以要求你的用戶將Windbg附加到出現(xiàn)問(wèn)題的進(jìn)程上,然后在命令窗口中輸入:

            .dump /ma File Name

            創(chuàng)建一個(gè)Dump文件。在得到Dump文件后,使用如下的命令來(lái)打開(kāi)它:

            windbg –z DUMP_FILE_NAME

            c.本地進(jìn)程調(diào)試:你可以在Windbg下直接運(yùn)行一個(gè)程序:

            Windbg “path to executable” arguments

            也可以將Windbg附加到一個(gè)正在運(yùn)行的程序:

            Windbg –p “process id”

            Windbg –pn “process name”

            注意有一種非侵入(Noninvasive)模式可以用來(lái)檢查一個(gè)進(jìn)程的狀態(tài)并不進(jìn)程的執(zhí)行。當(dāng)然在這種模式下無(wú)法控制被調(diào)試程序的執(zhí)行。這種模式也可以用于查看一個(gè)已經(jīng)在Debugger控制下運(yùn)行的進(jìn)程。具體命令如下:

            Windbg –pv –p “process id”

            Windbg –pv –pn “process name”


            ------------------------------------------------------------

            調(diào)試多個(gè)進(jìn)程和線程

             如果你想控制一個(gè)進(jìn)程以及它的子進(jìn)程的執(zhí)行,在Windbg的命令行上加上-o選項(xiàng)。Windbg中還有一個(gè)新的命令.childdbg 可以用來(lái)控制子進(jìn)程的調(diào)試。如果你同時(shí)調(diào)試幾個(gè)進(jìn)程,可以使用 | 命令來(lái)顯示并切換到不同的進(jìn)程。

            在同一個(gè)進(jìn)程中可能有多個(gè)線程。~命令可以用來(lái)顯示和切換線程。

             ------------------------------------------------------------

            調(diào)試前的必備工作

            在開(kāi)始調(diào)試前首先要做的工作是設(shè)置好符號(hào)(Symbols)路徑。沒(méi)有符號(hào),你看到的調(diào)用堆棧基本上毫無(wú)意義。Microsoft的操作系統(tǒng)符號(hào)文 件(PDB)是對(duì)外公開(kāi)的。另外請(qǐng)注意在編譯你自己的程序選擇生成PDB文件的選項(xiàng)。如果設(shè)置好符號(hào)路徑后,調(diào)用堆棧看起來(lái)還是不對(duì)。可以使用lm, !sym noisy, !reload 等命令來(lái)驗(yàn)證符號(hào)路徑是否正確。

            Windbg也支持源碼級(jí)的調(diào)試。在開(kāi)始源碼調(diào)試前,你需要用.srcpath設(shè)置源代碼路徑。如果你是在生成所執(zhí)行代碼的機(jī)器上進(jìn)行調(diào)試,符號(hào)文 件中的源碼路徑會(huì)指向正確的位置,所以不需要設(shè)置源代碼路徑。如果所執(zhí)行代碼是在另一臺(tái)機(jī)器上生成的,你可以將所用的源碼拷貝(保持原有的目錄結(jié)構(gòu))的一 個(gè)可以訪問(wèn)的文件夾(可以是網(wǎng)絡(luò)路徑)并將源代碼路徑設(shè)為該文件夾的路徑。注意如果是遠(yuǎn)程調(diào)試,你需要使用.lsrcpath來(lái)設(shè)置源碼路徑。

             ------------------------------------------------------------

            靜態(tài)命令:

            1.顯示調(diào)用堆棧:在連接到一個(gè)調(diào)試窗口后,首先要知道的就是程序當(dāng)前的執(zhí)行情況k* 命令顯示當(dāng)前線程的堆棧。~*kb會(huì)顯示所有線程的調(diào)用堆棧。如果堆棧太長(zhǎng),Windbg只會(huì)顯示堆棧的一部分。.kframes可以用來(lái)設(shè)置缺省顯示框架數(shù)。

            2.顯示局部變量:接下來(lái)要做通常是用dv顯示局部變量的信息。CTRL+ALT+V可以切換到更詳細(xì)的顯示模式。關(guān)于dv要注意的是在優(yōu)化過(guò)的代 碼中dv的輸出極有可能是不準(zhǔn)確的。這時(shí)后你能做的就是閱讀匯編代碼來(lái)發(fā)現(xiàn)你感興趣的值是否存儲(chǔ)在寄存器中或堆棧上。有時(shí)后當(dāng)前的框架(Frame)上可 能找不到你想知道的數(shù)據(jù)。如果該數(shù)據(jù)是作為參數(shù)傳到當(dāng)前的方法中的,可以讀一讀上一個(gè)或幾個(gè)框架的匯編代碼,有可能該數(shù)據(jù)還在堆棧的某個(gè)地址上。靜態(tài)變量 是儲(chǔ)存在固定地址中的,所以找出靜態(tài)變量的值較為容易。.Frame(或者在調(diào)用堆棧窗口中雙擊)可以用來(lái)切換當(dāng)前的框架。注意dv命令顯示的是當(dāng)前框架 的內(nèi)容。你也可在watch窗口中觀察局部變量的值。

            3.顯示類和鏈表: dt可以顯示數(shù)據(jù)結(jié)構(gòu)。比如dt PEB 會(huì)顯示操作系統(tǒng)進(jìn)程結(jié)構(gòu)。在后面跟上一個(gè)進(jìn)程結(jié)構(gòu)的地址會(huì)顯示該結(jié)構(gòu)的詳細(xì)信息:dt PEB 7ffdf000。

            Dl命令可以顯示一些特定的鏈表結(jié)構(gòu)。

            4.顯示當(dāng)前線程的錯(cuò)誤值:!gle會(huì)顯示當(dāng)前線程的上一個(gè)錯(cuò)誤值和狀態(tài)值。!error命令可以解碼HRESULT。

            5.搜索或修改內(nèi)存:使用s 命令來(lái)搜索字節(jié),字或雙字,QWORD或字符串。使用e命令來(lái)修改內(nèi)存。

            6.計(jì)算表達(dá)式:?命令可以用來(lái)進(jìn)行計(jì)算。關(guān)于表達(dá)式的格式請(qǐng)參照幫助文檔。使用n命令來(lái)切換輸入數(shù)字的進(jìn)制。

            7.顯示當(dāng)前線程,進(jìn)程和模塊信息:!teb顯示當(dāng)前線程的環(huán)境信息。最常見(jiàn)的用途是查看當(dāng)前線程堆棧的起始地址,然后在堆棧中搜索值。!peb顯示當(dāng)前進(jìn)程的環(huán)境信息,比如執(zhí)行文件的路徑等等。lm顯示進(jìn)程中加載的模塊信息。

            8.顯示寄存器的值:r命令可以顯示和修改寄存器的值。如果要在表達(dá)式中使用寄存器的值,在寄存器名前加@符號(hào)(比如@eax)。

            9.顯示最相近的符號(hào):ln Address。如果你有一個(gè)C++對(duì)象的指針,可以用來(lái)ln來(lái)查看該對(duì)象類型。

            10.查找符號(hào):x命令可以用來(lái)查找全局變量的地址或過(guò)程的地址。x命令支持匹配符號(hào)。x kernel32!*顯示Kernel32.dll中的所有可見(jiàn)變量,數(shù)據(jù)結(jié)構(gòu)和過(guò)程。

             

            11.查看lock:!locks顯示各線程的鎖資源使用情況。對(duì)調(diào)試死鎖很有用。

            12.查看handle:!handle顯示句柄信息。如果一段代碼導(dǎo)致句柄泄漏,你只需要在代碼執(zhí)行前后使用!handle命令并比較兩次輸出的區(qū)別。有一個(gè)命令!htrace對(duì)調(diào)試與句柄有關(guān)的Bug非常有用。在開(kāi)始調(diào)試前輸入:

            !htrace –enable

            然后在調(diào)試過(guò)程中使用!htrace handle_value 來(lái)顯示所有與該句柄有關(guān)的調(diào)用堆棧。

            13.顯示匯編代碼:u。

            ------------------------------------------------------------

            程序執(zhí)行控制命令:

            1.設(shè)置代碼斷點(diǎn):bp/bu/bm 可以用來(lái)設(shè)置代碼斷點(diǎn)。你可以指定斷點(diǎn)被跳過(guò)的次數(shù)。假設(shè)一段代碼KERNEL32!SetLastError在運(yùn)行很多次后會(huì)出錯(cuò),你可以設(shè)置如下斷點(diǎn):

            bp KERNEL32!SetLastError 0x100.

            在出錯(cuò)后使用bl 來(lái)顯示斷點(diǎn)信息(注意粗體顯示的值):

            0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError

            重新啟動(dòng)調(diào)試(.restart命令)并設(shè)置如下的斷點(diǎn):

            bp Kernel32!SetLastError 0x100-0x4f

            Debugger會(huì)停在出錯(cuò)前最后一次調(diào)用該過(guò)程的地方。

            你可以指定斷點(diǎn)被激活時(shí)Debugger應(yīng)當(dāng)執(zhí)行的命令串。在該命令串中使用J命令可以用來(lái)設(shè)置條件斷點(diǎn):

            bp `mysource.cpp:143` "j (poi(MyVar)”0n20) ''; 'g' "

            上面的斷點(diǎn)只在MyVar的值大于32時(shí)被激活(g命令

            條件斷點(diǎn)的用途極為廣泛。你可以指定一個(gè)斷點(diǎn)只在特殊的情況下被激活,比如傳入的參數(shù)滿足一定的條件,調(diào)用者是某個(gè)特殊的過(guò)程,某個(gè)全局變量被設(shè)為特殊的值等等。

            2.設(shè)置內(nèi)存斷點(diǎn):ba可以用來(lái)設(shè)置內(nèi)存斷點(diǎn)。調(diào)試過(guò)程中一個(gè)常見(jiàn)的問(wèn)題是跟蹤某些數(shù)據(jù)的變化。如下的斷點(diǎn):

            ba w4 0x40000000 "kb; g"

            可以打印出所有修改0x40000000的調(diào)用堆棧。

            3.控制程序執(zhí)行:p, pa,t, ta等命令可以用來(lái)控制程序的執(zhí)行。

            4.控制異常和事件處理:Debugger的缺省設(shè)置是跳過(guò)首次異常(first chance expcetion),在二次異常(second chance exception)時(shí)中斷程序的執(zhí)行。sx命令顯示Debugger的設(shè)置。sxe和sxd可以改變Debugger的設(shè)置。

            sxe clr

            可以控制Debugger在托管異常發(fā)生時(shí)中斷程序的執(zhí)行。常用的Debugger事件有:

            av 訪問(wèn)異常

            eh C++異常

            clr 托管異常

            ld 模塊加載

            -c 選項(xiàng)可以用來(lái)指定在事件發(fā)生時(shí)執(zhí)行的調(diào)試命令。

            powerwolf 發(fā)表于:2006.07.03 15:02
            reference url:  http://powerwolf.itpub.net/post/20237/130218


            特別要注意的就是!gle   這個(gè)命令相當(dāng)于執(zhí)行GetLastError()  而且還能查看內(nèi)核的NTSTATUS

            問(wèn)題剛剛解決了    最后出現(xiàn)的問(wèn)題也找到了   但是錯(cuò)誤原因大跌眼鏡   ------殺毒軟件...

            結(jié)論:
            雖然我們需要豐富的調(diào)試技巧  但是  經(jīng)驗(yàn)仍然是最重要的
            就像找工作一樣  學(xué)校里面你再牛   沒(méi)有經(jīng)驗(yàn)  你都比不過(guò)工作兩年的高中生

            posted on 2009-08-20 11:51 李佳 閱讀(495) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 調(diào)試技巧
            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            亚洲精品tv久久久久久久久久| 亚洲精品美女久久久久99小说| 热99RE久久精品这里都是精品免费| 久久久久久久综合综合狠狠| 亚洲国产高清精品线久久 | 久久精品一区二区国产| 国产午夜精品理论片久久影视| 国产精品久久久久一区二区三区| 欧美久久一区二区三区| 久久久久久久女国产乱让韩| 国内精品伊人久久久久av一坑| 久久高清一级毛片| 精品国产VA久久久久久久冰| 天天综合久久一二三区| 97久久精品午夜一区二区| 麻豆精品久久久久久久99蜜桃| 亚洲国产成人久久精品动漫| 久久伊人精品一区二区三区| 久久这里只有精品首页| 亚洲国产欧洲综合997久久| 国产精品va久久久久久久| 香蕉久久av一区二区三区| 久久男人中文字幕资源站| 久久免费精品视频| 久久亚洲国产成人精品性色| 国产香蕉久久精品综合网| 色综合久久天天综线观看| 精品国产青草久久久久福利| A狠狠久久蜜臀婷色中文网| 无码人妻精品一区二区三区久久| MM131亚洲国产美女久久| 久久精品国产精品亚洲艾草网美妙| 久久国产精品99精品国产| 久久精品综合网| 久久精品国产亚洲αv忘忧草| 日产久久强奸免费的看| 久久这里有精品视频| 久久亚洲色一区二区三区| 一本大道久久东京热无码AV| 亚洲国产日韩欧美综合久久| 亚洲国产婷婷香蕉久久久久久|