前面介绍了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
sq
{e|d}

设置内核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
结束远程调试 qq 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节有介绍命令程序的编写方法.
  • 显示或者转储调试目标数据
    • 产生转储文件的.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的命令的更多相关文章

  1. Windbg调试命令详解

    作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...

  2. WinDbg调试命令汇总

    一. 1. !address eax 查看对应内存页的属性 2. vertarget 显示当前进程的大致信息 3 !peb 显示process Environment Block 4. lmvm 可以 ...

  3. Windbg调试命令详解(1)

    转载注明>> [作者:张佩][镜像:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是 ...

  4. Windbg 基础命令 《第一篇》

    Windbg.exe是Windows的一个调试工具,它支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”. 实时模式:被调试的程序正在运行当中,调试器可以实 ...

  5. Windbg 脚本命令简介 二, Windbg command

    Windbg  脚本命令简介 二, Windbg  script command $<, $><, $$<, $$><, $$>a< (Run Scri ...

  6. windbg 常用命令详解

    = kd> ln 8046e100 (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendRes ...

  7. Windbg 脚本命令简介 一

    Windbg  脚本命令简介 一 Windbg command r: registers的简写,可以显示或修改寄存器的值.浮点寄存器的值.定义别名变量. 可以显示当前线程下的寄存器值. The r c ...

  8. 【转载】windbg 常用命令详解

    windbg 常用命令详解 https://blog.csdn.net/chenyujing1234/article/details/7743460 vertarget 显示当前进程的大致信息 lmv ...

  9. windbg 基础命令实战 - 简单程序破解

    以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命 ...

  10. windbg常用命令

    SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols CPU常用命令 载入sos.dll  执行.load C:\Windows\Micr ...

随机推荐

  1. ubuntu安装shadow socks-qt5

    Ubuntu16安装shadow socks-qt5 在Ubuntu下也是有GUI客户端,怎么安装请看下面: 首先,针对Ubuntu16的版本可以直接这么安装: .$ sudo add-apt-rep ...

  2. 通过重新上传修改后的docker镜像来在kubeapps上实现k8s上部署的nginx版本更新,回退等

    docker操作:制作自定义镜像 # docker下载官方nginx镜像 docker pull nginx # 基于该镜像运行一个容器 docker run -it -d --name nginx_ ...

  3. 《JAVA高并发编程详解》-类的加载过程简介

  4. .NET Core入门

            .Net core MVC   如何使用 .NET Core,最基本的入行,很多博客以及官网都有的太多太多的例子,但是大部分没有人做到了真的让一个小白一步一步的去学, 我第一次接触的时 ...

  5. this指向详解及改变它的指向的方法

    一.this指向详解(彻底理解js中this的指向,不必硬背) 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是 ...

  6. vue+element 通过ref修改一切硬核样式~

    今天的需求是这样的,点击按钮,弹出一个Popover 弹出框 然后老大说,把弹出框往下移移,box-shadow值设的大一些... 然后就查看elenent的Popover文档,并没有方法,而且这个组 ...

  7. windows安装redis服务

    下载地址: https://github.com/microsoftarchive/redis/releases 解压. git执行:

  8. Node: 包管理机制

    Node.js 的模块机制可以很好地解决业务代码混乱的难题,但对于第三方模块包,就有些力不从心了,因为第三方模块包分散存放在各地,无法集中式管理.这就需要一个包管理机制,在 Node.js 中,Isa ...

  9. Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建

    Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Gerrit版本选择 1>.查看Gerrit官网 ...

  10. spark 程序 windows 运行报错

    1 java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries. at ...