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

isware

WinDbg入門教程(轉載)

原文出處:http://www.7747.net/Article/200812/31157.html

介紹

在我的職業(yè)生涯中,我看到我們大多數(shù)都是使用Visual Studio來進行調試,而不是用其它許多免費的調試器。你可能有許多理由來使用這樣的調試器,比如,在你家里的機器上沒裝開發(fā)環(huán)境,但是一個程序一次次的崩潰。其實根據(jù)堆棧的dump就可以判斷出IE的崩潰是否是由于一個第三方的插件。

對于WinDbg,我目前為止還沒有發(fā)現(xiàn)很好的快速入門的教程。這篇文章結合實例討論了WinDbg的使用。我首先假設你熟悉調試的基本概念:stepping in, stepping out,斷點以及遠程調試的基本概念。

注意,這本來是座位一個入門的文檔,你可以閱讀并且開始使用WinDbg. 如果對于特定的命令有疑問,請查閱WinDbg的文檔。你可以在任何微軟提供的調試器中使用這篇文章中提到的命令,比如在VS的命令行窗口中。

這篇文章是基于WinDbg 6.3.

這僅僅是一系列關于調試技術的文章中的第一篇。在下一篇文章中,我會解釋如何針對調試器編寫擴展DLL.

調試器一覽

下面大概介紹了你可以從微軟網(wǎng)站上下載到的調試器:

·         KD-內核調試器。你可以用它來調試藍屏一類的系統(tǒng)問題。如果是開發(fā)設備驅動程序是少不了它的。

·         CDB-命令行調試器。這是一個命令行程序

·         NTSD-NT調試器。這是一個用戶模式調試器,可以用來調試用戶模式應用程序。它實際上是一個CDBwindows UI增強。

·         WinDbg-用一個漂亮的UI包裝了KDNTSDWinDbg即可以調試內核模式,也可以調試用戶模式程序。

·         VS, VS.net-使用同KDNTSD相同的調試引擎,并且相比于同樣用于調試目的的WinDbg,提供了功能更豐富的界面。

調試器之間的比較

功能

KD

NTSD

WinDbg

Visual Studio .NET

內核模式調試

Y

N

Y

N

用戶模式調試

 

Y

Y

Y

非托管調試

Y

Y

Y

Y

托管調試

 

Y

Y

Y

遠程調試

Y

Y

Y

Y

附加到進程

Y

Y

Y

Y

從進程分離

Y

Y

Y

Y

SQL調試

N

N

N

Y

WinDbg

WinDbg實際上包裝了NTSDKD并且提供了一個更好用的用戶界面。它也提供了命令行開關,比如最小化啟動(-m),附加到一PID指定的進程(-p)以及自動打開崩潰文件(-z)。它支持三種類型的命令。

·         Regular commands(比如: k) 用來調試進程

·         Dot commands(比如:.sympath)用來控制調試器

·         Extension commands(比如: !handle)-這些命令屬于可以用來添加到WinDbg的自定義命令;它們用擴展DLL的輸出函數(shù)來實現(xiàn)。

PDB文件

PDB文件指的是鏈接器生成程序數(shù)據(jù)庫文件(Program database files)。私有的PDB文件包括私有以及公有符號,源代碼行號,類型,局部以及全局變量。公有的PDB文件不包含類型,局部變量以及源代碼行號信息。

調試場景

遠程調試

使用WinDbg進行遠程調試是很容易的,而且有很多種可行的方法。在下文中,調試服務器指的是運行在你所要調試的遠程機器上的調試器。調試客戶端指的是控制當前會話的調試器。

·         使用調試器:你需要CDB, NTSD或者WinDbg已經(jīng)安裝在遠程機器上。WinDbg客戶端可以連接到CDB, NTSD或者WinDbg中的任何一個作為服務器,反之亦然。在客戶端和服務器直接可以選擇TCP或者命名管道作為通訊協(xié)議。

o   在服務器端的啟動過程:

§  WinDbg –server npipe:pipe=pipename(注:可以允許多個客戶端連或

§  WinDbg內部: .server npipe:pipe=pipename(注,連接單個客戶端)

你可以用多種協(xié)議開啟不同的服務會話。并且可用密碼來保護一個會話。

o   從客戶端連接:

§  WinDbg -remote npipe:server=Server, pipe=PipeName[,password=Password]

§  WinDbg內部: File->Connect to Remote Session: for connection string, enter npipe:server=Server, pipe=PipeName [,password=Password]

·             使用Remote.exe: Remote.exe使用命名管道作為通訊的方式。如果你使用的是一個命令行接口的程序,比如KD,CDB或者NTSD。你可以使用remote.exe來遠程調試。注意:使用@q(不是q)來退出客戶端,不用關掉服務端。

o   要啟動一個服務端:

§  Remote.exe /s “cdp –p <pid>” test1

o   從客戶端連接:

§  Remote.exe /c <machinename> test1

上面的test1是我們所選擇的命名管道的名字。

    服務端會顯示那個客戶端從那個服務器連接以及執(zhí)行過的命令。你可以使用‘qq’命令來退出服務端;或者使用File->Exit來退出客戶端。另外,如果要進行遠程調試,你必須屬于遠程機器的”Debugger User”組并且服務器必須允許遠程連接。

即時調試

WinDbg的文檔的”Enabling Postmorten Debugging”部分對此有很詳細的討論。簡而言之,你可以把WinDbg設置成默認的即時調試器,命令就是:Windbg –I。這個命令實際上是把注冊表中 HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug的鍵值設置成WinDbg。如果要把WinDbg設置成為默認的托管調試器,你需要顯示設置如下的注冊表鍵值:

  • HKLM\Software\Microsoft\.NETFramework\DbgJITDebugLaunchSetting 設置成 2
  • HKLM\Software\Microsoft\.NETFramework\DbgManagedDebugger 設置成Windbg.(注意其中的啟動參數(shù)設置)

通過JIT的設置,當一個應用程序在不是調試的狀態(tài)下拋出了未處理的異常之時,WinDbg就會被啟動。

64位調試

所有這些調試器均支持在AMD64IA64上的64位調試環(huán)境。

托管應用程序的調試

WinDbg 6.3以后的版本支持在Widbey(VS2005.net 2.0的內部開發(fā)代號) .net CLR托管調試。在文檔中針對托管調試有很好的討論。需要注意的是,對于托管程序來說,沒有剛才所說的PDB(譯注:托管代碼實際上也是有PDB的,但是這個PDB實際上記錄了C#代碼和IL代碼的對應關系以及相關的一些信息)的概念,因為所有的程序都是編譯成為ILASM。調試器通過CLR來查詢所需的附加信息。

有幾點需要注意:

你只能在托段函數(shù)的代碼被執(zhí)行過至少一次之后才能設置斷點。只有這樣它才能被編譯成匯編代碼。記住以下的幾點:

  • 關于函數(shù)的地址的復雜化以及對應的斷點設置:

o   CLR有可能丟棄已經(jīng)編譯好的代碼,所以函數(shù)的入口地址有可能改變。

o   同樣的代碼有可能被多次編譯,如果多個應用程序域沒有共享這段代碼的話。如果你設置了一個斷點,它就會被設置在當前線程(譯注:CLR的邏輯線程)所在的應用程序域內。

o   泛型的特殊實例可能導致同一個函數(shù)有不同的地址。.

  •  數(shù)據(jù)存儲布局的復雜化以及對應的數(shù)據(jù)檢查:
    • CLR可能會在運行的時候任意改變數(shù)據(jù)的存儲布局,所以一個結構體成員的偏移量可能會被改變掉. (譯注:實際上是在一個類型被加載的時候決定的數(shù)據(jù)布局,之后是不會改變的。)
    • 一個類型的信息是在第一次使用的時候被加載,所以你可能不能夠查看一個數(shù)據(jù)成員如果它還沒有被使用過.
  • 調試器命令的復雜化

o   當跟蹤托管代碼的時候,你會需要穿越大段的CLR自己的代碼比如JIT編譯器的代碼,原因可能是你第一次進入一個函數(shù),或者是你在托管和非托管代碼之間進行切換。

調試Windows服務

使用WinDbg,你可以像調試其它應用程序那樣調試Windows服務程序。即可以通過附加進程的方法啟動Windows服務,也可以把WinDbg當作一個即時調試器,并且在代碼中調用DbgBreakPoint 或者 DebugBreak,或者在x86機器上加入一條int 3匯編指令。

調試異常

一個調試器會得到兩次的異常通知-第一次在應用程序有機會處理異常之前(‘first chance exception’);如果應用程序沒有處理這個異常,這時候調試器就會有機會來處理異常(‘second-chance exception’)。如果調試器沒有處理二次機會的異常,應用程序就會退出。

.lastevent或者,!analyze –v命令會給你顯示異常的記錄以及異常拋出所在函數(shù)的堆棧跟蹤信息。

你也可以使用 .exr, .cxr以及 .ecxr命令來顯示異常和上下文記錄。同時需要注意的是,你也可以改變first-chance的處理選項。對應的命令就是: sxe, sxd, sxnsxi

WinDbg的功能

調試器擴展DLL

所謂的擴展指的是一些DLL,你可以用在調試器內調用并且執(zhí)行一些自定義的命令。這些DLL必須實現(xiàn)一些特定的函數(shù),并且要滿足一些需求,這樣才能被認為是一個擴展DLL。在下一篇文章內,我們將會了解到怎樣寫出一個擴展DLL。所謂的bang(!)命令就是從你的擴展DLL內執(zhí)行的命令。注意這些DLL是被加載到調試器的進程空間內。

內存轉儲文件

你可以使用轉儲功能來取得一個進程的快照信息。一個mini-dump通常比較小,除非你使用了全內存的minidump(.dump /mf)。通常能夠轉儲句柄信息也是很有用的,命令是 .dump/mfh。一個小型轉儲通常包含了所有的線程的堆棧以及一個已被加載的模塊的列表。一個全轉儲包含了更多的信息,比如進程的堆。

崩潰轉儲分析

如果你的windows系統(tǒng)當機,那么它就會在一個文件中轉儲物理內存中的數(shù)據(jù),以及所有的進程信息。可以通過Control Panel ->System->Advanced->’Startup and Recovery’來配置。你也可以首先把WinDbg配置成為一個即時調試器,然后就可以取得任意一個非正常終止的進程的轉儲(.dump)。注意,從轉儲文件中分析出代碼中的bug往往是一個復雜費力的過程。

使用以下的步驟來分析一個轉儲文件:

1)      WinDbg內,通過 File->’Open Crash Dump’, 指向轉儲文件。

2)      WinDgb會給你顯示應用程序崩潰之時所執(zhí)行的指令。

3)      正確設置你的符號文件目錄和源代碼目錄。如果你不能夠匹配正確的符號文件,想要弄清楚程序的邏輯是非常困難的。如果你能夠把符號文件匹配到正確版本的源代碼,這是就應該很容易分析出Bug原因。注意,私有符號文件含有行號信息并且會盲目的顯示你源代碼中的對應行而不進行任何的檢查;如果你的源碼版本不對,那么你就不能夠看到匹配匯編代碼的正確源碼。如果你僅僅有公有的符號文件,你會看到最后一個被調用的函數(shù)(棧上的)。

注意調試驅動或者托管代碼是與此有很大不同的。參考《The Windows 2000 Device Driver Book》來獲得調試設備驅動的技術。

WinDbg的常用設置

符號文件與文件夾

如果想更有效的調試,你需要符號文件。符號文件可以是老式的COFF格式或者就是PDB格式。PDB就是程序數(shù)據(jù)庫文件并且包含了公有符號。這些調試器內,你可以使用一系列的地址來讓調試器尋找已經(jīng)加載的二進制文件的符號。

操作系統(tǒng)的符號文件一般存儲在%SYSTEMDIR%Symbols目錄。驅動程序的符號文件(.DBG.PDB)一般存儲在和驅動文件(.sys 文件)相同的目錄下。私有符號文件包含的信息包括:函數(shù),局部以及全局變量,以及用來把匯編代碼和源代碼關聯(lián)起來的行號信息;對于客戶來說,符號文件一半是公有的-這些文件僅僅包括公有成員。

你可以通過File-Symbol File Path來設置符號文件目錄,或者使用 .sympath命令。如果想要添加到網(wǎng)絡上符號文件的引用,添加以下的內容到你的 .sympath

SRV*downstream_store*http://msdl.microsoft.com/download/symbols

使用的命令就是:

.sympath+ SRV*c:\tmp*http://msdl.microsoft.com/download/symbols

C:\tmp就是download_store,所需要的符號文件會被下載存儲至此。注意這個符號服務器僅僅開放了公有的符號文件。

當調試器把一個二進制文件(DLLexe)的時候,他會檢查比如文件名,時間戳以及校驗值。如果你有符號信息,你就可以在調用棧上看到函數(shù)名和他們的參數(shù)。如果二進制文件和PDB文件都來自于你自己的應用程序,你就可以看到比如私有函數(shù),局部變量以及類型這類額外的信息。

源代碼路徑

你可以通過File->Source File Path來設置源碼路徑,或者使用.srcpath命令。如果你設置了代碼的路徑,當你調試的時候,調試器會通過PDB文件的行號信息來顯示相匹配的源代碼。

斷點,跟蹤

·         通過bp命令或者工具欄上的斷點圖片來設置軟斷點。

·         通過代碼比如DbgBreakPoint() 或者 KdBreakPoint()來設置硬斷點。

·         在擴展DLL中使用跟蹤函數(shù)DbgPrint, KdPrint, OutputDebugString 來把輸出顯示在WinDbg的輸出窗口中。

您對本文章有什么意見或著疑問嗎?請到論壇討論您的關注和建議是我們前行的參考和動力

posted on 2010-03-09 14:33 艾斯維亞 閱讀(923) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   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>
            在线成人激情黄色| 亚洲理伦电影| 久久丁香综合五月国产三级网站| 亚洲一区3d动漫同人无遮挡| 国产精品国产三级国产普通话三级| 亚洲欧美日韩在线| 午夜精品福利一区二区蜜股av| 国产视频亚洲精品| 美日韩精品视频免费看| 欧美国产日韩二区| 亚洲自啪免费| 久久精品一二三| 亚洲美女黄色| 亚洲一区国产视频| 在线看日韩av| 在线视频精品一区| 黄色精品在线看| 91久久国产综合久久| 国产精品mm| 久久久精品国产一区二区三区| 久久夜色撩人精品| 亚洲制服欧美中文字幕中文字幕| 欧美亚洲在线| 99国产精品视频免费观看一公开| 亚洲一级电影| 亚洲三级电影在线观看| 亚洲欧美日韩一区二区三区在线观看 | 免费观看在线综合色| 欧美日本免费一区二区三区| 久久精品人人做人人爽| 欧美激情视频在线免费观看 欧美视频免费一 | av成人天堂| 欧美一级大片在线观看| 亚洲精品中文字幕有码专区| 午夜精品久久久久久久久| 亚洲免费观看视频| 午夜视频一区| 亚洲一区二区在线免费观看视频| 久久久一二三| 欧美一级免费视频| 欧美日韩一区二区在线视频| 欧美高清免费| 红桃视频国产一区| 亚洲综合视频在线| 中日韩美女免费视频网站在线观看| 久久久精品国产99久久精品芒果| 亚洲欧美制服中文字幕| 久久综合狠狠综合久久激情| 久久精品国产欧美激情| 国产精品sss| 亚洲麻豆视频| 日韩视频中文字幕| 能在线观看的日韩av| 美日韩精品免费观看视频| 久久久999精品| 欧美日韩精品一区二区在线播放| 欧美不卡高清| 亚洲高清在线视频| 久久九九免费| 乱码第一页成人| 激情五月婷婷综合| 久久精精品视频| 久久久人成影片一区二区三区| 国产精品一区二区欧美| 亚洲一区尤物| 欧美在线91| 国产一区在线视频| 久久久久久久激情视频| 久久伊人一区二区| 一色屋精品视频在线观看网站| 欧美中文在线视频| 久久久亚洲一区| 有坂深雪在线一区| 免费久久99精品国产自在现线| 美女诱惑黄网站一区| 亚洲激情偷拍| 欧美精品成人| 亚洲深夜福利网站| 欧美一区二区三区四区在线观看| 国产欧美91| 久久夜色精品国产噜噜av| 亚洲国产精品久久久| 一区二区三区日韩精品视频| 欧美视频中文字幕| 性久久久久久| 亚洲电影天堂av| 亚洲天堂av电影| 国产麻豆日韩欧美久久| 久久婷婷综合激情| 日韩午夜电影| 久久久999精品| 亚洲精品一区二区三| 欧美日韩一二区| 午夜精品久久久久久久久| 男人的天堂成人在线| 一本久道久久综合狠狠爱| 国产日韩欧美麻豆| 你懂的亚洲视频| 亚洲色图自拍| 欧美国产综合| 欧美一区二区三区男人的天堂| 樱桃视频在线观看一区| 欧美日韩精品免费看 | 欧美电影免费| 午夜精品www| 亚洲国产日日夜夜| 国产精品入口66mio| 蘑菇福利视频一区播放| 亚洲欧美日韩一区二区| 欧美激情一区二区三区在线视频 | 亚洲一级免费视频| 国内揄拍国内精品少妇国语| 欧美日韩精品免费在线观看视频| 久久av老司机精品网站导航| 99re成人精品视频| 欧美激情四色 | 亚洲一区二区三区欧美| 亚洲丰满在线| 国产欧美日韩视频一区二区| 欧美精品午夜视频| 久久最新视频| 欧美在线一二三区| 亚洲一区二区在线观看视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 午夜免费久久久久| 国产精品99久久99久久久二8| 亚洲国产精品高清久久久| 国产亚洲欧美一区| 国产精品日日摸夜夜摸av| 欧美日韩免费观看中文| 欧美精品三级| 欧美成人一区在线| 老司机一区二区三区| 久久精品综合网| 欧美一区中文字幕| 欧美一级二区| 欧美一区二区三区四区在线观看地址 | 久久久噜久噜久久综合| 欧美在线一区二区| 欧美诱惑福利视频| 欧美一区二区精品| 欧美在线视频日韩| 久久国内精品视频| 久久久视频精品| 久久综合狠狠综合久久综青草 | 久久精品午夜| 久久精品一区蜜桃臀影院| 久久超碰97人人做人人爱| 欧美亚洲三区| 久久久久久网址| 久热精品视频在线观看一区| 久久综合久久综合久久| 欧美福利网址| 91久久在线播放| 日韩网站在线观看| 亚洲一区二区三区高清不卡| 午夜精品福利视频| 久久久人成影片一区二区三区观看| 久久久噜噜噜久久中文字免| 欧美成在线视频| 欧美日韩国产片| 国产精品免费网站| 国内精品久久久| 最近中文字幕日韩精品| 亚洲免费观看高清在线观看 | 亚洲美女精品一区| 亚洲午夜激情免费视频| 欧美亚洲三区| 免费观看成人| 国产精品扒开腿爽爽爽视频| 国产人成一区二区三区影院| 亚洲电影第三页| 在线亚洲一区二区| 久久久91精品| 亚洲精品日韩综合观看成人91 | 免费91麻豆精品国产自产在线观看| 亚洲高清激情| 性欧美在线看片a免费观看| 米奇777超碰欧美日韩亚洲| 欧美日韩一区不卡| 国语自产精品视频在线看一大j8| 亚洲精品日韩综合观看成人91| 亚洲综合色在线| 欧美成人精品h版在线观看| 亚洲色在线视频| 美女视频黄免费的久久| 国产精品一二三四| 亚洲精选在线| 快射av在线播放一区| 亚洲午夜精品一区二区| 免费在线欧美视频| 国产亚洲福利一区| 一区二区三区视频在线观看| 久久综合久久综合久久| 亚洲一区二区少妇| 欧美日韩岛国| 亚洲国产精品第一区二区三区| 欧美一区二区精品久久911| 亚洲精品一级| 米奇777超碰欧美日韩亚洲|