开始
重启调试目标
.restart
远程调试
windbg -server tcp:port=9999 test.exe
调试指定 exe,并开启调试服务,允许 tcp 端口 9999 的连接。
windbg -remote tcp:server=192.168.78.133,port=9999
连接远程调试器。
符号
x user32!Get*
查找指定符号
断点
bp wWinMain
新建断点
bl
列出所有断点
bd 0
禁用一个断点
bc *
清除所有断点
变量查看
dv
查看局部变量
dt LibGLESv2exports @eax
打印结构体信息
dt -r info_str
递归显示结构
dt -d info_str
递过显示结构,并打印块信息
!stl info_str
对于 STL 结构体,可以用扩展方便查看
命令列表
-
$ 执行脚本
- $< 允许文件名分号
- $>< 合并行执行
- $$< 不允许文件名分号
- $$>< 合并行执行
- $$>a< [argn..] 允许参数
-
${} 别名解释器
- ${/v:name} 强制不解释别名,放回原始字符
-
~ 线程信息
- ~2s 切换线程
- ~#s 切换默认线程
-
as/aS Alias Set 设置别名,as执行到换行,aS执行到分号
- as [alias] [expr]
- /mu 取地址的Unicode字符串
- /ma 取地址的ASCII字符串
-
ad Alias Delete
-
al Aliases List
-
bp 设置断点
-
bm 匹配断点,允许模式匹配字符
-
ba 内存访问断点
-
bl 列出断点
-
bc break clear
-
be break enable
-
bd break disable
-
d 内存信息
- dq 64位显示
- dd 32位显示
- dt 指定结构体
- dv Display Local Variables
-
dds 内存符号
-
g Go
- gc 条件断点的g
-
e 修改内存
-
k 堆栈信息
- kp/kP 显示参数
- kn 显示frame num
- kb 显示参数
-
lm 列出已加载模块
-
ln 列出最近符号
-
p Step
- pa Step to Address
- pc Step to Call
- pct Step to Call or Return
- ph Step to Next Branching Instruction
- pt Step to Next Return
-
r 寄存器信息
-
s 内存搜索
-
t 单步跟踪
- ta trace to address
- tb trace to next branch分支指令
- tc trace to next call
- tct trace to next call or return
- tt trace to next return
-
u 反汇编内存
-
wt Trace and Watch Data
-
x 符号信息
- x 当前frame的局部变量
-
vertarget 目标计算机操作系统信息
-
version 显示Debugger版本
-
lm 显示模块信息
-
.cls 清屏
-
.dvalloc 分配内存
-
.frame 切换本地上下文(栈帧)(查看局部变量)
-
.reload 重新加载符号
-
.restart 重启目标
-
.writemem 内存dump文件
-
!attach 附加调试器
-
!address 内存信息
-
!handle 句柄信息
-
!gle 显示Last Error
-
!peb 显示process environment block结构体信息
-
!teb 线程environment block
-
!tlist 列出进程
Control Flow Tokens
- .if
- .foreach
- .block
- .printf
- .catch
- .break/.continue/.leave
- $$ 行内注释
- * 行末注释
宏
- poi() 取指针
SOS
- !analyze -v
- !threads 显示线程
- !dumpheap 显示托管堆
- !clrstack 显示调用栈
- !dumpobj 显示对象内容
- !dumparray 显示数组
- !syncblk 显示同步块
- !runaway 显示线程cpu时间
- !gcroot 跟踪对象内存引用
- !pe 打印异常
环境信息
- !peb 进程信息
模块信息
lm [Option] [a Address] [m Pattern | M Pattern]
显示加载的模块。
符号状态 (Symbol Status Abbreviations):
- deferred 延迟加载
- # 符号不匹配
- T 时间戳错误
参数:
- v 显示详细信息
- e 只显示问题符号
.reload [Option] [Module[=Address[,Size[,Timestamp]]]]
重新加载模块和符号。
- /d 重新加载所有模块。
- /f 强制立即加载符号。
- /u 卸载指定模块和它的符号。
- /v 显示详细信息
- /i 允许不匹配的符号加载
.sympath
.symfix
设置符号路径,支持环境变量 _NT_SYMBOL_PATH
.exepath[+] [Directory [; ...]]
设置可执行镜像路径,支持环境变量 _NT_EXECUTABLE_IMAGE_PATH
!sym [noisy | quiet]
符号加载信息
符号信息
SRV*F:\symbols\*http://msdl.microsoft.com/download/symbols
符号服务器
- !sym [noisy|quiet]
- noisy 显示符号加载详细信息
ln
列出最近符号。
x
符号信息。
内存控制
-
d
- q 8 字节
- d 4 字节
- a Ascii
- u Unicode
-
dt 显示结构体信息
!address
内存页信息
dt
可以列出结构体和打印结构体信息
线程控制
0:000 > ~ $$ 列出所有线程
0:000 > ~[n]s $$ 切换线程
上下文
.ecxr
切换上下文至异常时。
栈信息
k
- b 显示栈帧和三个参数
0:000> .kframes
栈回溯深度
堆信息
- !head 查看堆信息
系统信息
0:000> vertarget
0:000> !cpuid
奔溃机器的系统信息。
扩展
.load [DllName]
加载扩展 DLL
断点
- b[p|m]
- c clear
制定位置中断执行。
bp USER32!InternalCallWinProc ".if((dwo(esp+8)==00020606&dwo(esp+c)==201)|(dwo(esp+8)==0006057E&dwo(esp+c)==111)){.echo LB;}.else{gc;}"
消息断点,esp+8:HWND esp+c:message。
进程控制
附加进程
-
.attach [-premote RemoteOptions] AttachOptions PID
-
.detach
-
.restart
重新启动进程
- p
步过
- t
步入
辅助命令
-
!cs
- 查看临界区信息
-
!handle
- 查看内核对象信息
外部程序
symchk.exe
符号下载工具
- symchk [/r] [/q] [Input options] <Filename> [/s
] [options] - /r 递归目录下所有文件
- /q 关闭输出
- [Input options]
- /id <DumpFile> 下载 dump file 中所有符号
- /ie <ExeName> 下载运行中进程符号
- /ip <ProcessId> 下载运行中进程符号
- [options]
- /v 显示详细信息
内核调试
- !pcr 显示当前处理器 PCR 信息 *
64位
- .load wow64exts 加载64位扩展
- !sw 转换64位dump到32位
虚函数
x ole32!OpaqueDataInfo::vftable
找到虚表地址
dds [address]
打印虚表
生成 DUMP 文件
.dump
命令生成 DUMP 文件
生成 minidump。
.dump /m "C:\Dumps\minidump.dmp"
.dump /ma "C:\Dumps\minidump_plus.dmp"
生成 fulldump。
.dump /f "C:\Dumps\fulldump.dmp"
手工下载windows symbols的方法
如果不想等到调试时才下载,也可用通过windbg自带的symchk.exe工具下载windows系统的symbols,或者某个dmp文件所有相关模块的symbols,并且通过这个工具下载速度也会更快一些,具体方法如下:
-
下载dmp文件所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。 “C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe” /id c:\MyApplication.dmp /s SRV*\symbols_server\WinSymbols*http://msdl.microsoft.com/download/symbols
-
下载某个已运行进程所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。 “C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe” /ie qq.exe /s SRV*\symbols_server\WinSymbols*http://msdl.microsoft.com/download/symbols
-
下载某个exe/dll文件对应的symbols,例如user32.dll,输入命令行: “C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe” c:\windows\system32\user32.dll /s SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
-
下载整个目录下(例如system32)所有模块的symbols: “C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe” /r c:\windows\system32\ /s SRV*c:\symbols*http://msdl.microsoft.com/download/symbols