WinDbg 命令三部曲:(一)WinDbg 命令手册

时间:2021-08-14 23:33:42

本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。

系列博文

  1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
  2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
  3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》

导航目录

调试准备

为了测试 WinDbg 中使用 SOS 扩展命令,我创建了应用程序 "MemoryLeakApp.exe",Visual Studio 程序选择为 64 位环境编译。

WinDbg 命令三部曲:(一)WinDbg 命令手册

WinDbg 命令三部曲:(一)WinDbg 命令手册

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

WinDbg 命令三部曲:(一)WinDbg 命令手册

WinDbg 命令三部曲:(一)WinDbg 命令手册

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

WinDbg 命令三部曲:(一)WinDbg 命令手册

WinDbg 命令三部曲:(一)WinDbg 命令手册

WinDbg 命令三部曲:(一)WinDbg 命令手册

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

WinDbg 命令三部曲:(一)WinDbg 命令手册

WinDbg 常用命令手册

内置帮助命令

命令 描述
?

?             显示常规命令

? /D            通过 DML(Debugging Markup Language) 方式显示常规命令

.help

.help        显示 . 系列命令

.help /D       通过 DML 方式显示 . 系列命令

.help /D a*   通过 DML 方式显示所有以 'a' 字母开头的 . 系列命令

WinDbg 命令三部曲:(一)WinDbg 命令手册

.chain

.chain          列出所有已加载的调试器扩展

.chain /D      通过 DML 方式列出所有已加载的调试器扩展

WinDbg 命令三部曲:(一)WinDbg 命令手册

.extmatch

.extmatch /e ExtDLL FunctionFilter      显示调试器扩展的所有导出函数

.extmatch /D /e ExtDLL FunctionFilter  通过 DML 方式显示调试器扩展所有导出函数

.extmatch /D /e uext *                       显示 uext 扩展中的所有导出函数

WinDbg 命令三部曲:(一)WinDbg 命令手册

.hh

.hh         打开 WinDbg 的帮助文件

.hh Text  打开 WinDbg 的帮助文件,并自动搜索 Text 的内容

.hh dt     在 WinDbg 帮助文件中搜索 dt 命令

调试会话命令

命令 描述
.attach

.attach PID 附加到指定ID的进程

.detach

.detach      结束调试会话,被调试进程仍可继续运行

WinDbg 命令三部曲:(一)WinDbg 命令手册

q

q               结束调试会话,同时终止被调试进程的进行

qq             结束调试会话,同时终止被调试进程的进行

.restart

.restart      重启被调试应用

一般信息命令

命令 描述
version

显示调试器版本信息和已加载的调试器扩展

WinDbg 命令三部曲:(一)WinDbg 命令手册

vercommand

显示调试器启动文件的路径

WinDbg 命令三部曲:(一)WinDbg 命令手册

vertarget

显示目标机器的版本

WinDbg 命令三部曲:(一)WinDbg 命令手册

CTRL+ALT+V

打开或关闭 Verbose 模式开关,某些命令在此模式下可以给出更多详细信息

.formats

.formats Expression  显示数字的各种格式信息

.formats 5

WinDbg 命令三部曲:(一)WinDbg 命令手册

.cls

清理屏幕

.last event 显示最新的异常信息或事件信息
.effmach

.effmach 显示有效作用的机器信息
.effmach .
.effmach #
.effmach x86 | amd64 | ia64 | ebc

.time

显示系统记录的各种时间

WinDbg 命令三部曲:(一)WinDbg 命令手册

.echo

.echo String  输出字符串

.echo "String"

.echo "Hello World"

WinDbg 命令三部曲:(一)WinDbg 命令手册

符号加载命令

命令 描述
ld

ld ModuleName  加载指定模块的符号

ld *                  加载所有模块的符号

WinDbg 命令三部曲:(一)WinDbg 命令手册

!sym

!sym                获取符号加载状态

!sym noisy       让调试器显示符号搜索详细信息

!sym quiet        默认项,不显示符号搜索信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

.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 *!               列出所有模块

WinDbg 命令三部曲:(一)WinDbg 命令手册

x ntdll!*          列出 ntdll 模块

WinDbg 命令三部曲:(一)WinDbg 命令手册

x /t /v ntdll!*    列出 ntdll 模块数据类型和符号类型

WinDbg 命令三部曲:(一)WinDbg 命令手册

.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   显示所有加载和未加载的模块信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

lmv 显示已加载模块的详细信息

lml  同时显示加载的符号信息

lmk 显示内核模块信息

lmu 显示用户模块信息

lmf  显示镜像路径

lmm 匹配模块名称

lmD 使用 DML 方式显示

WinDbg 命令三部曲:(一)WinDbg 命令手册

lmv m kernel32 显示 kernel32 模块详细信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

!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 模块的信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

异常分析命令

命令 描述
!analyze

!analyze -v       显示当前异常的详细信息

!analyze -hang  诊断线程调用栈上是否有任何线程阻塞了其他线程

!analyze -f        查看异常分析信息,尽管调试器并未诊断出异常

WinDbg 命令三部曲:(一)WinDbg 命令手册

进程信息命令

命令 描述
!dml_proc

通过 DML 方式显示当前进程的信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

.tlist

显示当前所有进程

WinDbg 命令三部曲:(一)WinDbg 命令手册

线程信息命令

命令 描述
~

~                              显示线程信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

~* [Command]           所有线程

WinDbg 命令三部曲:(一)WinDbg 命令手册

~. [Command]            当前线程

WinDbg 命令三部曲:(一)WinDbg 命令手册

~# [Command]           引发当前事件或异常的线程

~Number [Command]  显示指定序号的线程

WinDbg 命令三部曲:(一)WinDbg 命令手册

~~[TID] [Command]   显示指定线程ID的线程

~Ns                          切换到线程 N

~* k  显示所有线程的调用栈

~2 f   冻结2号线程

~# f  冻结引发异常的线程

~3 u  解除对3号线程的冻结

~2 k  显示2号线程的调用栈

WinDbg 命令三部曲:(一)WinDbg 命令手册

~e

~* e CommandString            在所有线程上执行命令

~. e CommandString             在当前线程上执行命令

~# e CommandString            在引发异常的线程上执行命令

~Number e CommandString   在指定序号的线程上执行命令

~2e r; k; kd  相当于 ~2r; ~2k; ~2kd

~*e !gle       显示所有线程的最后一个错误信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

~f

~Thread f    冻结线程

~u

~Thread u   解除冻结线程

~n

~Thread n   挂起线程,增加线程挂起数量

~m

~Thread m  恢复线程,减少线程挂起数量

!teb

显示线程环境信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

!tls 

!tls -1          -1 为显示当前线程所有的 slot 信息

!tls SlotIdx   显示指定的 slot 信息

!tls [-1 | SlotIdx] TebAddr

WinDbg 命令三部曲:(一)WinDbg 命令手册

.ttime

显示线程时间信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

!runaway

[Flags: 0 | 1 | 2] 显示每个线程消耗的时间,用于快速的查找 CPU 时间消耗最多的线程

0 用户态时间

1 内核态时间

2 自线程创建起的时间间隔

WinDbg 命令三部曲:(一)WinDbg 命令手册

!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 个帧

WinDbg 命令三部曲:(一)WinDbg 命令手册

kd

kd [WordCnt]  显示原始栈数据和可能的符号信息

kM

使用 DML 格式显示堆栈信息

.kframes

设置栈长度,默认是20(0x14)

.frame

.frame            显示当前帧

.frame #         指定帧号

.frame /r [#]   显示寄存器信息

.frame 2         显示帧号 2 的信息

.frame /r 0d    显示 0 帧中寄存器信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

!uniqstack

!uniqstack                   显示所有线程的栈信息

!uniqstack [b|v|p] [n]   b=前3个参数;v=FPO信息;p=所有参数;n=帧号

!uniqstack -?               显示帮助

WinDbg 命令三部曲:(一)WinDbg 命令手册

!findstack

!findstack Symbol              找到包含符号或模块的栈

!findstack Symbol [0|1|2]   0=仅显示线程ID;1=线程ID和帧;2=全部的线程栈;

!findstack -?                      显示帮助

!findstack clr 2                   显示包含 clr 的所有栈的信息

WinDbg 命令三部曲:(一)WinDbg 命令手册

扩展帮助命令

命令 描述

!Ext.help

常规扩展命令帮助

WinDbg 命令三部曲:(一)WinDbg 命令手册

!Exts.help

 WinDbg 命令三部曲:(一)WinDbg 命令手册

!Uext.help

用户态模式扩展命令帮助

WinDbg 命令三部曲:(一)WinDbg 命令手册

!Ntsdexts.help

用户态扩展命令帮助(OS相关)

WinDbg 命令三部曲:(一)WinDbg 命令手册

!logexts.help

日志相关扩展

WinDbg 命令三部曲:(一)WinDbg 命令手册

!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]  指定模块的包含或屏蔽列表

参考资料

本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。

系列博文

  1. 《WinDbg 命令三部曲:(一)WinDbg 命令手册》
  2. 《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
  3. 《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》

WinDbg 命令三部曲:(一)WinDbg 命令手册的更多相关文章

  1. WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  2. WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...

  3. WinDbg命令三部曲

    WinDbg 命令三部曲:(一)WinDbg 命令手册 WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册 WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册

  4. 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令

    调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...

  5. WinDbg常用命令系列---&period;write&lowbar;cmd&lowbar;hist &lpar;写命令历史记录&rpar;

    .write_cmd_hist 简介 .write_cmd_hist命令将调试器命令窗口的整个历史记录写入文件. 使用形式 .write_cmd_hist Filename 参数 Filename指定 ...

  6. windbg预览版&comma;windbg preview配置win7x64双机调试

    目录 一丶简介 二丶步骤 1.下载Windbg Preview (windbg预览版本) 2.配置虚拟机端口 3.虚拟机设置调试湍口 4.windbg preview开始调试. 一丶简介 Windbg ...

  7. 简化LINUX的命令输入 简化linux命令

    在LINUX中,有很多常用的命令,常用的命令我们可以熟练的记忆,但是对于不经常使用的命令恐怕是需要翻阅手册了,但是我们可以简化这些命令的输入来达到简便记忆的效果. 这里以BSH为例: 编辑/etc/b ...

  8. shell中的内建命令&comma; 函数和外部命令

    转自shell中的内建命令, 函数和外部命令 Shell识别三种基本命令:内建命令.Shell函数以及外部命令: (1)内建命令就是由Shell本身所执行的命令.    有些命令是由于其必要性才内建的 ...

  9. 编译u-boot命令和u-boot常用命令

    一.编译u-boot命令 1.配置开发板 #make TQ2440_config 2.编译 #make all 3.交叉编译器是crosstools_3.4.5_softfloat” 使用4.3.3版 ...

随机推荐

  1. 【BZOJ】1084&colon; &lbrack;SCOI2005&rsqb;最大子矩阵(DP)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...

  2. XSS学习笔记(五)-XSS防御

    如果只生产XSS的地方都与输入或输出相关联的.所以错过了主要矛盾.而且,我们将有一个解决问题的办法:您可以输入端砚格过滤,是可能的过滤输出时间,输出到用户的GET或POST中是否有敏感字符: 输入过滤 ...

  3. spark介绍

    什么是Spark Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hado ...

  4. HtmlFilter实现Html标签转义过滤器

    HtmlUrlFilter: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterC ...

  5. VirtualBox虚拟机E&lowbar;INVALIDARG &lpar;0x80070057&rpar;

    转自:http://www.wzwzl.com/zblog/blog_wz/32.html 打开以前的VirtualBox虚拟机文件时,错误提示:返回 代码:E_INVALIDARG (0x80070 ...

  6. POJ 2248 - Addition Chains - &lbrack;迭代加深DFS&rsqb;

    题目链接:http://bailian.openjudge.cn/practice/2248 题解: 迭代加深DFS. DFS思路:从目前 $x[1 \sim p]$ 中选取两个,作为一个新的值尝试放 ...

  7. 【问题解决方案】Keras手写数字识别-ConnectionResetError&colon; &lbrack;WinError 10054&rsqb; 远程主机强迫关闭了一个现有的连接

    参考:台大李宏毅老师视频课程-Keras-Demo 在载入数据阶段报错: ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接 Google之 ...

  8. Ubuntu 10&period;04里安装强大抓图工具Shutter

    Shutter 原名叫GScrot,是一款Linux下很强大的抓图工具,支持截取全屏幕,窗口,自选区域以及网页的图像,并且截取后的图像还可以简单编辑,Shutter还支持插件功能,矩齿,边缘化,碎纸, ...

  9. 专业分析docker的分层存储技术

    话不在多,指明要点! 联合挂载是用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统视图的途径, 是下层存储驱动(aufs.overlay等) 实现分层合并的方式. 所以严格来说,联合挂载 ...

  10. TSQL--聚合函数

    --======================================================== --COUNT --COUNT(1) 和COUNT(*) 计算结果相同,COUNT ...