无论在Windows平台上进行开发还是逆向工程,无论是调试用户态的应用程序还是内核态的驱动,Windbg都是不可或缺的神器。本文旨在介绍Windbg的几类入门命令,掌握它们将帮助你应对大多数常见的调试场景。
Windbg的入门命令可以归纳为几个主要类别:基础控制、查看代码/堆栈、查看内存/变量、符号与模块、断点设置、进程/线程操作以及异常分析。以下列表汇总了初学者最常用的命令,助你快速上手。
一、基础控制命令
| 命令 |
说明 |
g |
继续运行程序(Go) |
p |
单步执行(Step Over,不进入函数) |
t |
单步进入(Step Into,进入函数) |
gu |
执行到函数返回(Step Out) |
q |
退出 WinDbg |
.cls |
清屏,当你 debug 不出来的时候,不妨清空一下杂乱的输出,重新开始思考。 |
下面是这几个命令的演示截图,展示了在函数 MyAPCFunction 内部进行单步(p)和跟踪进入(t)的过程。

二、查看代码与堆栈
| 命令 |
说明 |
k |
显示当前线程的调用堆栈(Call Stack) |
kb |
显示堆栈 + 前三个参数(x86 常用) |
kp |
显示堆栈 + 完整参数(类型+值) |
u |
反汇编当前指令附近的代码 |
u 地址 |
反汇编指定地址的代码 |
uf 函数名 |
反汇编整个函数 |
u 系列命令(u, uf, ub)在通过反汇编进行逆向分析时使用非常频繁。

三、查看内存与变量
| 命令 |
说明 |
db 地址 |
以字节(Byte)格式显示内存 |
dw 地址 |
以字(Word,2字节)格式显示内存 |
dd 地址 |
以双字(DWord,4字节)格式显示内存 |
dq 地址 |
以四字(QWord,8字节)格式显示内存 |
da 地址 |
显示 ASCII 字符串 |
du 地址 |
显示 Unicode 字符串 |
dt 类型名 地址 |
按结构体/类型显示内存(如 dt nt!_EPROCESS 0x...) |
dv |
显示局部变量(需符号支持) |
r |
显示寄存器值(如 r eax、r rip) |
下面以程序 APCTest.exe 的 main 函数为例演示上述命令。在 main 函数入口处设置断点,程序中断后:
- 使用
dv 显示 main 函数的参数和局部变量值。
- 使用
dq 查看第二个参数 argv 数组的内容(存放命令行参数)。
- 使用
da 显示 argv[0](即可执行程序路径字符串)。
- 使用
r 显示寄存器 rcx 和 rdx 的值。根据 x64 调用约定,rcx 存放第一个参数,rdx 存放第二个参数,其值与 dv 显示的一致。

四、符号与模块
| 命令 |
说明 |
.reload |
重新加载符号(修改符号路径后常用) |
lm |
列出已加载的模块(DLL/EXE) |
lm v |
显示模块详细信息 |
x 模块名!符号 |
查找符号地址(如 x kernel32!CreateFile*) |
.sympath |
显示符号路径 |
.sympath+ 路径 |
添加符号路径 |
下面是加载模块和查看符号的演示。

x 命令除了查找符号,在不加参数时会列出当前函数的参数和局部变量。

五、断点设置
| 命令 |
说明 |
bp 地址/函数名 |
设置软件断点(如 bp kernel32!CreateFileW) |
bl |
列出所有断点 |
bc 编号 |
清除断点(如 bc 0) |
bd 编号 |
禁用断点 |
be 编号 |
启用断点 |
ba 访问类型 地址 |
设置硬件断点(如 ba w4 0x401000 写4字节时中断) |
下面是设置软件断点的相关演示。

ba (Break on Access) 命令用于设置硬件(内存)断点,可监控特定变量或内存地址何时被访问或修改。下图演示了如何使用 ba r4 监控变量 dwThreadId 被读取的情况。

六、进程与线程
| 命令 |
说明 |
~ |
列出所有线程 |
~线程号 s |
切换到指定线程(如 ~2 s) |
!peb |
显示当前进程的 PEB(进程环境块) |
!teb |
显示当前线程的 TEB(线程环境块) |
下列演示了列出线程、切换到线程2的操作。切换后再次列出线程,可见线程2前多了一个点 .,表示当前调试上下文已切换到该线程。

使用 !peb 命令可以显示进程环境块的详细信息。

七、异常与崩溃分析
| 命令 |
说明 |
.exr -1 |
显示最近一次异常记录 |
.ecxr |
切换到异常上下文(用于分析崩溃点) |
!analyze -v |
自动分析崩溃原因(需符号支持) |
当程序异常崩溃时,可以使用 .exr 命令查看异常信息。下图显示了一个因访问空指针(NULL)导致的访问违规异常。

!analyze -v 是一个强大的命令,能提供详细的崩溃原因分析,帮助开发者快速定位大部分崩溃问题。

总结
以上介绍的七类命令覆盖了Windbg入门所需的核心功能,熟练运用它们足以应对日常开发与调试中的多数情况。要想在Windows平台上深入调试或逆向,这些命令是必须掌握的基石。希望这篇实用教程能帮助你更高效地使用Windbg。更多技术干货和深度讨论,欢迎访问云栈社区。
Have Fun!
|