使用WinDbg調試入門(用戶模式)

windbg是一個內核模式和用戶模式調試器,包含在Windows調試工具中。在這裏,提供個實踐練習,幫助咱們開始使用windbg做爲用戶模式調試器。windows

用WinDbg調試記事本

一、導航到安裝目錄,而後打開windbg.exe。app

二、在「文件」菜單上,選擇「打開可執行文件」。在「打開可執行文件」對話框中,導航到包含notepad.exe的文件夾(例如,C:\windows\system32)。輸入notepad.exe做爲「文件名」。單擊「打開」。函數

三、在windbg窗口底部附近的命令行中,輸入如下命令:.sympath srv*.工具

輸出:spa

符號搜索路徑告訴windbg在哪裏查找符號(pdb)文件。調試器須要符號文件來獲取有關代碼模塊(函數名、變量名等)的信息。
輸入此命令,通知windbg執行符號文件的初始查找和加載:.reload命令行

四、查看notepad.exe模塊的符號線程

請輸入如下命令:x notepad!*
debug

注意:若是看不到任何輸出,請輸入.reload。要查看包含main的notepad.exe模塊中的符號,請輸入如下命令: x notepad!*main*
調試

五、在記事本上設置斷點notepad!WinMain,輸入如下命令:bu notepad!WinMaincode

要驗證是否設置了斷點,請輸入如下命令:bl

六、運行,請輸入如下命令:g

記事本一直運行到winmain函數,而後中斷到調試器。

要查看在記事本進程中加載的代碼模塊列表,請輸入如下命令:lm

 

要查看堆棧跟蹤,請輸入如下命令:k

七、再次運行 g

八、要中斷記事本執行,請從「調試」菜單中選擇「中斷」。

九、觀察保存過程,要在zwwritefile處設置和驗證斷點,請輸入如下命令:

bu ntdll!ZwWriteFile

bl

十、輸入g從新開始運行記事本。在記事本窗口中,輸入一些文本,而後從「文件」菜單中選擇「保存」。當涉及zwCreateFile時,正在運行的代碼將中斷。輸入k以查看堆棧跟蹤。

在windbg窗口的命令行左側,注意處理器和線程號。在本例中,當前處理器編號爲0,當前線程編號爲15。 所以,咱們正在查看線程151的堆棧跟蹤(它剛好運行在處理器0上)。
十一、要查看記事本進程中全部線程的列表,請輸入如下命令:~
十二、 要查看線程0的堆棧跟蹤,請輸入如下命令:

~0s,k

1三、 要退出調試並從記事本進程中分離,請輸入如下命令: qd

用Windbg調試本身的程序

編寫並構建了下面這個小型控制檯應用程序。
void MyFunction(long p1, long p2, long p3)
{
	long x = p1 + p2 + p3;
	long y = 0;
	y = x / p2;
}

void main ()
{
	long a = 2;
	long b = 0;
	MyFunction(a, b, 5);
}

 對於本練習,咱們假設構建的應用程序(myapp.exe)和符號文件(myapp.pdb)位於C:\myapp\x64\debug中。咱們還將假設應用程序源代碼位於C:\myapp\myapp中。

一、打開Windbg

二、在「文件」菜單上,選擇「打開可執行文件」。在「打開可執行文件」對話框中,導航到c:\myapp\x64\debug。輸入myapp.exe做爲「文件名」。單擊「打開」。

三、輸入下面的命令:

.sympath srv*

.sympath+ C:\MyApp\x64\Debug

.srcpath C:\MyApp\MyApp

如今,windbg知道在哪裏能夠找到應用程序的符號和源代碼。

四、輸入下面的命令:

.reload

bu MyApp!main

g

當應用程序涉及到它的主函數時,它就進入了調試器。 windbg顯示源代碼和命令窗口。

五、在「調試」菜單上,選擇「單步執行」(或按F11)。繼續單步執行,直到進入MyFunction。當您單步執行y=x/p2行時,應用程序將崩潰並進入調試器。輸出與此相似:

 

六、輸入下面命令

!analyze -v

windbg顯示對問題的分析(在本例中除以0)。
 
相關文章
相關標籤/搜索