Windbg的命令
前面介绍了Windbg的UI功能,也基本上能完成基本的调试任务,但是WinDBG主要是以命令方式工作的,这些命令在Command Window里输入。WinDBG共支持三类命令:标准命令、元命令和扩展命令。某些命令仅在实时调试中可用,其他命令仅在调试转储文件时可用。某些命令仅在用户模式调试期间可用,其他命令仅在内核模式调试期间可用。只有当目标在某些处理器上运行时,某些命令才可用。
一、标准命令
标准命令(standard command)用来提供适用于所有调试目标的基本调试功能.标准命令通常是一两个字符(version除外)或者符号,只有version等少数命令除外。标准命令的第一个字符是不分大小写的, 第二个字符可能区分大小写。所有标准命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块。迄今为止, WinDBG调试器共实现了130多条标准命令, 分为60多个系列. 为了便于记忆, 可以根据功能将标准命令归纳为如下18个子类。在命令编辑框中输入一个问号(?), 可以显示出主要的标准命令和每个命令的简单介绍。
- 控制调试目标执行
功能 | 命令 | 描述/助记 | 补充信息 |
恢复运行 | g | Go | ~123g, ~#g, ~*g |
跟踪执行 | t | Trace | |
单步执行 | p | Step | |
追踪监视 | wt | Trace and Watch Data |
- 寄存器相关
功能 | 命令 | 描述/助记 | 补充信息 |
观察和修改通用寄存器 | r | Registers | |
读写MSR寄存器 | rdmsr和wrmsr | Read MSR and Write MSR | |
设置寄存器显示掩码 | rm | Register Mask |
- IO端口读写
功能 | 命令 | 描述/助记 |
读IO端口 | ib, iw, id | Input from port (byte, word, double word) |
写IO端口 | ob, ow, od | Output to port (byte, word, double word) |
- 内存控制
功能 | 命令 | 描述/助记 | 补充信息 |
观察内存 | d系列 | Display Memory | d, da, db, dc, dd, dD, df, dp, dq, du, dw, dW, dyb, dyd |
编辑内存 | e系列 | Enter Values | e, ea, eb, ed, eD, ef, ep, eq, eu, ew, eza, ezu |
搜索内存 | s | Search Memory | sb, sw, sd, sq, sa, su |
- 栈
功能 | 命令 | 描述/助记 | 补充信息 |
观察栈 | k系列 | Display Stack Backtrace | k, kb, kc, kd, kp, kP, kv |
- 设置维护断点
功能 | 命令 | 描述/助记 |
软件断点 | bp, bu, bm | Set Breakpoint, Set Unresolved Breakpoint, Set Symbol Breakpoint |
硬件断点 | ba | Break on Access |
管理断点 | bl | Breakpoint List |
清除,禁止,重新启用断点 | bc, bd, be | Breakpoint Clear, Breakpoint Disable, Breakpoint Enable |
- 线程
功能 | 命令 | 描述/助记 |
显示控制线程 | ~ | Thread Status |
- 进程
功能 | 命令 | 描述/助记 |
显示进程 | | | Process Status |
- 表达式
功能 | 命令 | 描述/助记 |
评估表达式 | ? | Evaluate Expression |
评估C++表达式 | ?? | Evaluate C++ Expression |
- 汇编, 反汇编
功能 | 命令 | 描述/助记 |
汇编 | a | Assemble |
反汇编 | u | Unassemble |
- 段
功能 | 命令 | 描述/助记 |
显示段的选择子 | dg | Display Selector: shows the segment descriptor for the specified selector |
- 执行命令文件
功能 | 命令 | 描述/助记 | 补充信息 |
运行命令脚本文件 | $ | Run Script File | $<, $><,
<,
|
><, $$>a< |
- 配置命令
功能 | 命令 | 描述/助记 | 补充信息 |
异常发生或者某事件发生时debuger的处理方式 | sx系列 | Set Exceptions | sx, sxd, sxe, sxi, sxn, sxr, sx- |
启用与禁止静默模式 | sq | Set Quiet Mode |
sq |
设置内核debugging选项 | so | Set Kernel Debugging Options | |
设置符号后缀 | ss | Set Symbol Suffix | ss [a|w|n] |
- 版本与系统信息
功能 | 命令 | 描述/助记 |
显示调试器和调试目标版本 | version | Show Debugger Version |
显示调试目标所在系统的信息 | vertarget | Show Target Computer Version |
- 检查符号
功能 | 命令 | 描述/助记 |
检查符号 | x | Examine Symbols |
- 源程序
功能 | 命令 | 描述/助记 | 补充信息 |
控制和显示源程序 | ls系列 | List Source Lines | ls, lsa, lsp, lsc, lsf |
- 调试符号
功能 | 命令 | 描述/助记 |
加载调试符号 | ld | Load Symbols |
搜索相邻符号 | ln | List Nearest Symbols |
显示模块列表 | lm | List Loaded Modules |
- 调试会话
功能 | 命令 | 描述/助记 |
结束调试会话 | q | Quit |
结束远程调试 | Quit | |
结束调试会话并分离调试目标 | qd | Quit and Detach |
二、元命令
元命令(Meta-Command)用来提供标准命令没有提供的常用调试功能, 与标准命令一样, 元命令也是内建在调试器引擎或者WinDBG程序文件中的. 所有元命令都已一个点(.)开始, 所以元命令也被称为点命令(Dot Command)。
按照功能, 可以把元命令分成如下几类.
- 显示和设置调试会话和调试器选项.
- 用于符号选项的.symopt- Set Symbol Options
- 用于符号路径的.sympath- Set Symbol Path, 和.symfix- Set Symbol Store Path.
- 用于程序源文件的.srcpath- Set Source Path, .srcnoisy- Noisy Source Loading, .srcfix- Use Source Server
- 用于扩展命令模块路径的.extpath- Set Extension Path
- 用于匹配扩展命令的.extmatch- Display All Matching Extensions
- 用于可执行文件的.exepath- Set Executable Path
- 设置反汇编选项的.asm- Change Disassembly Options
- 控制表达式评估器的.expr- Choose Expression Evaluator
- 控制调试会话或者调试目标.
- 重新开始调试会话的.restart- Restart Kernel Connection(Kernel Mode) 或 Restart Target Application(User Mode)
- 放弃用户态调试目标(进程)的.abandon- Abandon Process
- 创建新进程的.create- Create Process
- 附加到存在进程的.attach- Attach to Process
- 打开转储文件的.opendump- Open Dump File
- 分离调试目标的.detach- Detach from Process
- 用于杀掉进程的.kill- Kill Process
- 管理扩展命令模块
- 加载模块的.load- Load Extension DLL
- 卸载模块.unload- Unload Extension DLL和.unloadall- Unload All Extension DLLs
- 显示已加载模块的.chain- List Debugger Extensions
- 管理调试器日志文件
- 显示信息 .logfile- Display Log File Status
- 打开 .logopen- Open Log File
- 追加 .logappend- Append Log File
- 关闭 .logclose- Close Log File
- 远程调试
- 用于启动remote.exe服务的.remote- Create Remote.exe Server
- 用于启动调试引擎服务器的.server- Create Debugging Server
- 列出可用服务器的.servers- List Debugging Servers
- 用于向远程服务器发送文件的.send_file- Send File
- 用于结束远程进程服务器的.endpsrv- End Process Server
- 用于结束引擎服务器的.endsrv- End Debugging Server
- 控制调试器
- 让调试器睡眠一段时间的.sleep- Pause Debugger
- 唤醒处于睡眠状态的调试器的.wake- Wake Debugger
- 启动另一个调试器来调试当前调试器的.dbgdbg- Debug Current Debugger
- 编写命令程序
- 包括一系列类似C语言关键字的命令, 如
- .if, .else, .elsif, .foreach, .do, .while. .continue, .catch, .break, .continue, .leave, .printf, .block. 在<软件调试>一书第30章的第18节有介绍命令程序的编写方法.
- 包括一系列类似C语言关键字的命令, 如
- 显示或者转储调试目标数据
- 产生转储文件的.dump- Create Dump File
- 将原始内存数据写到文件的.writemem- Write Memory to File
- 显示调试会话时间的.time- Display System Time
- 显示线程时间的.ttime- Display Thread Times
- 显示任务列表的.tlist- List Process IDs
- 以不同格式显示数字的.formats- Show Number Formats
- 可以列出所有元命令和每个命令的简单说明的.help- Meta-Command Help
三、扩展命令
扩展命令(Extension Command)用于实现针对特定调试目标的调试功能,用于扩展某一方面的调试功能。与标准命令和元命令是内建在WinDBG程序文件中不同, 扩展命令式实现在动态加载的扩展模块(DLL)中的。所有的扩展命令都以!开头。通过WinDBG的SDK,用户可以编写自己的扩展模块和扩展命令。执行扩展命令式, 应该以叹号( ! )开始, 叹号在英文中被称为bang, 因此扩展名伶也被称为Bang Command. 执行扩展命令的完整格式是:![扩展模块名].<扩展命令名> [参数]。其中, 扩展模块名可以省略, 如果省略, WinDBG会自动在已经加载的扩展模块中搜索指定的命令.
WinDBG程序包中包含了常用的扩展命令模块。存放在以下几个子目录中:
- WINXP: 调试目标为Windows XP 或者更高版本时版本时的扩展命令模块。
- WINEXT: 适用于所有Windows版本的扩展命令模块。
扩展模块 |
路径 |
描述 |
ext.dll |
WINEXT |
适用于各种调试目标的常用扩展命令 |
kext.dll |
WINEXT |
内核态调试时的常用扩展命令 |
uext.dll |
WINEXT |
用户态调试时的常用扩展命令 |
logexts.dll |
WINEXT |
用于监视和记录API调用(Windows API Logging Extensions) |
sos.dll |
WINEXT |
用于调试托管代码和.Net程序 |
ks.dll |
WINEXT |
用于调试内核流(Kernel Stream) |
wdfkd.dll |
WINEXT |
调试使用WDF(Windows Driver Foundation)编写的驱动程序 |
acpikd.dll |
WINXP |
用于ACPI调试,追踪调用ASL程序的过程,显示ACPI对象 |
exts.dll |
WINXP |
关于堆(!heap)、进程/线程结构(!teb/!peb)、安全信息(!token、!sid、!acl)和应用程序验证(!avrf)等的扩展命令 |
kdexts.dll |
WINXP |
包含了大量用于内核调试的扩展命令 |
fltkd.dll |
WINXP |
用于调试文件系统的过滤驱动程序(FsFilter) |
minipkd.dll |
WINXP |
用于调试AIC78xx小端口(miniport)驱动程序 |
ndiskd.dll |
WINXP |
用于调试网络有关驱动程序 |
ntsdexts.dll |
WINXP |
实现了!handle、!locks、!dp、!dreg(显示注册表)等命令 |
rpcexts.dll |
WINXP |
用于RPC调试 |
scsikd.dll |
WINXP |
用于调试SCSI有关的驱动程序 |
traceprt.dll |
WINXP |
用于格式化ETW信息 |
vdmexts.dll |
WINXP |
调试运行在VDM中的DOS程序和WOW程序 |
wow64exts.dll |
WINXP |
调试运行在64位Windows系统中的32位程序 |
wmitrace.dll |
WINXP |
显示WMI追踪有关的数据结构、缓冲区和日志文件 |
因为扩展命令是实现在动态加载的扩展模块(DLL)中的, 所以执行时需要加载对应的扩展模块. 当调试目标被激活(debuggee activation)时, WinDBG会根据调试目标的类型和当前的工作空间自动加载命令空间中指定的扩展模块。用户也可以使用一下方法手动加载扩展模块。
- 使用.load命令加上扩展模块的名称或者完成路径来加载它. 如果没有指定路径, 那么WinDBG会在扩展模块搜索路径(EXTPATH)中寻找这个文件.
- 使用.loadby命令加上扩展模块的名称和一个已经加载的程序模块的名称. 这时WinDBG会在指定的程序模块文件所在目录中寻找和加载扩展命令模块. 例如, 在调试托管程序是, 可以使用.loadby sos mscorwks命令让WinDBG在mscorwks模块所在的目录中加载SOS扩展模块, 这样可以确保加载正确版本的sos模块.
当使用"!扩展模块名.扩展命令名"的方式执行扩展命令时, 如果指定的扩展模块还没有加载, 那么WinDBG会自动搜索和加载这个模块.使用.chain命令可以列出当前加载的所有扩展模块, 使用.unload和.unloadall命令可以卸载指定的或者全部扩展模块. 大多数扩展模块都支持help命令来显示这个模块的基本信息和所包含的全部命令, 例如执行!ext.help可以显示ext模块中的所有扩展命令。
Windbg的命令的更多相关文章
- Windbg调试命令详解
作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...
- WinDbg调试命令汇总
一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...
- Windbg调试命令详解(1)
转载注明>> [作者:张佩][镜像:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是 ...
- Windbg 基础命令 《第一篇》
Windbg.exe是Windows的一个调试工具,它支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”. 实时模式:被调试的程序正在运行当中,调试器可以实 ...
- Windbg 脚本命令简介 二, Windbg command
Windbg 脚本命令简介 二, Windbg script command $<, $><, $$<, $$><, $$>a< (Run Scri ...
- windbg 常用命令详解
= kd> ln 8046e100 (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendRes ...
- Windbg 脚本命令简介 一
Windbg 脚本命令简介 一 Windbg command r: registers的简写,可以显示或修改寄存器的值.浮点寄存器的值.定义别名变量. 可以显示当前线程下的寄存器值. The r c ...
- 【转载】windbg 常用命令详解
windbg 常用命令详解 https://blog.csdn.net/chenyujing1234/article/details/7743460 vertarget 显示当前进程的大致信息 lmv ...
- windbg 基础命令实战 - 简单程序破解
以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命 ...
- windbg常用命令
SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols CPU常用命令 载入sos.dll 执行.load C:\Windows\Micr ...
随机推荐
- Python 基础 常用运算符
Python 基础 常用运算符 计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算术运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们暂只学习 算术运算. ...
- 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI
原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...
- Chrome 谷歌开发者工具使用窍门
我们这里介绍主要的几块:Console.Source.Network Console 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的, ...
- installer
if (args.Length == 0) { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new MyServi ...
- 使用poi调整字体格式、添加单元格注释、自动调整列宽
1 创建新的工作铺 import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCell; import org ...
- [golang]按图片中心旋转后的新图左顶点和原图左顶点的偏移量计算
1 前言 略,作为记录使用 2 代码 /** * @Author: FB * @Description: * @File: RotateSample.go * @Version: 1.0.0 * @D ...
- CspParameters 对象已存在异常 解决多应用对同一容器的访问问题
CspParameters cspParams; cspParams = new CspParameters(PROVIDER_RSA_FULL); cspParams.KeyContainerNam ...
- PHP Lumen Laravel 解决validate方法自定义message无效的问题
/** * 由于 \Laravel\Lumen\Routing\ProvidesConvenienceMethods::validate 在验证不通过时, * 抛出 \Illuminate\Valid ...
- Redis中如何发现并优化big key?
Redis中的大key一直是重点需要优化的对象,big key既占用比较多的内存,也可能占用比较多的网卡资源,造成redis阻塞,因此我们需要找到这些big key进行优化 一.寻找big key 通 ...
- cookie登录及其保存
requests中request携带cookie请求1 将一个Session实例的cookies属性设置赋值成 一个 CookieJar 实例 import http.cookiejar s = re ...