WinDbg 命令三部曲:(一)WinDbg 命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。
系列博文
- 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
- 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
- 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》
导航目录
调试准备
为了测试 WinDbg 中使用 SOS 扩展命令,我创建了应用程序 "MemoryLeakApp.exe",Visual Studio 程序选择为 64 位环境编译。


"MemoryLeakApp.exe" 启动运行后可能占用内存600M。


此时,选择使用 64 位 WinDbg 来调试程序。我们先通过 Attach Process 方式来调试。



当然,如果我们使用了 32 位的 WinDbg 去 Attach 进程,会直接报错。

WinDbg 常用命令手册
内置帮助命令
| 命令 | 描述 |
| ? |
? 显示常规命令 ? /D 通过 DML(Debugging Markup Language) 方式显示常规命令 |
| .help |
.help 显示 . 系列命令 .help /D 通过 DML 方式显示 . 系列命令 .help /D a* 通过 DML 方式显示所有以 'a' 字母开头的 . 系列命令
|
| .chain |
.chain 列出所有已加载的调试器扩展 .chain /D 通过 DML 方式列出所有已加载的调试器扩展
|
| .extmatch |
.extmatch /e ExtDLL FunctionFilter 显示调试器扩展的所有导出函数 .extmatch /D /e ExtDLL FunctionFilter 通过 DML 方式显示调试器扩展所有导出函数 .extmatch /D /e uext * 显示 uext 扩展中的所有导出函数
|
| .hh |
.hh 打开 WinDbg 的帮助文件 .hh Text 打开 WinDbg 的帮助文件,并自动搜索 Text 的内容 .hh dt 在 WinDbg 帮助文件中搜索 dt 命令 |
调试会话命令
| 命令 | 描述 |
| .attach |
.attach PID 附加到指定ID的进程 |
| .detach |
.detach 结束调试会话,被调试进程仍可继续运行
|
| q |
q 结束调试会话,同时终止被调试进程的进行 qq 结束调试会话,同时终止被调试进程的进行 |
| .restart |
.restart 重启被调试应用 |
一般信息命令
| 命令 | 描述 |
| version |
显示调试器版本信息和已加载的调试器扩展
|
| vercommand |
显示调试器启动文件的路径
|
| vertarget |
显示目标机器的版本
|
| CTRL+ALT+V |
打开或关闭 Verbose 模式开关,某些命令在此模式下可以给出更多详细信息 |
| .formats |
.formats Expression 显示数字的各种格式信息 .formats 5
|
| .cls |
清理屏幕 |
| .last event | 显示最新的异常信息或事件信息 |
| .effmach |
.effmach 显示有效作用的机器信息 |
| .time |
显示系统记录的各种时间
|
| .echo |
.echo String 输出字符串 .echo "String" .echo "Hello World"
|
符号加载命令
| 命令 | 描述 |
| ld |
ld ModuleName 加载指定模块的符号 ld * 加载所有模块的符号
|
| !sym |
!sym 获取符号加载状态 !sym noisy 让调试器显示符号搜索详细信息 !sym quiet 默认项,不显示符号搜索信息
|
| .sympath |
.sympath 显示和设置符号搜索路径 .sympath+ 增加符号搜索路径 .sympath+ C:\Symbols |
| .symopt |
.symopt 显示当前符号可选项 .symopt+ Flags 添加符号可选项 .symopt- Flags 移除符号可选项 |
| .symfix |
.symfix 设置符号库路径 .sym+ DownstreamStore 添加符号库路径 |
| x |
x [Options] Module!Symbol 模式匹配符号信息 x /t .. 根据数据类型匹配 x /v .. 显示详细信息 x /a .. 按照地址排序 x /n .. 按照名称排序 x /z .. 按照大小排序 x *! 列出所有模块
x ntdll!* 列出 ntdll 模块
x /t /v ntdll!* 列出 ntdll 模块数据类型和符号类型
|
| .reload |
.reload 重新加载符号信息 .reload [/f | /v] /f 强制立即加载符号 /v 显示详细信息 .reload [/f | /v] Module Module 为指定模块加载符号信息 .reload /f @"ntdll.dll" .reload /f @"C:\WINNT\System32\verifier.dll" |
模块加载命令
| 命令 | 描述 |
| lm |
lm[ v | l | k | u | f ] [m Pattern] 显示已加载的模块 lm 显示所有加载和未加载的模块信息
lmv 显示已加载模块的详细信息 lml 同时显示加载的符号信息 lmk 显示内核模块信息 lmu 显示用户模块信息 lmf 显示镜像路径 lmm 匹配模块名称 lmD 使用 DML 方式显示
lmv m kernel32 显示 kernel32 模块详细信息
|
| !dlls |
!dlls 列出所有加载的模块和加载数量 !dlls -i 根据初始化顺序 !dlls -l 根据加载顺序(默认项) !dlls -m 根据内存顺序 !dlls -v 显示更多详细信息 !dlls -c ModuleAddr 仅显示 ModuleAddr 地址的模块信息 !dlls -? 显示帮助 !dlls -v -c kernel32 显示 kernel32.dll 的信息 |
| !lmi |
!lmi Module 显示模块的详细信息,包括加载符号信息 !lmi kernel32 显示 kernel32.dll 模块的信息
|
异常分析命令
| 命令 | 描述 |
| !analyze |
!analyze -v 显示当前异常的详细信息 !analyze -hang 诊断线程调用栈上是否有任何线程阻塞了其他线程 !analyze -f 查看异常分析信息,尽管调试器并未诊断出异常
|
进程信息命令
| 命令 | 描述 |
| !dml_proc |
通过 DML 方式显示当前进程的信息
|
| .tlist |
显示当前所有进程
|
线程信息命令
| 命令 | 描述 |
| ~ |
~ 显示线程信息
~* [Command] 所有线程
~. [Command] 当前线程
~# [Command] 引发当前事件或异常的线程 ~Number [Command] 显示指定序号的线程
~~[TID] [Command] 显示指定线程ID的线程 ~Ns 切换到线程 N ~* k 显示所有线程的调用栈 ~2 f 冻结2号线程 ~# f 冻结引发异常的线程 ~3 u 解除对3号线程的冻结 ~2 k 显示2号线程的调用栈
|
| ~e |
~* e CommandString 在所有线程上执行命令 ~. e CommandString 在当前线程上执行命令 ~# e CommandString 在引发异常的线程上执行命令 ~Number e CommandString 在指定序号的线程上执行命令 ~2e r; k; kd 相当于 ~2r; ~2k; ~2kd ~*e !gle 显示所有线程的最后一个错误信息
|
| ~f |
~Thread f 冻结线程 |
| ~u |
~Thread u 解除冻结线程 |
| ~n |
~Thread n 挂起线程,增加线程挂起数量 |
| ~m |
~Thread m 恢复线程,减少线程挂起数量 |
| !teb |
显示线程环境信息
|
| !tls |
!tls -1 -1 为显示当前线程所有的 slot 信息 !tls SlotIdx 显示指定的 slot 信息 !tls [-1 | SlotIdx] TebAddr
|
| .ttime |
显示线程时间信息
|
| !runaway |
[Flags: 0 | 1 | 2] 显示每个线程消耗的时间,用于快速的查找 CPU 时间消耗最多的线程 0 用户态时间 1 内核态时间 2 自线程创建起的时间间隔
|
| !gle |
!gle 显示当前线程的最后错误 !gle -all 显示所有线程的最后错误 |
| !error |
!error ErrValue 解析错误信息 !error ErrValue 1 将错误值作为 NTSTATUS 代码 |
堆栈信息命令
| 命令 | 描述 |
| k |
k [n] [f] [L] [#Frames] 显示调用栈信息 kn 调用栈包含帧号 kf 临近帧的距离 kL 忽略源代码 kb ... 最开始的 3 参数 kp ... 所有的参数,包括参数类型、名称和值 kP ... 所有的参数 kv ... FPO信息 kb 5 显示最开始的 5 个帧
|
| kd |
kd [WordCnt] 显示原始栈数据和可能的符号信息 |
| kM |
使用 DML 格式显示堆栈信息 |
| .kframes |
设置栈长度,默认是20(0x14) |
| .frame |
.frame 显示当前帧 .frame # 指定帧号 .frame /r [#] 显示寄存器信息 .frame 2 显示帧号 2 的信息 .frame /r 0d 显示 0 帧中寄存器信息
|
| !uniqstack |
!uniqstack 显示所有线程的栈信息 !uniqstack [b|v|p] [n] b=前3个参数;v=FPO信息;p=所有参数;n=帧号 !uniqstack -? 显示帮助
|
| !findstack |
!findstack Symbol 找到包含符号或模块的栈 !findstack Symbol [0|1|2] 0=仅显示线程ID;1=线程ID和帧;2=全部的线程栈; !findstack -? 显示帮助 !findstack clr 2 显示包含 clr 的所有栈的信息
|
扩展帮助命令
| 命令 | 描述 |
|
!Ext.help |
常规扩展命令帮助
|
|
!Exts.help |
![]() |
|
!Uext.help |
用户态模式扩展命令帮助
|
|
!Ntsdexts.help |
用户态扩展命令帮助(OS相关)
|
|
!logexts.help |
日志相关扩展
|
|
!clr10\sos.help |
调试托管代码 |
|
!wow64exts.help |
wow64调试器扩展 |
|
!Wdfkd.help |
内核态驱动框架扩展 |
|
!Gdikdx.help |
图形驱动扩展 |
|
!NAME.help |
显示任何 NAME 名称的扩展命令的帮助 |
日志扩展命令
| 命令 | 描述 |
|
!logexts.help |
显示所有日志扩展命令 |
|
!loge |
!loge [dir] 打开日志功能,可选配置输出目录 |
|
!logi |
初始化日志功能 |
|
!logd |
关闭日志功能 |
|
!logo |
!logo 列出日志配置信息 !logo [e|d] [d|t|v] 打开或关闭日志,d=调试器,t=文本文件,v=详细信息 |
|
!logc |
!logc 列出所有日志类型 !logc p # 列出 # 中的日志类型 !logc [e|d] * 打开或关闭所有日志类型 !logc [e|d] # [#] [#] 打开或关闭日志类型 # |
|
!logb |
!logb p 打印缓冲区信息至调试器 !logb f 刷新缓冲区内容之日志文件 |
|
!logm |
!logm 显示模块的包含或屏蔽列表 !logm [i|x] [DLL] [DLL] 指定模块的包含或屏蔽列表 |
参考资料
- Common WinDbg Commands
- WinDbg cheat sheet
- Debugger Commands
- Command Tokens
- Meta-Commands
- Command-Line Options
- 那些年黑了你的微软BUG
- WinDbg - Kernel-Mode Extension Commands
- WinDbg - General Extension Commands
- WinDbg - Meta-Commands
- WinDbg - Commands
- WinDbg - Command Tokens
- Debugger Commands from MSDN
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。
系列博文
- 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
- 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
- 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》
WinDbg 命令三部曲:(一)WinDbg 命令手册的更多相关文章
- WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- WinDbg命令三部曲
WinDbg 命令三部曲:(一)WinDbg 命令手册 WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册 WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
- 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令
调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...
- WinDbg常用命令系列---.write_cmd_hist (写命令历史记录)
.write_cmd_hist 简介 .write_cmd_hist命令将调试器命令窗口的整个历史记录写入文件. 使用形式 .write_cmd_hist Filename 参数 Filename指定 ...
- windbg预览版,windbg preview配置win7x64双机调试
目录 一丶简介 二丶步骤 1.下载Windbg Preview (windbg预览版本) 2.配置虚拟机端口 3.虚拟机设置调试湍口 4.windbg preview开始调试. 一丶简介 Windbg ...
- 简化LINUX的命令输入 简化linux命令
在LINUX中,有很多常用的命令,常用的命令我们可以熟练的记忆,但是对于不经常使用的命令恐怕是需要翻阅手册了,但是我们可以简化这些命令的输入来达到简便记忆的效果. 这里以BSH为例: 编辑/etc/b ...
- shell中的内建命令, 函数和外部命令
转自shell中的内建命令, 函数和外部命令 Shell识别三种基本命令:内建命令.Shell函数以及外部命令: (1)内建命令就是由Shell本身所执行的命令. 有些命令是由于其必要性才内建的 ...
- 编译u-boot命令和u-boot常用命令
一.编译u-boot命令 1.配置开发板 #make TQ2440_config 2.编译 #make all 3.交叉编译器是crosstools_3.4.5_softfloat” 使用4.3.3版 ...
随机推荐
- php类与对象
1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化后的$a 引用:php的别名,两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类(逻辑 ...
- tornado RequestHandler request.body & request.arguments
request.body , 请求的原始内容,post方式放在body中的. request.arguments, body参数和url参数的统一体, 同时也是经过“加工”,解码的. eg.在对接其他 ...
- phpcms评论框iframe无法自适应问题
问题背景: 之前用友言的时候改过网站的ip地址,改成127开头的了.但是协同开发的时候别人用的还是localhost. 结果在用评论的时候iframe死活不能自适应,看了一下源代码v9本身已经写过if ...
- Thread.Sleep vs. Task.Delay
We use both Thread.Sleep() and Task.Delay() to suspend the execution of a program for some given tim ...
- python程序打包成.exe----pyinstaller工具
1. 环境 windows 2. 安装 准备文件:PyWin32 or pypiwin32 运行如下安装命令: pip install pyinstaller==3.0 不要使用3.2版本,编译完成 ...
- volley post非json格式数据并获取json数据
在使用JsonObjectRequest时无法post非json格式的数据,因而采用StringRequest获取到相应的数据后再转为json格式的数据. //这里的上下文需要讨论 private s ...
- Tcpdump的详细用法
1. TCPDump介绍 TcpDump可以将网络中传送的数据包的"头"完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来 ...
- 比较两个mysql数据库表结构的差异
需求来源:一个线上系统,一个开发系统,现在要把开发系统更新到线上,但是开发系统的数据库结构与线上的略有差异,所以需要找出两个数据库的表结构差异. 数据库表结构的差异 注:操作均在Linux系统下完成 ...
- ajax删除数据后刷新页面
代码如图: 理解: 发送请求后删除name 属性为 name 的data;用rem .remove删除: 删除后找到页面上app的数量:定义page = len/12+1; 找到当前页是哪一页,如果l ...
- 【leetcode】Subsets (Medium) ☆
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...








































