windbg是一个内核模式和用户模式调试器,包含在Windows调试工具中。在这里,提供个实践练习,帮助我们开始使用windbg作为用户模式调试器。

用WinDbg调试记事本

1、导航到安装目录,然后打开windbg.exe。

2、在“文件”菜单上,选择“打开可执行文件”。在“打开可执行文件”对话框中,导航到包含notepad.exe的文件夹(例如,C:\windows\system32)。输入notepad.exe作为“文件名”。单击“打开”。

使用WinDbg调试入门(用户模式)_堆栈

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

输出:

使用WinDbg调试入门(用户模式)_应用程序_02

符号搜索路径告诉windbg在哪里查找符号(pdb)文件。调试器需要符号文件来获取有关代码模块(函数名、变量名等)的信息。
输入此命令,通知windbg执行符号文件的初始查找和加载:.reload

4、查看notepad.exe模块的符号

请输入以下命令:x notepad!*
使用WinDbg调试入门(用户模式)_堆栈_03

注意:如果看不到任何输出,请输入.reload。要查看包含main的notepad.exe模块中的符号,请输入以下命令: x notepad!*main*
使用WinDbg调试入门(用户模式)_应用程序_04

5、在记事本上设置断点notepad!WinMain,输入以下命令:bu notepad!WinMain

要验证是否设置了断点,请输入以下命令:bl

使用WinDbg调试入门(用户模式)_可执行文件_05

6、运行,请输入以下命令:g

记事本一直运行到winmain函数,然后中断到调试器。

使用WinDbg调试入门(用户模式)_调试---工具&Windbg_06

要查看在记事本进程中加载的代码模块列表,请输入以下命令:lm

 使用WinDbg调试入门(用户模式)_调试器_07

要查看堆栈跟踪,请输入以下命令:k

使用WinDbg调试入门(用户模式)_可执行文件_08

7、再次运行 g

8、要中断记事本执行,请从“调试”菜单中选择“中断”。

9、观察保存过程,要在zwwritefile处设置和验证断点,请输入以下命令:

bu ntdll!ZwWriteFile

bl

使用WinDbg调试入门(用户模式)_可执行文件_09

10、输入g重新开始运行记事本。在记事本窗口中,输入一些文本,然后从“文件”菜单中选择“保存”。当涉及zwCreateFile时,正在运行的代码将中断。输入k以查看堆栈跟踪。

使用WinDbg调试入门(用户模式)_调试器_10

在windbg窗口的命令行左侧,注意处理器和线程号。在本例中,当前处理器编号为0,当前线程编号为15。因此,我们正在查看线程151的堆栈跟踪(它恰好运行在处理器0上)。
11、要查看记事本进程中所有线程的列表,请输入以下命令:~
使用WinDbg调试入门(用户模式)_调试器_11
12、要查看线程0的堆栈跟踪,请输入以下命令:

~0s,k

使用WinDbg调试入门(用户模式)_应用程序_12

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显示源代码和命令窗口。
使用WinDbg调试入门(用户模式)_堆栈_13

5、在“调试”菜单上,选择“单步执行”(或按F11)。继续单步执行,直到进入MyFunction。当您单步执行y=x/p2行时,应用程序将崩溃并进入调试器。输出与此类似:

 使用WinDbg调试入门(用户模式)_应用程序_14

6、输入下面命令

!analyze -v

windbg显示对问题的分析(在本例中除以0)。
 使用WinDbg调试入门(用户模式)_调试器_15