使用WinDbg调试入门(内核模式)

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

设置内核模式调试

内核模式调试环境通常有两台计算机:主机和目标计算机。调试器在主机上运行,正在调试的代码在目标计算机上运行。主机和目标通过调试电缆连接。Windows调试程序支持以下类型的电缆进行调试:

  • Ethernet
  • USB 2.0
  • USB 3.0
  • 1394
  • Serial (also called null modem)
如果目标计算机运行的是Windows8或更高版本,则可以使用任何类型的调试电缆,包括以太网。此图说明通过以太网电缆连接调试的主机和目标计算机。 使用WinDbg调试入门(内核模式)  

如果目标计算机运行的Windows版本早于Windows 8,则不能使用以太网进行调试;必须使用USB、1394或串行。此图说明了通过USB、1394或串行调试电缆连接的主机和目标计算机。

使用WinDbg调试入门(内核模式)

建立内核模式调试会话

在设置好主机和目标计算机并用调试电缆将它们连接起来之后,您可以按照用于设置的同一主题中的说明建立内核模式调试会话。例如,如果您决定设置主机和目标计算机以通过以太网进行调试,参考《通过网线手动设置内核模式调试》。同样,如果您决定设置主机和目标计算机以通过USB 2.0进行调试,您可以找到建立内核模式调试会话的说明,参考《通过USB 2.0电缆手动设置内核模式调试

开始调试

1、在主机上,打开windbg并与目标计算机建立内核模式调试会话。

2、在windbg中,从帮助菜单中选择内容。这将打开调试器文档chm文件。调试程序文档也可以在这里在线获得。

3、当建立内核模式调试会话时,windbg可能会自动进入目标计算机。如果windbg尚未插入,请从“调试”菜单中选择“中断”。

4、在windbg窗口底部附近的命令行中,输入以下命令:

 .sympath srv* 使用WinDbg调试入门(内核模式)  

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

.reload

5、查看加载模块的列表,请输入以下命令:

lm

使用WinDbg调试入门(内核模式)

6、让目标计算机运行,请输入以下命令:g

7、要再次打断,请从“调试”菜单中选择“打断”。

8、输入此命令以检查NT模块中的_FILE_OBJECT

dt nt!_FILE_OBJECT

 使用WinDbg调试入门(内核模式)

9、输入此命令检查NT模块中的某些符号:

x nt!*CreateProcess*

使用WinDbg调试入门(内核模式)

10、输入此命令以在MmCreateProcessAddressSpace:处放置断点:

bu nt!MmCreateProcessAddressSpace

使用WinDbg调试入门(内核模式)

输入 g 让目标机运行

11、如果目标计算机没有立即进入调试器,请在目标计算机上执行一些操作(例如,打开记事本)。调用mmcreateProcessAddressSpace时,目标计算机将进入调试器。要查看堆栈跟踪,请输入以下命令:

.reload

k

使用WinDbg调试入门(内核模式)

12、在“视图”菜单上,选择“反汇编”。

在“调试”菜单上,选择“跳过”(或按F10)。在观察反汇编窗口时,再输入几次STEP命令。

13、通过输入以下命令清除断点: bc *

输入g让目标计算机运行。从“调试”菜单中选择“中断”或按Ctrl-Break再次中断。

14、查看所有进程的列表,请输入以下命令: !process 0 0

使用WinDbg调试入门(内核模式)

15、复制一个进程的地址,然后输入以下命令:!process Address 2

 For example: !process ffffe00000d5290 2

 使用WinDbg调试入门(内核模式)

16、复制一个线程的地址,然后输入以下命令:!thread Address

 For example: !thread ffffe00000e6d080

 使用WinDbg调试入门(内核模式)

 17、查看即插即用设备树中的所有设备节点,请输入以下命令: !devnode 0 1

 使用WinDbg调试入门(内核模式)

18、查看设备节点及其硬件资源,请输入以下命令:!devnode 0 9

使用WinDbg调试入门(内核模式)

19、查看服务名称为磁盘的设备节点,请输入以下命令:!devnode 0 1 disk

 使用WinDbg调试入门(内核模式)

20、复制devnode 0 1输出显示节点的物理设备对象(PDO)的地址,然后输入以下命令: !devstack PdoAddress

For example: PdoAddress!devstack 0xffffe00001159610

使用WinDbg调试入门(内核模式)

21、获取有关driver disk.sys的信息,请输入以下命令:!drvobj disk 2

 使用WinDbg调试入门(内核模式)

22、!drvobj的输出显示调度例程的地址:例如,classpnp!类别全局显示。要在ClassGlobalDispatch上设置和验证断点,请输入以下命令: bu CLASSPNP!ClassGlobalDispatch bl

输入g让目标计算机运行。 如果目标计算机没有立即进入调试器,请在目标计算机上执行一些操作(例如,打开记事本并保存文件)。调用ClassGlobalDispatch时,目标计算机将进入调试器。要查看堆栈跟踪,请输入以下命令:.reload k 使用WinDbg调试入门(内核模式)

23、结束调试会话,请输入以下命令:qd

上一篇:c – .pdb中的函数地址与.exe不同,为什么?


下一篇:Windbg命令的语法规则系列(二)