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


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

用WinDbg調試記事本

1、導航到安裝目錄,然后打開windbg.exe。

2、在“文件”菜單上,選擇“打開可執行文件”。在“打開可執行文件”對話框中,導航到包含notepad.exe的文件夾(例如,C:\windows\system32)。輸入notepad.exe作為“文件名”。單擊“打開”。

3、在windbg窗口底部附近的命令行中,輸入以下命令:.sympath srv*.

輸出:

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

4、查看notepad.exe模塊的符號

請輸入以下命令:x notepad!*

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

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

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

6、運行,請輸入以下命令:g

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

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

 

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

7、再次運行 g

8、要中斷記事本執行,請從“調試”菜單中選擇“中斷”。

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

bu ntdll!ZwWriteFile

bl

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

在windbg窗口的命令行左側,注意處理器和線程號。在本例中,當前處理器編號為0,當前線程編號為15。 因此,我們正在查看線程151的堆棧跟蹤(它恰好運行在處理器0上)。
11、要查看記事本進程中所有線程的列表,請輸入以下命令:~
12、 要查看線程0的堆棧跟蹤,請輸入以下命令:

~0s,k

13、 要退出調試並從記事本進程中分離,請輸入以下命令: 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中。

1、打開Windbg

2、在“文件”菜單上,選擇“打開可執行文件”。在“打開可執行文件”對話框中,導航到c:\myapp\x64\debug。輸入myapp.exe作為“文件名”。單擊“打開”。

3、輸入下面的命令:

.sympath srv*

.sympath+ C:\MyApp\x64\Debug

.srcpath C:\MyApp\MyApp

現在,windbg知道在哪里可以找到應用程序的符號和源代碼。

4、輸入下面的命令:

.reload

bu MyApp!main

g

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

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

 

6、輸入下面命令

!analyze -v

windbg顯示對問題的分析(在本例中除以0)。
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM