在前面的文章中,介绍了如何使用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
标签:WinDbg,00007ffb,notepad,deferred,基础教程,调试,调试器 From: https://www.cnblogs.com/zhaotianff/p/17956010