




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何利用 WinDbg 进行双机调试 转自佘华煜有的时候,系统在崩溃时可能不能生成内存转储文件,这样的原因有一些,详见我撰写的如何确保系统崩溃时能够生成内存转储文件一文。当然,系统挂起而不崩溃的情况也是有的。在这样各种得不到转储文件的情形下,如何才能才能诊断和调试系统错误呢?这就要用到双机调试啦。(对于挂起的系统,还有另外的办法可以采用,我将在日后的文章中进行讨论) 说到双机调试,笔者并不是第一次讨论这个问题了,如果你是笔者的老朋友,相信我搬来博客园之前,你在WinOS技术论坛、ITECN上我的博客里或者新浪博客里应该看见过我的一篇文章手握利器,直面蓝脸。这篇文章历时多天完成,于2009年春节期间发表,倾注了我很多心血,因此仅博客访问量就过万,还被合法地、不合法地到处转载不过啊,这篇文章最后讲解的双机调试,由于篇幅所限,并不是很完善,今天我们就一起来看看双机调试的更多的细节。 其实并不是只有在生成不了转储文件的情形下才能使用双机调试,在任何情况下都是可以使用的,尤其是调试内核问题时,双机调试不必限于转储文件类型,均可获得一切可以获得的信息,相当于完全内存转储了。而且,双机调试可以调试到系统启动阶段和之后任意时刻的问题,这是内存转储做不到的。因此只要满足连接条件,将两台机器相连,我们就可以进行双机调试了。下面我们通过表格比较一下可用的三种连接方式: 连接类型说明COM使用零调制解调器(Null-Modem)线缆,也就是两个头都是母孔的RS232线,通过COM端口连接1394利用IEEE 1394线缆连接,要求调试机和被调机运行相同版本的至少为Windows XP的系统USB 2.0使用一种内置硬件芯片来支持调试的特制 USB 线缆连接,要求被调机运行的系统至少为Windows Vista在双机调试中,我们一般选择对硬件和软件复杂度要求最低的 COM 对接方式进行连接。当然,目前很多的笔记本计算机并没有再保留 COM 端口,那就要采取别的方式进行双机调试了。这样,笔记本用户进行双机调试就显得复杂了许多,所以在能生成内存转储文件的情况下还是尽量分析内存转储比较好。另外,在双机调试之前,除了连接好线缆,我们还必须在被调机上做一些设置才能让我们进行调试。下面我们一起看看需要做哪些设置。 其实要做的设置也不难,就是开启系统的调试功能。鉴于现在 Windows XP Service Pack 3 的支持周期还没有结束,我将讲解 XP 和 Windows 7 两个系统下的典型配置方式。(在这里,我们统一设置连接口为 COM1 口,波特率为115200) 对于 Windows XP,由于启动使用的是 boot.ini 数据,因此我们可以手动修改 C:boot.ini 文件(假设您的系统装在 C 盘),在像 multi(0)disk(0)rdisk(0)partition(1)WINDOWS=Microsoft Windows XP Professional /fastdetect 这样的启动项目后增加参数 /debug /debugport=com1 /baudrate=115200。当然,编辑 boot.ini 之前,您需要显示所有隐藏文件并且取消隐藏受保护的系统文件,而且还需清除该文件的只读属性。配置好的结果如下图所示(该记事本启用了自动换行,蓝色高亮部分其实在同一行): 除了直接编辑 boot.ini,还可以使用 msconfig 实用程序。启动 msconfig,切换到 BOOT.INI 选项卡,点击 高级 按钮,在弹出的对话框中进行如下配置后两次单击 确定 来退出 msconfig 即可: 或者,还有一种推荐的命令行方式来设置: 在 cmd 下键入并执行命令:bootcfg /debug ON /port COM1 /baud 115200 /ID 1 成功后会有如下提示: 这里的 /ID 开关用于决定对 boot.ini 中的哪一条启动项进行设置。可用的启动项可通过执行不带参数的 bootcfg 命令查看。更多自定义调试参数的方式请执行 bootcfg /debug /? 查询。 说到自定义调试参数,那我也得说说默认的调试参数:(默认调试参数即借助 /debug ON 参数单纯启用调试而没有配置调试口、波特率时的系统默认调试参数) 系统版本默认调试参数Windows Vista 之前的 Windows 系统 如 Windows XP调试口 COM1,波特率 19200 bps。Windows Vista 及 Windows 7调试口 COM1,波特率 115200 bps。 全局默认设置说完了 Windows XP 的配置,我们再来说说现行主流系统 Windows 7 的调试配置: Windows Vista 和 Windows 7 下,就没有那么多的方法了。如果采用 Windows 自带的工具,就只能使用 bcdedit 命令了。Vista 之后,启动摒弃了 boot.ini 的方式,而是读取启动配置数据库。为了简化操作,我们可以使用默认调试配置,因此我们只需开启调试即可: 在以管理员身份运行的 cmd 下键入并执行命令:(每行一条命令) bcdedit /bootdebug ON bcdedit /debug ON 执行后得到的正确结果如下图所示: 您还可以通过执行 bcdedit /dbgsettings 命令来查看当前的调试参数设置。如果您要自定义调试参数,请执行命令 bcdedit /dbgsettings /? 获取帮助。 好了,做好了被调机的设置,我们还需做调试机的设置,这样才能进行调试。 由于条件所限,我只能使用我的笔记本计算机作为调试机,将安装在本机上的 Windows 7 家庭普通版虚拟机作为被调机,使用 NirSoft 的 StartBlueScreen 程序造成系统崩溃。 接着上面的步骤,此时我们刚刚配置完被调机 Windows 7 家庭普通版,并且尚未重启。我们接着应该运行调试机上面安装的 WinDbg,为了稍后能正确解析堆栈中的函数,我们首先应该点击 File Symbol File Path,填入 SRV*DownstreamStore*/download/symbols 后单击 OK(如果是平时调试您自己的程序,或者存有本地 Symbol,这里也可填写本地符号文件路径),然后选择 File Kernel Debug,在弹出的 Kernel Debugging 配置对话框中,我们选择 COM 选项卡,在 Baud Rate 里面填写 115200(与被调机调试参数匹配),然后单击 确定 即可。本来接下来就是连接零调制解调器线缆,随后重启被调机即可连上进行调试了,可是我们这里是虚拟演示,没有真实的零调制解调器线缆,我们再重启被调机之前、在确定 Kernel Debugging 配置对话框之前,我们还得做一些设置:(在此列举出来是为了方便有兴趣做一下本实验的人们 J) 勾选 Pipe 使用命名管道连接 勾选 Reconnect 确保在读/写错误发生时,WinDbg 自动断开并重连管道 在 Port 字段填入命名管道名称(本例中笔者使用 .pipeeric,具体用法在本文最后解释) 激活被调机虚拟机窗口(以 Windows Virtual PC 为例),点击 工具 设置, 在左栏选择 COM1(与被调机系统中设置的调试口一致),在右栏选择 命名管道 并在该字段填入与 WinDbg 里面一致的管道名称(本例是 .pipeeric),然后 确定。设置好了命名管道之后,我们在 WinDbg 的 Kernel Debugging 配置对话框中单击 确定。在询问是否 Save WorkSpace 的对话框中,我们选择 Yes。然后,WinDbg 就等待连接命名管道了。好了,后面的步骤就跟使用零调制解调器线缆连接的真实案例一样了。 接下来重启被调机。等待被调机重启并进入系统引导阶段后,WinDbg 会连上被调机并在 Waiting to reconnect 状态下出现新的显示: 连上后,我们可以在任意阶段,于 WinDbg 内使用 Ctrl+Break 快捷键来中断被调机系统的运行,并配合相应命令进行即时分析。例如,就在这个启动阶段,我们使用 Ctrl+Break 快捷键来中断启动过程,我们可以看见启动过程的 UI 动画也随即停止: 如果要被调机继续运行,键入 g 并运行或者按下 F5 键即可。下面,我们就等待登录系统。登录系统后,我们使用提升权限的 cmd 运行 NirSoft 的系统崩溃软件来模拟一个平时我们见过的 0xc5 蓝屏,命令是 StartBlueScreen 0xc5 0 0 0 0。被调机蓝屏后,我们其实看不见以往的蓝屏,但是可以在 WinDbg 中立即看见捕获的信息,就跟分析内存转储文件一样,我们可以开始以往的分析工作了: 使用 !anaylze -v 命令,我们就可以定位出,造成蓝屏的驱动是 NirSoftBlueScreenDriver.sys。这个分析比较简单。但是值得注意的是,这个 bugcheck (即 0x000000C5)并不是系统像往常一样根据错误类型自动给出的,而是驱动 NirSoftBlueScreenDriver.sys 直接向 KeBugCheckEx 函数传递的参数,这个参数是笔者在利用 StartBlueScreen 程序时传递给程序的自定义参数,因此借助 StartBlueScreen 我们可以自定义蓝屏的五个参数。 Demo 做到这里就结束了。在本文的末尾,我给出上文中出现的一些概念的解释和一些过程的原理剖析及说明: 关于调试所使用的波特率(Baud Rate):可以使用的调试波特率有9600、 19200、38400、57600 和 115200,单位是 比特/秒,WinDbg 默认的设置是 19200 bps,系统的默认设置在上文中已经通过表格给出。从通信的角度解释,波特率是信源每秒钟发出的二进制符号的个数,因此我们在双机调试时,选用越高的波特率就意味着 WinDbg 中越快的解析速度,但选用的波特率在被调机和调试机间应该匹配。而且,就算选用最高的 115200 bps,也没有直接调试本地内存转储文件快,不过可以接近。 关于命名管道:命名管道是一个有名字的、实现单向或双向通信的通信管道,可以是进程间的通信,也可以是跨越网络的不同主机间不同进程间的通信。管道的名称由两部分组成计算机名和管道名。标准格式为 host_namepipepipe_name(方括号内为参数)。对于同一主机,允许有多个同一命名管道的实例并且可以由不同的进程打开,但是不同的管道都有属于自己的管道缓冲区和自己的通讯环境而互不影响,并且命名管道可以支持多个客户端连接一个服务器端。对于客户端来说,命名管道可以是 host_namepipepipe_name 形式,也可以是 .pipepipe_name 形式,其中的.表示本机。而服务器端由于只能指定本机作为主机名,故只能使用 .pipepipe_name 的形式。上文例子中的 eric 即为一个 pipe_name。另外,在同一主机上,管道名称是唯一的。一个命名管道一旦被创建就不允许相同名称的管道再被创建。 关于命名管道的连接与通信方式(WinDbg 的 Reconnect 设置涉及到):在服务器端第一次创建命名管道后等待连接,当客户端连接成功后服务器端的命名管道就用作通讯用途。如果需要再次等待连接,服务器端就需要再次打开命名管道(创建一个命名管道的实例)并等待连接。对于客户端,每次打开命名管道后建立与服务器的连接,然后就可以利用命名管道进行通信,如果需要建立第二个连接则需要再次打开管道和再次建立连接。 在 Windows Vista 及其后的 Windows 系统中,由于不再包含 Dr. Watson,故用户模式调试器 NTSD 已不复存在。然而,在 Debugging Tools for Windows 中,包含了 NTSD 这一工具。如果您仍想通过 NTSD 来生成完整的用户模式转储(full user-mode dump file),请访问: /kb/951018/en-us 调试的方法多
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 放射性废物防护管理制度与岗位职责
- 娄底节日活动策划方案
- 如何做开店活动策划方案
- 金融投资峰会策划方案流程
- 房地产开发招投标管理制度流程
- 季度公司团建策划方案
- 学校活动水果杯活动方案
- 学校茶社活动方案
- 学校调酒活动方案
- 学校跨年班级活动方案
- 清华大学语文试题及答案
- 陆游旅游攻略
- 2022爱德华EST3系统SDU软件激活设备
- 2025年上半年山东济宁市任城区事业单位招聘工作人员(卫生类)161人易考易错模拟试题(共500题)试卷后附参考答案
- 股骨头坏死中医护理常规
- 血小板减少课件
- 2024《突发事件应对法》及其应用案例知识培训
- 233KWh 定制户外一体柜储能系统项目技术方案
- 12J12无障碍设施图集
- 小学生讲诚信班会课件
- 小学总务主任述职报告
评论
0/150
提交评论