WinDbg用法总结:命令分类与常用命令详解

WinDbg用法总结:命令分类与常用命令详解

一、WinDbg命令类型概述

WinDbg的命令主要分为三大类:

  • 内置命令:基本调试命令
  • 元命令(以.开头):控制调试器行为
  • 扩展命令(以!开头):由扩展模块提供的高级功能

二、按功能分类的常用命令

1. 执行控制命令

命令 用法 说明
g g 继续执行程序
p p 单步执行(跳过函数调用)
t t 单步执行(进入函数调用)
gu gu 执行到当前函数返回
Ctrl+Break - 中断程序执行

2. 断点管理命令

命令 用法 说明
bp bp [address/module!function] 在指定地址设置断点
bu bu [address] 设置未解析断点(符号加载后才生效)
bl bl 列出所有断点
bc bc [id] 清除指定断点
bd bd [id] 禁用指定断点
be be [id] 启用指定断点
bm bm [pattern] 使用通配符设置多个断点

3. 寄存器操作命令

命令 用法 说明
r r 显示所有寄存器
r r eax=0x1234 修改指定寄存器值
r? r? 显示浮点寄存器

4. 内存操作命令

命令 用法 说明
db db [address] L[length] 以字节格式显示内存
dd dd [address] L[length] 以双字格式显示内存
dq dq [address] L[length] 以四字格式显示内存
du du [address] 显示Unicode字符串
da da [address] 显示ANSI字符串
ed ed [address] [value] 编辑双字内存
lm lm 列出所有模块

WinDbg提供了多种内存命令用于查看和分析内存内容,这对调试内存相关问题非常关键。

5. 堆栈分析命令

命令 用法 说明
k k 显示完整调用堆栈
kb kb 显示调用堆栈及前三个参数
kp kp 显示调用堆栈及所有参数
kc kc 显示紧凑格式的调用堆栈
kn kn 显示调用堆栈及帧号

6. 符号管理命令

命令 用法 说明
.sympath .sympath [path] 设置符号路径
.reload .reload [/f] 重新加载符号,/f强制加载
ld ld [module] 加载指定模块的符号

要强制实际加载符号,可以使用/f选项,或使用ld(Load Symbols)命令。

7. 扩展命令(!开头)

通用扩展命令

命令 用法 说明
!analyze !analyze -v 自动分析崩溃原因,是处理dump文件最常用的命令
!process !process 0 0 列出所有进程信息
!thread !thread 显示当前线程详细信息
!heap !heap -s 查看所有堆的摘要信息

SOS扩展(.NET调试)

命令 用法 说明
!dumpheap !dumpheap -stat 统计堆中对象
!dumpheap !dumpheap -type [type] dump特定类型的所有对象
!dumpobj !dumpobj [address] 显示对象详细信息
!clrstack !clrstack 显示.NET调用堆栈
!threads !threads 显示所有.NET线程
!eeheap !eeheap -gc 查看GC堆信息

WinDbg提供了SOS扩展用于分析.NET内存,包括dump所有对象、获取内存统计信息、查看堆摘要等功能。

8. 元命令(.开头)

命令 用法 说明
.help .help 显示内置命令帮助
.logopen .logopen [filename] 开始记录调试会话到日志文件
.logclose .logclose 关闭日志文件
.effmach .effmach [machine] 设置有效机器类型
.excr .excr 显示异常记录

9. 进程和线程管理

命令 用法 说明
| | 显示所有调试会话和进程
~ ~ 显示所有线程
~n ~0s 切换到指定线程(0s表示第一个线程)
~* ~* e !clrstack 在所有线程上执行命令

三、常用场景命令组合

1. 分析崩溃转储

.symfix                  ; 自动设置符号路径
.reload /f               ; 强制重新加载符号
!analyze -v              ; 自动分析崩溃原因
k                        ; 查看调用堆栈
r                        ; 查看寄存器状态
dv                       ; 查看局部变量

2. .NET内存泄漏分析

.loadby sos clr          ; 加载SOS扩展
!dumpheap -stat          ; 统计堆中对象
!dumpheap -type [type]   ; 分析特定类型对象
!gcroot [object]         ; 查找对象根引用
!finalizequeue           ; 查看待 finalize 对象

四、实用技巧

  1. 使用?进行表达式求值:? 0n10 + 0x10
  2. 脚本中带空格的路径或参数需要加引号,参数间以空格分开,分号是命令的分割符
  3. 使用windbgx -I命令注册WinDbg作为自动系统调试器,应用程序崩溃时会自动启动
  4. 使用.logopen记录调试过程以便后续分析
  5. 使用!ext.help查看扩展命令帮助
posted @ 2025-08-01 11:22  tornado2014  阅读(400)  评论(0)    收藏  举报