程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> WinDbg 入門指導(3)-WinDbg中常用的功能以及設置

WinDbg 入門指導(3)-WinDbg中常用的功能以及設置

編輯:.NET實例教程

調試器擴展DLL

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

內存轉儲文件

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

崩潰轉儲分析

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

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

<!--[if !supportLists]-->1)      <!--[endif]-->在WinDbg內,通過 File->’Open Crash Dump’, 指向轉儲文件。

<!--[if !supportLists]-->2)      <!--[endif]-->WinDgb會給你顯示應用程序崩潰之時所執行的指令。

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

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

WinDbg的常用設置

符號文件與文件夾

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

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

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

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

使用的命令就是:

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

 

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

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

源代碼路徑

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

斷點,跟蹤

<!--[if !supportLists]-->·         <!--[endif]-->通過bp命令或者工具欄上的斷點圖片來設置軟斷點。

<!--[if !supportLists]-->·         <!--[endif]-->通過代碼比如DbgBreakPoint() 或者 KdBreakPoint()來設置硬斷點。

<!--[if !supportLists]-->·         <!--[endif]-->在擴展DLL中使用跟蹤函數DbgPrint, KdPrint, OutputDebugString 來把輸出顯示在WinDbg的輸出窗口中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved