1. 基本调试命令
1.1启动和附加
windbg -pn : 按进程名称启动调试。
windbg -p : 按进程 ID 启动调试。
1.2 控制执行
g: 继续执行程序。
p: 单步执行,不进入函数。
t: 单步执行,进入函数。
bp <Address>:
在指定地址设置断点。
bl: 列出所有断点。
bc : 清除指定断点。
1.3 查看内存和寄存器
r: 显示寄存器内容。
r <Register>
: 显示指定寄存器内容。
dd <Address>
: 以双字(DWORD)格式显示内存内容。
dc <Address>
: 以字符格式显示内存内容。
dp <Address>
: 以指针格式显示内存内容。
db <Address>
: 以字节格式显示内存内容。
查看寄存器内容示例:
0:000> r
rax=0000000000000001 rbx=0000000000000002 rcx=0000000000000003
rdx=0000000000000004 rsi=0000000000000005 rdi=0000000000000006
rip=00007ff6a0b10e5a rsp=00000000005ff8f8 rbp=00000000005ff900
r8=0000000000000007 r9=0000000000000008 r10=0000000000000009
r11=000000000000000a r12=000000000000000b r13=000000000000000c
r14=000000000000000d r15=000000000000000e
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
查看特定寄存器内容:
0:000> r rax
rax=0000000000000001
1.4 查看堆栈
k: 显示当前堆栈调用。
kb: 显示带参数的堆栈调用。
kp: 显示带参数和调用约定的堆栈调用。
模块和符号
lm: 列出加载的模块。
lmv: 列出加载的模块及其详细信息。
.reload: 重新加载符号。
x <Module>!<Symbol>
: 查找符号。
5. 查看变量
dv: 显示局部变量。
dt <Type>
: 显示类型信息。
dps <Address>
: 显示指针和符号。
输入/输出
!handle: 列出当前进程的句柄。
!process: 列出当前系统的进程。
!thread: 列出当前进程的线程。
!heap: 显示堆信息。
2. 高级调试命令
2.1 调试扩展
!analyze -v: 分析崩溃转储文件。
!locks: 显示系统中的锁。
!vm: 显示虚拟内存信息。
!poolused: 显示池使用情况。
2.2 脚本和自动化
.scriptload : 加载 JavaScript 脚本。
.scriptrun : 运行 JavaScript 脚本。
.foreach (variable {expression}) {commands}: 在表达式结果上循环执行命令。
2.3 调试器命令
.logopen : 打开日志文件。
.logclose: 关闭日志文件。
.cls: 清除调试器窗口。
2.4 内核调试
!process 0 0: 列出所有进程。
!thread <ThreadAddress>
: 显示线程信息。
!drvobj <DriverName>1
: 显示驱动程序对象信息。
常用快捷键
F5: 继续执行程序(相当于 g)。
F10: 单步执行,不进入函数(相当于 p)。
F11: 单步执行,进入函数(相当于 t)。
Ctrl+Break: 中断程序执行。
这些命令只是 WinDbg 功能的冰山一角。WinDbg 提供了大量的命令和扩展,用于各种调试需求。建议结合具体的调试场景,查阅 WinDbg 官方文档和帮助文件,以充分利用其强大功能。
(未完待续)