青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

WinDBG教程

 

什么是WinDBG?

 

WinDbg是微軟開發的免費源碼級調試工具。下載地址為:http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx.

Windbg可以用于Kernel模式調試和用戶模式調試,還可以調試Dump文件。由于大部分程序員不需要做Kernel模式調試, 我在這篇文章中不會介紹Kernel模式調試。Kernel模式調試對學習Windows核心極有幫助。如果你對此感興趣,可以閱讀Inside Windows 2000Windbg所帶的幫助文件。

 

這篇文章得主要目的是介紹WINDBG的主要功能以及相關的命令。關于這些命令的詳細語法,請參閱幫助文件。對文章中提到的許多命令,WINDBG有相應的菜單選項。

如何得到幫助

 

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

 

.hh keyword

會顯示關于keyword的詳細命令。

 

啟動Debugger

 

Windbg可以用于如下三種調試:

 

  1. 遠程調試:你可以從機器A上調試在機器B上執行的程序。具體步驟如下:
  •   在機器B上啟動一個調試窗口(Debug Session)。你可以直接在Windbg下運行一個程序或者將Windbg附加(Attach)到一個進程。
  •   在機器BWindbg命令窗口上啟動一個遠程調試接口(remote):

    .server npipe:pipe=PIPE_NAME

     PIPE_NAME是該接口的名字。

  • 在機器A上運行:

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

 SERVER_NAME是機器B的名字。

 

  1. Dump文件調試:如果在你的客戶的機器上出現問題,你可能不能使用遠程調試來解決問題。你可以要求你的用戶將Windbg附加到出現問題的進程上,然后在命令窗口中輸入:

.dump /ma File Name

創建一個Dump文件。在得到Dump文件后,使用如下的命令來打開它:

windbg –z DUMP_FILE_NAME

 

  1. 本地進程調試:你可以在Windbg下直接運行一個程序:

Windbg “path to executable” arguments     

    也可以將Windbg附加到一個正在運行的程序:

    Windbg –p “process id”  

Windbg –pn “process name”

    注意有一種非侵入(Noninvasive)模式可以用來檢查一個進程的狀態并不進程的執行。當然在這種模式下無法控制被調試程序的執行。這種模式也可以用于查看一個已經在Debugger控制下運行的進程。具體命令如下:

    Windbg –pv –p “process id” 

Windbg –pv –pn “process name” 

      

調試多個進程和線程

 

如果你想控制一個進程以及它的子進程的執行,在Windbg的命令行上加上-o選項。Windbg中還有一個新的命令.childdbg 可以用來控制子進程的調試。如果你同時調試幾個進程,可以使用 | 命令來顯示并切換到不同的進程。

在同一個進程中可能有多個線程。~命令可以用來顯示和切換線程。

 

調試前的必備工作

在開始調試前首先要做的工作是設置好符號(Symbols)路徑。沒有符號,你看到的調用堆?;旧虾翢o意義。Microsoft的操作系統符號文件(PDB)是對外公開的。另外請注意在編譯你自己的程序選擇生成PDB文件的選項。如果設置好符號路徑后,調用堆??雌饋磉€是不對??梢允褂?strong>lm, !sym noisy, !reload 等命令來驗證符號路徑是否正確。

 

Windbg也支持源碼級的調試。在開始源碼調試前,你需要用.srcpath設置源代碼路徑。如果你是在生成所執行代碼的機器上進行調試,符號文件中的源碼路徑會指向正確的位置,所以不需要設置源代碼路徑。如果所執行代碼是在另一臺機器上生成的,你可以將所用的源碼拷貝(保持原有的目錄結構)的一個可以訪問的文件夾(可以是網絡路徑)并將源代碼路徑設為該文件夾的路徑。注意如果是遠程調試,你需要使用.lsrcpath來設置源碼路徑。

 

靜態命令:

顯示調用堆棧:在連接到一個調試窗口后,首先要知道的就是程序當前的執行情況k* 命令顯示當前線程的堆棧。~*kb會顯示所有線程的調用堆棧。如果堆棧太長,Windbg只會顯示堆棧的一部分。.kframes可以用來設置缺省顯示框架數。

 

顯示局部變量:接下來要做通常是用dv顯示局部變量的信息。CTRLALTV可以切換到更詳細的顯示模式。關于dv要注意的是在優化過的代碼中dv的輸出極有可能是不準確的。這時后你能做的就是閱讀匯編代碼來發現你感興趣的值是否存儲在寄存器中或堆棧上。有時后當前的框架(Frame)上可能找不到你想知道的數據。如果該數據是作為參數傳到當前的方法中的,可以讀一讀上一個或幾個框架的匯編代碼,有可能該數據還在堆棧的某個地址上。靜態變量是儲存在固定地址中的,所以找出靜態變量的值較為容易。.Frame(或者在調用堆棧窗口中雙擊)可以用來切換當前的框架。注意dv命令顯示的是當前框架的內容。你也可在watch窗口中觀察局部變量的值。

 

顯示類和鏈表dt可以顯示數據結構。比如dt PEB 會顯示操作系統進程結構。在后面跟上一個進程結構的地址會顯示該結構的詳細信息:dt PEB 7ffdf000。

Dl命令可以顯示一些特定的鏈表結構。

 

顯示當前線程的錯誤值!gle會顯示當前線程的上一個錯誤值和狀態值。!error命令可以解碼HRESULT

 

搜索或修改內存:使用s 命令來搜索字節,字或雙字,QWORD或字符串。使用e命令來修改內存。

 

計算表達式:?命令可以用來進行計算。關于表達式的格式請參照幫助文檔。使用n命令來切換輸入數字的進制。

 

顯示當前線程,進程和模塊信息!teb顯示當前線程的環境信息。最常見的用途是查看當前線程堆棧的起始地址,然后在堆棧中搜索值。!peb顯示當前進程的環境信息,比如執行文件的路徑等等。lm顯示進程中加載的模塊信息。

 

 

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

 

 

顯示最相近的符號ln Address。如果你有一個C++對象的指針,可以用來ln來查看該對象類型。

 

查找符號x命令可以用來查找全局變量的地址或過程的地址。x命令支持匹配符號。x kernel32!*顯示Kernel32.dll中的所有可見變量,數據結構和過程。

 

 

查看lock!locks顯示各線程的鎖資源使用情況。對調試死鎖很有用。

 

查看handle!handle顯示句柄信息。如果一段代碼導致句柄泄漏,你只需要在代碼執行前后使用!handle命令并比較兩次輸出的區別。有一個命令!htrace對調試與句柄有關的Bug非常有用。在開始調試前輸入:

!htrace –enable

然后在調試過程中使用!htrace handle_value 來顯示所有與該句柄有關的調用堆棧。

 

顯示匯編代碼u

 

程序執行控制命令:

設置代碼斷點bp/bu/bm 可以用來設置代碼斷點。你可以指定斷點被跳過的次數。假設一段代碼KERNEL32!SetLastError在運行很多次后會出錯,你可以設置如下斷點:

    bp KERNEL32!SetLastError 0x100.

在出錯后使用bl 來顯示斷點信息(注意粗體顯示的值):

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

重新啟動調試(.restart命令)并設置如下的斷點:

bp Kernel32!SetLastError 0x100-0x4f

Debugger會停在出錯前最后一次調用該過程的地方。

 

你可以指定斷點被激活時Debugger應當執行的命令串。在該命令串中使用J命令可以用來設置條件斷點:

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

上面的斷點只在MyVar的值大于32時被激活(g命令

 

條件斷點的用途極為廣泛。你可以指定一個斷點只在特殊的情況下被激活,比如傳入的參數滿足一定的條件,調用者是某個特殊的過程,某個全局變量被設為特殊的值等等。

 

設置內存斷點:ba可以用來設置內存斷點。調試過程中一個常見的問題是跟蹤某些數據的變化。如下的斷點:

ba w4 0x40000000 "kb; g"

可以打印出所有修改0x40000000的調用堆棧。

 

控制程序執行p, pa,t, ta等命令可以用來控制程序的執行。

 

控制異常和事件處理Debugger的缺省設置是跳過首次異常(first chance expcetion),在二次異常(second chance exception)時中斷程序的執行。sx命令顯示Debugger的設置。sxesxd可以改變Debugger的設置。

    sxe clr

可以控制Debugger在托管異常發生時中斷程序的執行。常用的Debugger事件有:

    av    訪問異常 

     eh    C++異常

    clr   托管異常

    ld    模塊加載

-c 選項可以用來指定在事件發生時執行的調試命令。

 

posted on 2008-01-18 18:28 大龍 閱讀(41004) 評論(2)  編輯 收藏 引用

評論

# re: WinDBG教程 2008-01-27 11:24 nini

好文,頂??!  回復  更多評論   

# re: WinDBG教程[未登錄] 2008-01-27 15:29 chinaren

推薦一本好書《Windows 用戶態程序高效排錯》
首先是內容介紹,摘自CSDN讀書頻道:


我自己看了這部書演示用的pdf的一些感想:

用真實的案例來講解troubleshooting和debug的步驟和過程,生動而又有深度

作者思路極為清晰,表達精準到位,能從一點點地蛛絲馬跡抓起,直到起出問題根源,這種經驗與技術俱佳的案例分析能讓讀者看完即漲大量exp,有如親歷從debug入手來抓程序設計癥結,這應該還算是國內首次有實體書出版,對于windbg的使用講解也算是開先河了

同時適用于程序員以及系統管理員二種讀者,程序員可以從中掌握一些操作系統級別的資源分配和使用原理,并通過對此的理解來使得自己代碼中對于資源的使用有更加深刻的認識。而SA們也可以由此學到從系統方面剖析用戶態程序的方法,從而使自己對資源的掌控能深入到應用軟件層面,可以更好地維護系統的健康狀況以及給應用設計提出更好地建議

跳開Windows和.net范疇,書中的很多案例的思路其實可以用于更廣泛的領域,對于其他操作系統以及其他框架來說,都可以有觸類旁通的感悟。

我看過其演示pdf之后,就決定著本書一定要買來一讀了,而對此類知識感性趣的人,也絕對應該看一下此書。

  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲福利av| 狠狠入ady亚洲精品| 欧美日韩午夜在线| 午夜精品久久久久久久99樱桃 | 久久免费视频在线| 久久精品人人做人人综合 | 亚洲精品视频中文字幕| 亚洲激情在线观看视频免费| 精品电影在线观看| 欧美激情久久久久久| 一区二区三欧美| 欧美在线视频一区二区三区| 欧美成人自拍| 欧美综合国产| 麻豆精品网站| 欧美一区免费视频| 欧美激情中文不卡| 久久久久99精品国产片| 亚洲国产精品电影在线观看| 欧美日韩福利在线观看| 亚洲第一精品夜夜躁人人躁| 在线视频免费在线观看一区二区| 亚洲欧美国产77777| 久久中文在线| 亚洲精品小视频在线观看| 国产精品嫩草99a| 激情五月综合色婷婷一区二区| 亚洲美女黄色| 久久久xxx| 欧美精品在线一区二区| 日韩亚洲不卡在线| 亚洲欧美日韩天堂| 亚洲精一区二区三区| 国产精品美女久久久久久久| 亚洲视频一二区| 久久综合电影一区| 国产精品视频yy9099| 日韩视频一区二区在线观看 | 另类亚洲自拍| 欧美aⅴ99久久黑人专区| 精品不卡一区| 久久精品人人做人人爽电影蜜月| 欧美一区二区在线免费观看| 国产老肥熟一区二区三区| 中文国产成人精品| 日韩亚洲精品电影| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲欧美美女| 久久全球大尺度高清视频| 欧美日韩精品不卡| 狠狠久久综合婷婷不卡| 欧美日韩国产一区二区三区| 欧美国产日韩精品免费观看| 亚洲欧洲一区二区三区在线观看| 欧美成人一品| 一区二区高清在线| 免费成人av资源网| 欧美日韩亚洲激情| 欧美中文在线观看| 亚洲精品日韩精品| 亚洲国产日韩精品| 国产精品蜜臀在线观看| 欧美日韩国产精品专区| 久久综合久色欧美综合狠狠 | 一区二区三区欧美在线| 欧美日韩激情网| 久久阴道视频| 久久久久久久久综合| 亚洲一区二区在线播放| 欧美日本国产在线| 国产精品成人免费| 国产日韩欧美不卡| 精品成人久久| 亚洲精品一区二区在线观看| aa成人免费视频| 亚洲国内精品在线| 欧美激情精品久久久久久久变态| 欧美成人激情视频| 亚洲国产日韩欧美综合久久| 久久手机免费观看| 国产精品五月天| 精东粉嫩av免费一区二区三区| 黄色日韩精品| 亚洲素人在线| 亚洲免费视频观看| 欧美精品色网| 亚洲一区二区在线免费观看视频| 国产精品99久久久久久久久| 久久亚洲精品欧美| 国产精品美女久久久久久免费| 在线看日韩av| 亚洲免费在线视频一区 二区| 久久福利一区| 欧美主播一区二区三区| 亚洲国产高清自拍| 亚洲精品五月天| 日韩视频在线一区二区| 国产精品亚洲第一区在线暖暖韩国| 亚洲三级色网| 久久久久.com| 欧美电影免费观看网站| 亚洲一区二区三区午夜| 欧美一区二区在线看| 日韩性生活视频| 欧美亚洲在线播放| 国产精品中文在线| 欧美激情精品久久久久久大尺度| 亚洲欧美另类中文字幕| 在线观看成人av| 国产精品xxxav免费视频| 黄色成人av网| 亚洲精品日韩在线观看| 欧美a级大片| 国产综合亚洲精品一区二| 亚洲综合日韩在线| 久久伊人免费视频| 亚洲国产精品成人一区二区 | 欧美日韩高清在线播放| 亚洲国产成人av| 夜夜嗨av一区二区三区网页| 国内精品美女在线观看| 在线一区二区日韩| 亚洲精品乱码| 欧美一区观看| 亚洲欧美综合一区| 欧美日韩视频| 性一交一乱一区二区洋洋av| 亚洲一区图片| 国产精品一二一区| 亚洲伦理在线| 国产精品免费观看在线| 亚洲福利在线视频| 亚洲第一中文字幕| 久久这里只有| 欧美mv日韩mv国产网站| 激情五月综合色婷婷一区二区| 猛男gaygay欧美视频| 国产精品伊人日日| 亚洲无线观看| 一区视频在线看| 欧美成人午夜激情视频| 国产午夜精品美女毛片视频| 亚洲欧美视频一区二区三区| 欧美一区二区三区四区在线| 国产精品永久免费在线| 亚洲欧美国产视频| 欧美在线一二三四区| 久久成人资源| 欧美影视一区| 免费久久久一本精品久久区| 久久免费99精品久久久久久| 欧美二区视频| 欧美在线看片| 欧美国产日韩视频| 亚洲欧洲精品天堂一级| 国产精品视频久久| 久久亚洲精品欧美| 久久久一区二区| 另类激情亚洲| 国产精品女人久久久久久| 亚洲欧美久久久| 蜜臀99久久精品久久久久久软件| 伊人久久久大香线蕉综合直播| 日韩一级成人av| 狠狠综合久久av一区二区老牛| 欧美国产另类| 国产欧美日韩在线| 亚洲精品国产精品国自产观看| 99re6热在线精品视频播放速度| 欧美色精品天天在线观看视频| 亚洲欧美欧美一区二区三区| 女女同性女同一区二区三区91| 一本一本久久| 久久久精品国产免大香伊 | 亚洲美女黄色| 久久本道综合色狠狠五月| 久久先锋资源| 亚洲一级片在线看| 欧美精品在线观看播放| 一本到12不卡视频在线dvd| 久久久综合香蕉尹人综合网| 一本综合久久| 欧美国产一区二区在线观看 | 亚洲免费影视| 欧美日本成人| 午夜视频在线观看一区二区三区| 中日韩午夜理伦电影免费| 国产日产欧美一区| 欧美成人一区二区| 久久激情视频久久| 久久久国产精彩视频美女艺术照福利 | 国产精品永久免费在线| 牛牛国产精品| 久久综合九色综合欧美狠狠| 日韩视频不卡中文| 亚洲国产成人在线播放| 国产亚洲欧美日韩精品| 国产精品欧美一区二区三区奶水| 亚洲女人av| 亚洲最新视频在线|