没有合适的资源?快使用搜索试试~ 我知道了~
首页WinDebug用法详解
WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户 态调试、 内核态调试、 调试转储文件、 远程调试等等。 WinDBG 具有非常大的灵活性和可扩展性, 用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块 来定制和补充 WinDBG 的调试功能。 尽管 WinDBG 是个典型的窗口程序, 但是它的大多数调试功能还是以手工输入命令的方式来 工作的。目前版本的 WinDBG 共提供了 20 多条标准命令, 140 多条元命令( Meta-commands), 和难以计数的大量扩展命令。学习和灵活使用这些命令是学习 WinDBG 的关键,也是难点。 上一章我们从设计的角度分析了 WinDBG ,本章将从使用(用户)的角度介绍 WinDBG 。我 们先介绍工作空间的概念和用法(第 1 节),然后介绍命令的分类和不同种类的命令提示符(第 2 节)。 第 3 节介绍不同的调试模式, 也就是如何与不同特征的调试目标建立调试会话。 第 4 节介绍 上下文的概念和在调试时应该如何切换和控制上下文。第 5 节介绍调试事件和如何定制调试事件 的处理方式。 从第 6 节到第 9 节我们将分别介绍如何在 WinDBG 中完成典型的调试操作, 比如控 制调试目标(第 6 节)、设置断点(第 7 节)、观察栈(第 8 节)以及如何观察和修改数据(第 9 节)。
资源详情
资源评论
资源推荐
1
第30章 WinDBG 用法用法详解详解
WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户
态调试、 内核态调试、 调试转储文件、 远程调试等等。 WinDBG 具有非常大的灵活性和可扩展性,
用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块
来定制和补充 WinDBG 的调试功能。
尽管 WinDBG 是个典型的窗口程序, 但是它的大多数调试功能还是以手工输入命令的方式来
工作的。目前版本的 WinDBG 共提供了 20 多条标准命令, 140 多条元命令( Meta-commands),
和难以计数的大量扩展命令。学习和灵活使用这些命令是学习 WinDBG 的关键,也是难点。
上一章我们从设计的角度分析了 WinDBG ,本章将从使用(用户)的角度介绍 WinDBG 。我
们先介绍工作空间的概念和用法(第 1 节),然后介绍命令的分类和不同种类的命令提示符(第 2
节)。第 3 节介绍不同的调试模式, 也就是如何与不同特征的调试目标建立调试会话。 第 4 节介绍
上下文的概念和在调试时应该如何切换和控制上下文。第 5 节介绍调试事件和如何定制调试事件
的处理方式。 从第 6 节到第 9 节我们将分别介绍如何在 WinDBG 中完成典型的调试操作, 比如控
制调试目标(第 6 节)、设置断点(第 7 节)、观察栈(第 8 节)以及如何观察和修改数据(第 9
节)。
30.1 工作空间
WinDBG 使用工作空间 (Workspace)来描述和存储一个调试项目的属性、参数、 以及调试器
设置等信息。其功能类似于集成开发环境的项目文件。
30.1.1分类分类
WinDBG 定义了两种工作空间,一种称为缺省的工作空间( Default Workspace ),另一种称为
命名的工作空间( Named Workspace)。当没有明确使用某个命名的工作空间时, WinDBG 总是使
用缺省的工作空间,因此缺省的工作空间也叫隐含的( implicit )工作空间,命名的工作空间也叫
显式的( explicit )工作空间。
WinDBG 安装时就预先创建了一系列缺省的工作空间,分别是:
基础工作空间( base workspace),当调试会话尚未建立, WinDBG 处于模糊状态时,它
会使用基础工作空间。
缺省的内核态工作空间 (default kernel-mode workspace ),当在 WinDBG 中开始内核调试,
但是尚未与调试目标建立起联系时, WinDBG 会缺省使用这个工作空间。
缺省的远程调试工作空间( remote default workspace),当通过调试服务器( DbgSrv 或
KdSrv )进行远程调试时, WinDBG 会缺省使用这个工作空间。
特定处理器的工作空间( processor-specific workspace ),在进行内核调试时,当 WinDBG
与调试目标建立起联系,并知道对方的处理器类型后, WinDBG 会缺省使用其对应处理
器类型的工作空间。典型的处理器类型有 x86、AMD64 、Itanium 等。
缺省的用户态工作空间( default user-mode workspace),当 WinDBG 正在附加到一个用
户态进程的过程中时,它会使用这个工作空间。
2
相对于可执行文件的缺省工作空间, 当在用户态调试时, 一旦 WinDBG 知道了调试目标
的可执行文件名后(对于附加到已经运行的进程,是附加到进程后,对于调试新运行的
程序,那么是选定程序文件后) ,它就会使用这个可执行文件所对应的工作空间, 如果这
个工作空间已经存在,那么它就用存在的,如果不存在,那么就创建一个新的。
相对于转储文件( dump file )的工作空间,在分析转储文件时, WinDBG 会为每个转储
文件建立和维护一个工作空间。
在通过 WinDBG 文件菜单的 Save workspace as …命令调出的 Save Workspace As对话框的标题
中包含了 WinDBG 当前所使用工作空间的名字。当 WinDBG 切换到一个新的工作空间或者退出
前通常也会提示是否要保存工作空间,提示对话框(图 30-8)的标题中包含了工作空间的名字。
图 30-1 切换或者关闭调试会话时 WinDBG 提示是否要保存工作空间
将当前工作空间另存为一个特定的名字,那么便创建了一个命名的工作空间。
30.1.2内容内容
工作空间保存了如下几类信息:
调试会话状态:包括断点,打开的源文件,用户定义的别名( alias)等。
调试器设置:包括符号文件路径,可执行映像文件路径,源文件路径,用 l+/l- 命令设置
的源文件选项,日志文件设置,通过启动内核调试对话框设置内核调试连接设置,最近
一次打开文件对话框所使用的路径,和输出设置等。
WinDBG 图形界面信息: 包括 WinDBG 窗口的标题,是否自动打开反汇编窗口,缺省字
体, WInDBG 窗口在桌面的位置,打开的 WinDBG 子窗口,每个打开窗口的详细信息,
包括位置,浮动状态等,命令窗口的设置,是否显示状态条和工具条,寄存器窗口的定
制信息,源文件窗口的光标位置,变量观察窗口的变量信息等等。
除了以上信息外,命名的工作空间还可以保存调试会话的状态,对于调试转储文件和调试新
创建进程的情况,打开对应的工作空间, WinDBG 可以自动重新开始调试会话。
30.1.3存储存储
WinDBG 缺省使用注册表来保存工作空间设置。其路径为:
HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces
在这个键下通常有四个子健 User 、Kernel 、Dump 和 Explicit (参见图 30-1 ),前三个子
键分别用来保存用户态调试、内核态调试、调试转储文件时使用的缺省工作空间, Explicit 用来
保存命名的工作空间。
3
图 30-1 注册表中保存 WinDBG 工作空间的子键
在以上四个子键下的每个键值对应于一个工作空间,键值名是工作空间的名称,键值值就是
这个工作空间的二进制数据。
WinDBG 支持使用文件来保存工作空间。使用 File 菜单的 Save Workspace to File 功能就能将
当前的工作空间保存为一个 .WEW 文件。这个文件是二进制的,其格式与注册表中的数据是一样
的。
30.1.4应用应用
启动 WinDBG 时可以通过 -W 开关指定要使用的工作空间名称,也可以通过 File 菜单来打开
一个工作空间以显式的加载这个工作空间的设置。
值得说明的是,工作空间中的除了图形界面以外的大多数设置都是以累积方式被应用的。
WinDBG 启动时,它便应用缺省的基础设置,而后加载新的工作空间时, WinDBG 只是加载这个
新工作空间中的特别内容。
30.1.5删除删除
通过 WinDBG 的 File 菜单的 Delete Workspaces 可以删除工作空间。 另一种更快速的方法就是
使用注册表编辑器( regedit)直接删除注册表中上文所述位置的键值。如果要删掉全部,那么就
把 Workspaces 键全部删除。可以不用担心缺省的工作空间删掉会影响 WinDBG 运行,下次使用
时它会自动为缺省工作空间创建新的键值。
30.1.6主题主题
WinDBG 程序目录中的 Themes 子目录中包含了四种经过定制的工作空间设置(主要是窗口
布局),称为主题( Theme)。每个主题配备了一个 .reg 文件和一个 .WEW 文件。将 .reg 文件导入到
注册表或者使用 WinDBG 打开 .WEW 文件( Open Workspace in File )便可以应用对应的主题。读
者可以以这些主题为基础,经过调整,然后保存为自己所喜欢的设置。
30.2 命令命令概览概览
WinDBG 主要是以命令方式工作的,本节我们将概括性的介绍 WinDBG 的三类命令分类:
WinDBG 共支持三类命令:标准命令、元命令和扩展命令。
,然后介绍不同形式的命令行提示符。
4
30.2.1标准标准标准命令命令
标准命令通常是一两个字符( version 除外)或者符号,用来提供适用于各种调试目标的最基
本调试功能。 标准命令是不分大小写的。 以下是根据功能归纳的当前版本 WinDBG 所支持的所有
标准命令:
控制调试目标执行,包括恢复运行的 g 命令、跟踪的 t 命令( trace into )和 p 命令( step
over);
观察和修改寄存器的 r 命令;
观察、编辑和搜索内存数据的 d 命令、 e 命令和 s 命令;
观察栈的 k 命令;
设置和维护断点的 BP(软件断点) 、BA(硬件断点) 、BL(列出所有断点) 和 BC/BD/BE
(清除、禁止和重新启用断点)命令;
显示和控制线程的~命令;
显示进程的 |命令;
显示表达式的 ?命令和显示 C++表达式的 ??命令;
用于汇编的 a 命令和用于反汇编的 u 命令;
显示段选择子的 dg 命令;
执行命令文件的 $命令;
设置调试事件处理方式的 sx 命令;
显示调试器和调试目标版本的 version 命令;
检查符号的 x 命令,搜索符号的 ln 命令,和显示模块列表的 lm 命令;
结束调试会话的 q 命令。
值得说明的是上面某些单字符的命令代表了一系列以这个字符开始的双字符命令,比如 d 命
令后面通常带上第二个字符来指定数据的显示长度,比如 db(按字节显示) 、dd(按双字显示)
等。
在命令行输入一个问号(?)可以显示出一个标准命令的列表和简单介绍。
30.2.2元命令元命令
元命令( Meta-Command )用来提供标准命令没有提供的调试功能,与标准命令一样,元命
令也是内建在调试器引擎或者 WinDBG 程序文件中的。
所有元命令都以一个点( .)开始,所以元命令也被称为点命令( Dot Command )。
按照功能,可以把元命令分成如下几类:
显示或者设置调试会话或者调试器选项,比如用于符号选项的 .symopt,用于符号路径
的.sympath 和 .symfix ,用于源程序文件的 .srcpath、.srcnoise 和.srcfix ,用于扩展命令模块
路径的 .extpath,用于匹配扩展命令的 .extmatch,用于可执行文件的 .exepath,设置反汇编
选项的 .asm,控制表达式评估器的 .expr 命令,等等。
控制调试会话或者调试目标,如重新开始调试会话的 .restart,放弃用户态调试目标(进
程)的.abandon,创建新进程的 .create命令和附加到存在进程的 .attach 命令, 打开转储文
件的 .opendump,分离调试目标的 .detach,用于杀掉进程的 .kill 命令,等等。
管理扩展命令模块,包括加载模块的 .load 命令,卸载用的 .unload 命令和 .unloadall 命令,
显示已经加载模块的 .chain 命令等。
管理调试器日志文件, 如.logfile(显示信息)、.logopen(打开)、.logappend(追加)、.logclose
5
(关闭)。
远程调试,如用于启动 remote.exe 服务的 .remote 命令,启动引擎服务器的 .server,列出
可用服务器的 .servers 命令, 用于向远程服务器发送文件的 .send_file,用于结束远程进程
服务器的 .endpsrv,用于结束引擎服务器的 .endsrv 命令,等等。
控制调试器, 如让调试器睡眠一段时间的 .sleep 命令,唤醒处于睡眠状态的调试器的 .wake
命令,启动另一个调试器来调试当前调试器的 .dbgdbg 命令,等等。
编写命令程序,包括一系列类似 C 语言关键字的命令,
如.if 、.else、.elsif 、.foreach、.do、.while 、.continue、 .catch、.break、.continue、.leave
、.printf 、.block 等。我们将在第 10 节介绍命令程序的编写方法。
显示或者转储调试目标数据,如产生转储文件的 .dump 命令,将原始内存数据写到文件
的.writemem 命令, 显示调试会话时间的 .time 命令, 显示线程时间的 .ttime 命令, 显示任
务列表的 .tlist( task list)命令,以不同格式显示数据的 .fromats 命令,等等。
输入 .help 可以列出所有元命令和每个命令的简单说明。
30.2.3扩展命令扩展命令
扩展命令 (Extension Command )用于扩展某一方面的调试功能。 与标准命令和元命令是内建
在 WinDBG 程序文件中不同,扩展命令是实现在动态加载的扩展模块( DLL )文件中的。
通过 WinDBG 的 SDK,用户可以编写自己的扩展模块和扩展命令。 WinDBG 程序包中包含
了常用的扩展命令模块。并存放在以下几个子目录中:
NT4CHK – 用于 Windows NT 4.0 Checked 版本的扩展模块。
NT4FRE – 用于 Windows NT 4.0 Free 版本的扩展模块。
W2KCHK – 用于 Windows 2000 Checked 版本的扩展模块。
W2KFRE –用于 Windows 2000 Free 版本的扩展模块。
WINXP - 用于 Windows XP 或者更高版本的 Windows 的扩展模块。
WINEXT – 适用所有 Windows 版本的扩展模块。
表 30-1 列出了 WINEXT 和 WINXP 木立中的的扩展些模块的名称和简单描述。
表 30-1 WinDBG 工具包中的扩展命令模块
扩展模块 路径 描述
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 用于调试网络有关驱动程序。
剩余100页未读,继续阅读
donggua209
- 粉丝: 5
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0