Windbg 是 Microsoft 公司推出的免费的、带 GUI 的调试器,支持 Source 和 Assembly 两种模式的调试。
Windbg 不仅可以调试应用程序,还可以进行系统内核调试,Windbg 支持的平台包括 X86、IA64、AMD64。
一、安装
从下面的链接或其他链接下载安装:
Download Debugging tools for Windows
二、配置
常用的配置包含符号文件搜索路径、可执行文件搜索路径、源码文件搜索路径配置。
2.1 符号文件搜索路径配置
在菜单项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
来根据新的路径重新搜索并加载符号文件。
2.2 可执行文件路径
在菜单项File -> Image File Path中设置,此项是在加载 dump 时,设置可执行文件 exe、dll 的路径的。
2.3 源代码目录配置
在菜单项File -> Source File Path中设置源代码目录。如果当前指令指针在源代码范围内,就会自动跳出源文件窗口。源文件窗口中的操作和 vs 类似。如果没有跳出,可以单机菜单项 Open Source File 手动选择源文件
2.4 设置启动产生
可以通过对 windbg 加入启动参数的方式来指定符号文件路径和源码路径等等。
1 | start "" "%~dp0/Debuggers_x86/windbg.exe" -Q -y "D:\symbolslocal*http://msdl.microsoft.com/download/symbols" -srcpath "srv*C:\CodeCache" |
三、开始调试
可以通过菜单项File -> Open Executable
来加载本地的一个 exe 来进行调试,也可以通过菜单项File -> Attache to a Process
来加载一个已经运行的 exe 来进行调试。
具体调试指令可以参考:Help -> Contents -> Debugging Tools for Windows -> Debuggers -> Debugger Reference
四、工作空间
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 | 执行和浏览命令 |
六、常用命令
windbg 命令分为标准命令
,元命令
和扩展命令
。
以.
开头的元命令提供标准命令没有提供的功能,也内建在调试引擎中。
以!
开头的扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中。
1 | tab键 自动完成命令 |
七、常用调试方法
7.1、附加进程调试
使用 File 菜单中的 Attach to a Process 选项来选择要附加调试的进程.
7.2、启动新进程并调试
有三种方式可以启动新的进程,并自动附加调试。
方式一:
使用菜单File-> Open Executable
选项来选择要启动调试的进程。
方式二:
启动 windbg 时将待调试的程序的文件路径作为参数传递给 windbg。
方式三:
新建注册表项。
在“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,并把要调试程序的路径传递给他。
7.3、调试转储文件
使用 File 菜单中的 Open Crash Dump 选项来加载 dump 文件。
7.4、远程调试
服务器(被调试程序的机器)和客户端(发出远程请求的机器)都应该安装版本相同的 windbg,应该有网络连接或者串行口连接。
以 tcp 端口方式:
以命令行的方式启动服务器中的 windbg,如:windbg.exe -server tcp:port=5005
以命令行的方式启动客户端中的 windbg,如:windbg.exe -remote tcp:port=5005,server=192.168.1.180以管道方式:
以命令行的方式启动服务器中的 windbg,如:windbg -server npipe:pipe=advdbg (adbdbg 为命名管道名称)。
在客户端中以命令行的方式启动 windbg,如:windbg -remote npipe:server=REMOTEHOSTNAME,pipe=advdbg (REMOTEHOSTNAME 为远程主机名,dbvdbg 为远程主机创建的命名管道名,也可以选择 File 菜单中的 Connect to Remote Session,在弹出来的编辑框中输入远程参数 npipe:server=REMOTEHOSTNAME,pipe=advdbg)
成功连接后,命令行信息区会显示类似如下信息:
1 | ...(npipe advdbg) connected at Thu Jul 11 14:22:02 2017 |
之后可以在客户端或者服务器的 windbg 中执行各种调试命令,执行结果会同时显示在两个调试器中。
其它的远程调试方案,可以参考:
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/remode-debugging-using-windbg