Windbg调试速查手册
Windbg 是 Microsoft 公司推出的免费的、带 GUI 的调试器,支持 Source 和 Assembly 两种模式的调试。
Windbg 不仅可以调试应用程序,还可以进行系统内核调试,Windbg 支持的平台包括 X86、IA64、AMD64。
符号文件
在菜单项 File -> Symbol File Path 中设置符合文件搜索路径,如:
1 | D:\symbol_path;SRV*D:\symbolslocal*http://msdl.microsoft.com/download/symbols |
意思是先从D:\symbol_path中找符号文件;如果没找到,就去服务器中下载并保存到D:\symbolslocal目录中。
可以使用.sympath+ 命令来添加其他目录到搜索路径中,如.sympath+ D:\other_symbol_dir。 然后使用.reload来根据新的路径重新搜索并加载符号文件。
可执行文件路径
在菜单项 File -> Image File Path 中设置,此项是在加载 dump 时,设置可执行文件 exe、dll 的路径的。
源代码目录
在菜单项 File -> Source File Path 中设置源代码目录。如果当前指令指针在源代码范围内,就会自动跳出源文件窗口。源文件窗口中的操作和 vs 类似。如果没有跳出,可以单机菜单项 Open Source File 手动选择源文件
命令行启动
可以通过对 windbg 加入启动参数的方式来指定符号文件路径和源码路径等等。
1 | start "" "%~dp0/Debuggers_x86/windbg.exe" -Q -y "D:\symbolslocal*http://msdl.microsoft.com/download/symbols" -srcpath "srv*C:\CodeCache" |
内核调试常用命令行:
1 | "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=50010,key=jspq4rggw9ge.3ps1mwc6ye9fe.vm89wpoz72jb.1ldc14kg2ex39 -y "D:\symbolslocal*http://msdl.microsoft.com/download/symbols" |
工作空间
Windbg 会保存每个你调试的工程的信息,这些信息包括调试项目的属性、参数、会话状态、调试器设置、及图形界面信息,类似于 ide 的项目文件。
每个调试的工作空间信息默认保存在HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces中,在这个键下一般有 4 个子键 User、Kernel、Dump、Explicit, 他们分别保存用户态调试,内核态调试、转储文件调试、以及手动保存(Save Workspace As)的工作空间信息。
窗口界面介绍
| 名称 | 热键 | 用途 |
|---|---|---|
| Command | Atl+1 | 输入命令、显示命令结果和调试信息输出 |
| Watch | Atl+2 | 观察指令全局变量、局部变量和寄存器的信息 |
| Locals | Atl+3 | 自动显示当前函数的所有局部变量 |
| Registers | Atl+4 | 观察和修改寄存器的值 |
| Memory | Atl+5 | 观察和修改内存数据 |
| Call Stack | Atl+6 | 栈中记录的函数调用序列 |
| Disassembly | Atl+7 | 反汇编 |
| Scratch Pad | Atl+8 | 白板,可以用来做调试笔记等 |
| Processes and Threads | Atl+9 | 显示所有调试目标的列表,包括进程和线程等 |
| Command Browser | Ctrl+N | 执行和浏览命令 |
常用调试方法
IFEO
在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options”下新建一个以待调试程序名命名的子项,然后在这个子项中新建一个名为Debugger的REG_SZ类型的值,将值设置为 windbg 的全路径,比如:C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe。
这样,再运行待调试的程序时,操作系统就会先启动 windbg,并把要调试程序的路径传递给他。
内核远程调试
首先,在被调试机器(如虚拟机)上使用如下命令配置开启调试模式:
1 | bcdedit /debug on |
其中,hostip 为运行 Windbg 的调试机器的 IP,需要确保在被调试机器上可以 ping 通该 IP。在运行完第二条命令之后,会生成一串 Key,记住该 Key。
然后,在被调试机器上使用如下命令行参数运行 Windbg(其中 port 需要与上面命令保持一直,key 为上面命令生成的 Key):
1 | "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe" -k net:port=50010,key=jspq4rggw9ge.3ps1mwc6ye9fe.vm89wpoz72jb.1ldc14kg2ex39 -y "SRV*D:\symbolslocal*http://msdl.microsoft.com/download/symbols" |
最后,保持 Windbg 开启,并重启被调试机器(如虚拟机),此时被调试机器会自动连接上 Windbg。
常用命令
windbg 命令分为标准命令,元命令和扩展命令。
以.开头的元命令,可以提供标准命令没有提供的功能,也内建在调试引擎中。
以!开头的扩展命令,用于扩展某一方面的调试功能,实现在动态加载的扩展模块中。
Windbg 中默认数字为十六进制,可以使用0n前缀表示十进制。
1 | tab键 自动完成命令 |