开始

重启调试目标

.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,并且通过这个工具下载速度也会更快一些,具体方法如下:

  1. 下载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

  2. 下载某个已运行进程所有相关模块的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

  3. 下载某个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

  4. 下载整个目录下(例如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