WinDbg调试基础教程-用户模式

发布时间 2024-01-10 11:50:32作者: zhaotianff

在前面的文章中,介绍了如何使用WinDbg分析蓝屏原因

https://www.cnblogs.com/zhaotianff/p/15150244.html

 

不过那会都是在网上找的资料,东拼西凑出来,并没有系统的去学习WinDbg。

最近在学习内核开发这一块的内容,刚好要用到WinDbg,所以这里找资料进行系统的入门一下,做个总结。

 

本文内容是基于用户模式下的调试,后面的文章中,会介绍内核模式下的调试。

 

Windows调试工具(Debugging Tools for Windows)

Debugging Tools for Windows由调试器、工具以及软件包中调试器的相关文档组成。这个工具包可以作为Windows SDK或者WDK的一部分安装。

工具包中包括四个调试器:Cdb.exe、Ntsd.exe、Kd.exe和WinDbg.exe。

本文只详细介绍WinDbg,其它工具只做简单介绍。

 

Cdb.exe和Ntsd.exe

Cdb和Ntsd是用户模式的、基于控制台的调试器。它们能够被附加到进程上,就像别的用户模式调试器一样。这两者都有控制台用户界面一键入一条命令,得到一个回应,如此这般地重复。这两者之间唯一的区别在于,如果从控制台窗口启动,Cdb会直接用原来那个窗口,而Ntsd会打开一个新的窗口。其他方面它们都一样。

 

Kd.exe

Kd是具有控制台用户界面的内核调试器,能够被附加到本地内核或者另一台机器上。

 

WinDbg.exe

WinDbg是唯一一个具有图形用户界面的调试器。根据从菜单所做的选择,或者启动时指定的命令行参数,它能够进行用户模式和内核模式调试。

本文是基于用户模式的调试。

 

 

WinDbg简介

像平常在Visual Studio中调试时,大部分的功能是借助菜单或按钮实现,WinDbg建立在命令之上。

用户输入一个命令,调试器用文本描述命令执行的结果给出响应。

在GUI模式下,一些结果用专门的窗口进行显示,比如局部变量、栈、线程等。

正是因为这种调试模式,所以WinDbg学习的门槛就要相对高一些,得记这些命令。

 

WinDbg支持三类命令:

1、内部命令

这些命令内建于调试器之中,操作被调试的目标

2、元命令

这些命令以(.)开头,操作调试进程自身,不直接操作被调试的目标。

3、扩展命令

这些命令以(!)开头,为调试器提供了很多功能。所有扩展命令均在外部DLL中实现。 默认情况下,调试器加载一组预定义的扩展DLL,但是通过使用.load命令可以从Debugger目录或其他目录中加载更多DLL。

 

WinDbg基础调试(用户模式)

有两种方法可以初始化用户模式的调试

1、先打开WinDbg,再通过在“ 文件 ”菜单上,选择“ 启动可执行文件”。程序运行后,会自动附加到WinDbg

2、先运行程序,再打开WinDbg,然后通过“文件”菜单上,选择“附加到进程”,通过选择进程列表里的进程进行附加。

 

这里我们以notepad(Windows记事本)为例进行演示

 

1、打开WinDbg

2、在“ 文件 ”菜单上,选择“ 启动可执行文件”。 在“启动可执行文件”对话框中,转到包含 notepad.exe 的文件夹。 (notepad.exe 文件通常位于 C:\Windows\System32.) 对于 “文件名”,请输入 notepad.exe。 选择“打开” 。进程创建后,会自动中断,WinDbg会自动添加一个断点。

说明:命令窗口是我们主要关注的窗口,它应该始终保持打开状态。这个窗口会显示各种命令的响应结果。

如果不小心关闭了,可以通过工具栏按钮再次打开

 

3、输入 .symfix命令,自动将符号路径设置为指向 Microsoft 符号存储(关于调试符号,可以参考https://www.cnblogs.com/zhaotianff/p/16931797.html

4、输入 x notepad!* 命令查看notepad模块的符号

 1 0:000> x notepad!*
 2 00007ff6`40267460 notepad!<lambda_13f119b44549d7aec2177494846f39c3>::<lambda_invoker_cdecl> (void)
 3 00007ff6`4026eb70 notepad!wistd::__function::__func<<lambda_0186fc037f7c95b0bbb1a993b253897d>,long __cdecl(unsigned short *,unsigned __int64,unsigned __int64 *)>::operator() (void)
 4 00007ff6`402662d0 notepad!<lambda_694cf3250e255c878c64dabf1ae2e40c>::<lambda_invoker_cdecl> (void)
 5 00007ff6`40267bac notepad!ShowOpenSaveDialog (void)
 6 00007ff6`4027d75c notepad!StringLengthWorkerW (void)
 7 00007ff6`4027f5a0 notepad!`WaitForCompletion<Windows::Foundation::IAsyncOperationCompletedHandler<Windows::Security::EnterpriseData::FileProtectionInfo *>,Windows::Foundation::IAsyncOperation<Windows::Security::EnterpriseData::FileProtectionInfo *> >'::`2'::FTMEventDelegate::Invoke (void)
 8 00007ff6`40261380 notepad!wil::details::`dynamic initializer for 'g_header_init_InitializeStagingSRUMFeatureReporting'' (void)
 9 00007ff6`40267570 notepad!wistd::__function::__func<<lambda_0186fc037f7c95b0bbb1a993b253897d>,long __cdecl(unsigned short *,unsigned __int64,unsigned __int64 *)>::destroy (void)

5、使用 ~ 命令,显示被调试进程内部的所有线程信息

1 0:000> ~
2 .  0  Id: 5ba4.950 Suspend: 1 Teb: 00000034`cb6a0000 Unfrozen
3    1  Id: 5ba4.234c Suspend: 1 Teb: 00000034`cb6a2000 Unfrozen
4    2  Id: 5ba4.6834 Suspend: 1 Teb: 00000034`cb6a4000 Unfrozen
5    3  Id: 5ba4.52dc Suspend: 1 Teb: 00000034`cb6a6000 Unfrozen

6、输入 lm 命令,查看已经加载的模块

 1 0:000> lm
 2 start             end                 module name
 3 00007ff6`40260000 00007ff6`40292000   notepad    (pdb symbols)          C:\ProgramData\dbg\sym\notepad.pdb\48F76637AE64DAE8764C8F9F4B27AEA51\notepad.pdb
 4 00007ffb`e0710000 00007ffb`e0995000   COMCTL32   (deferred)             
 5 00007ffb`f29d0000 00007ffb`f29f1000   win32u     (deferred)             
 6 00007ffb`f2b40000 00007ffb`f2bc0000   bcryptPrimitives   (deferred)             
 7 00007ffb`f2bc0000 00007ffb`f2cba000   ucrtbase   (deferred)             
 8 00007ffb`f3440000 00007ffb`f34de000   msvcp_win   (deferred)             
 9 00007ffb`f3550000 00007ffb`f37f3000   KERNELBASE   (deferred)             
10 00007ffb`f3950000 00007ffb`f3ae4000   gdi32full   (deferred)             
11 00007ffb`f3af0000 00007ffb`f3b99000   shcore     (deferred)             
12 00007ffb`f3ba0000 00007ffb`f3d33000   USER32     (deferred)             
13 00007ffb`f3d40000 00007ffb`f3de3000   advapi32   (deferred)             
14 00007ffb`f3f90000 00007ffb`f4042000   KERNEL32   (deferred)             
15 00007ffb`f49a0000 00007ffb`f4a3e000   msvcrt     (deferred)             
16 00007ffb`f4a50000 00007ffb`f4ae7000   sechost    (deferred)             
17 00007ffb`f4d70000 00007ffb`f4e90000   RPCRT4     (deferred)             
18 00007ffb`f4f00000 00007ffb`f4f26000   GDI32      (deferred)             
19 00007ffb`f55f0000 00007ffb`f5926000   combase    (deferred)             
20 00007ffb`f5a40000 00007ffb`f5c30000   ntdll      (pdb symbols)          C:\ProgramData\dbg\sym\ntdll.pdb\CFD10E5F223FEE5F26227CB82510FEDC1\ntdll.pdb