如何利用WinDbg进行双机调试转自佘华煜.docx
- 文档编号:26413334
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:11
- 大小:557.28KB
如何利用WinDbg进行双机调试转自佘华煜.docx
《如何利用WinDbg进行双机调试转自佘华煜.docx》由会员分享,可在线阅读,更多相关《如何利用WinDbg进行双机调试转自佘华煜.docx(11页珍藏版)》请在冰豆网上搜索。
如何利用WinDbg进行双机调试转自佘华煜
如何利用WinDbg进行双机调试转自佘华煜
有的时候,系统在崩溃时可能不能生成内存转储文件,这样的原因有一些,详见我撰写的《如何确保系统崩溃时能够生成内存转储文件》一文。
当然,系统挂起而不崩溃的情况也是有的。
在这样各种得不到转储文件的情形下,如何才能才能诊断和调试系统错误呢?
这就要用到双机调试啦。
(对于挂起的系统,还有另外的办法可以采用,我将在日后的文章中进行讨论)
说到双机调试,笔者并不是第一次讨论这个问题了,如果你是笔者的老朋友,相信我搬来博客园之前,你在WinOS技术论坛、ITECN上我的博客里或者新浪博客里应该看见过我的一篇文章《手握利器,直面"蓝脸"》。
这篇文章历时多天完成,于2009年春节期间发表,倾注了我很多心血,因此仅博客访问量就过万,还被合法地、不合法地到处转载……不过啊,这篇文章最后讲解的双机调试,由于篇幅所限,并不是很完善,今天我们就一起来看看双机调试的更多的细节。
其实并不是只有在生成不了转储文件的情形下才能使用双机调试,在任何情况下都是可以使用的,尤其是调试内核问题时,双机调试不必限于转储文件类型,均可获得一切可以获得的信息,相当于完全内存转储了。
而且,双机调试可以调试到系统启动阶段和之后任意时刻的问题,这是内存转储做不到的。
因此只要满足连接条件,将两台机器相连,我们就可以进行双机调试了。
下面我们通过表格比较一下可用的三种连接方式:
连接类型
说明
COM
使用零调制解调器(Null-Modem)线缆,也就是两个头都是母孔的RS232线,通过COM端口连接
1394
利用IEEE1394线缆连接,要求调试机和被调机运行相同版本的至少为WindowsXP的系统
USB2.0
使用一种内置硬件芯片来支持调试的特制USB线缆连接,要求被调机运行的系统至少为WindowsVista
在双机调试中,我们一般选择对硬件和软件复杂度要求最低的COM对接方式进行连接。
当然,目前很多的笔记本计算机并没有再保留COM端口,那就要采取别的方式进行双机调试了。
这样,笔记本用户进行双机调试就显得复杂了许多,所以在能生成内存转储文件的情况下还是尽量分析内存转储比较好。
另外,在双机调试之前,除了连接好线缆,我们还必须在被调机上做一些设置才能让我们进行调试。
下面我们一起看看需要做哪些设置。
其实要做的设置也不难,就是开启系统的调试功能。
鉴于现在WindowsXPServicePack3的支持周期还没有结束,我将讲解XP和Windows7两个系统下的典型配置方式。
(在这里,我们统一设置连接口为COM1口,波特率为115200)
对于WindowsXP,由于启动使用的是boot.ini数据,因此我们可以手动修改C:
\boot.ini文件(假设您的系统装在C盘),在像multi(0)disk(0)rdisk(0)partition
(1)\WINDOWS="MicrosoftWindowsXPProfessional"/fastdetect这样的启动项目后增加参数/debug/debugport=com1/baudrate=115200。
当然,编辑boot.ini之前,您需要显示所有隐藏文件并且取消隐藏受保护的系统文件,而且还需清除该文件的只读属性。
配置好的结果如下图所示(该记事本启用了自动换行,蓝色高亮部分其实在同一行):
除了直接编辑boot.ini,还可以使用msconfig实用程序。
启动msconfig,切换到BOOT.INI选项卡,点击高级按钮,在弹出的对话框中进行如下配置后两次单击确定来退出msconfig即可:
或者,还有一种推荐的命令行方式来设置:
在cmd下键入并执行命令:
bootcfg/debugON/portCOM1/baud115200/ID1
成功后会有如下提示:
这里的/ID开关用于决定对boot.ini中的哪一条启动项进行设置。
可用的启动项可通过执行不带参数的bootcfg命令查看。
更多自定义调试参数的方式请执行bootcfg/debug/?
查询。
说到自定义调试参数,那我也得说说默认的调试参数:
(默认调试参数即借助/debugON参数单纯启用调试而没有配置调试口、波特率时的系统默认调试参数)
系统版本
默认调试参数
WindowsVista之前的Windows系统
如WindowsXP
调试口COM1,波特率19200bps。
WindowsVista及Windows7
调试口COM1,波特率115200bps。
[全局默认设置]
说完了WindowsXP的配置,我们再来说说现行主流系统Windows7的调试配置:
WindowsVista和Windows7下,就没有那么多的方法了。
如果采用Windows自带的工具,就只能使用bcdedit命令了。
Vista之后,启动摒弃了boot.ini的方式,而是读取启动配置数据库。
为了简化操作,我们可以使用默认调试配置,因此我们只需开启调试即可:
在
以管理员身份运行的cmd下键入并执行命令:
(每行一条命令)
bcdedit/bootdebugON
bcdedit/debugON
执行后得到的正确结果如下图所示:
您还可以通过执行bcdedit/dbgsettings命令来查看当前的调试参数设置。
如果您要自定义调试参数,请执行命令bcdedit/dbgsettings/?
获取帮助。
好了,做好了被调机的设置,我们还需做调试机的设置,这样才能进行调试。
由于条件所限,我只能使用我的笔记本计算机作为调试机,将安装在本机上的Windows7家庭普通版虚拟机作为被调机,使用NirSoft的StartBlueScreen程序造成系统崩溃。
接着上面的步骤,此时我们刚刚配置完被调机Windows7家庭普通版,并且尚未重启。
我们接着应该运行调试机上面安装的WinDbg,为了稍后能正确解析堆栈中的函数,我们首先应该点击File–SymbolFilePath…,填入SRV*DownstreamStore*后单击OK(如果是平时调试您自己的程序,或者存有本地Symbol,这里也可填写本地符号文件路径),然后选择File–KernelDebug…,在弹出的KernelDebugging配置对话框中,我们选择COM选项卡,在BaudRate里面填写115200(与被调机调试参数匹配),然后单击确定即可。
本来接下来就是连接零调制解调器线缆,随后重启被调机即可连上进行调试了,可是我们这里是虚拟演示,没有真实的零调制解调器线缆,我们再重启被调机之前、在确定KernelDebugging配置对话框之前,我们还得做一些设置:
(在此列举出来是为了方便有兴趣做一下本实验的人们?
)
●勾选Pipe使用命名管道连接
●勾选Reconnect确保在读/写错误发生时,WinDbg自动断开并重连管道
●在Port字段填入命名管道名称(本例中笔者使用\\.\pipe\eric,具体用法在本文最后解释)
●激活被调机虚拟机窗口(以WindowsVirtualPC为例),点击工具–设置…,在左栏选择COM1(与被调机系统中设置的调试口一致),在右栏选择命名管道并在该字段填入与WinDbg里面一致的管道名称(本例是\\.\pipe\eric),然后确定。
设置好了命名管道之后,我们在WinDbg的KernelDebugging配置对话框中单击确定。
在询问是否SaveWorkSpace的对话框中,我们选择Yes。
然后,WinDbg就等待连接命名管道了。
好了,后面的步骤就跟使用零调制解调器线缆连接的真实案例一样了。
接下来重启被调机。
等待被调机重启并进入系统引导阶段后,WinDbg会连上被调机并在Waitingtoreconnect…状态下出现新的显示:
连上后,我们可以在任意阶段,于WinDbg内使用Ctrl+Break快捷键来中断被调机系统的运行,并配合相应命令进行即时分析。
例如,就在这个启动阶段,我们使用Ctrl+Break快捷键来中断启动过程,我们可以看见启动过程的UI动画也随即停止:
如果要被调机继续运行,键入g并运行或者按下F5键即可。
下面,我们就等待登录系统。
登录系统后,我们使用提升权限的cmd运行NirSoft的系统崩溃软件来模拟一个平时我们见过的0xc5蓝屏,命令是StartBlueScreen0xc50000。
被调机蓝屏后,我们其实看不见以往的蓝屏,但是可以在WinDbg中立即看见捕获的信息,就跟分析内存转储文件一样,我们可以开始以往的分析工作了:
使用!
anaylze-v命令,我们就可以定位出,造成蓝屏的驱动是NirSoftBlueScreenDriver.sys。
这个分析比较简单。
但是值得注意的是,这个bugcheck(即0x000000C5)并不是系统像往常一样根据错误类型自动给出的,而是驱动NirSoftBlueScreenDriver.sys直接向KeBugCheckEx函数传递的参数,这个参数是笔者在利用StartBlueScreen程序时传递给程序的自定义参数,因此借助StartBlueScreen我们可以自定义蓝屏的五个参数。
Demo做到这里就结束了。
在本文的末尾,我给出上文中出现的一些概念的解释和一些过程的原理剖析及说明:
●关于调试所使用的波特率(BaudRate):
可以使用的调试波特率有9600、19200、38400、57600和115200,单位是比特/秒,WinDbg默认的设置是19200bps,系统的默认设置在上文中已经通过表格给出。
从通信的角度解释,波特率是信源每秒钟发出的二进制符号的个数,因此我们在双机调试时,选用越高的波特率就意味着WinDbg中越快的解析速度,但选用的波特率在被调机和调试机间应该匹配。
而且,就算选用最高的115200bps,也没有直接调试本地内存转储文件快,不过可以接近。
●关于命名管道:
命名管道是一个有名字的、实现单向或双向通信的通信管道,可以是进程间的通信,也可以是跨越网络的不同主机间不同进程间的通信。
管道的名称由两部分组成——计算机名和管道名。
标准格式为\\[host_name]\pipe\[pipe_name](方括号内为参数)。
对于同一主机,允许有多个同一命名管道的实例并且可以由不同的进程打开,但是不同的管道都有属于自己的管道缓冲区和自己的通讯环境而互不影响,并且命名管道可以支持多个客户端连接一个服务器端。
对于客户端来说,命名管道可以是\\[host_name]\pipe\[pipe_name]形式,也可以是\\.\pipe\[pipe_name]形式,其中的"."表示本机。
而服务器端由于只能指定本机作为主机名,故只能使用\\.\pipe\[pipe_name]的形式。
上文例子中的eric即为一个[pipe_name]。
另外,在同一主机上,管道名称是唯一的。
一个命名管道一旦被创建就不允许相同名称的管道再被创建。
●关于命名管道的连接与通信方式(WinDbg的Reconnect设置涉及到):
在服务器端第一次创建命名管道后等待连接,当客户端连接成功后服务器端的命名管道就用作通讯用途。
如果需要再次等待连接,服务器端就需要再次打开命名管道(创建一个命名管道的实例)并等待连接。
对于客户端,每次打开命名管道后建立与服务器的连接,然后就可以利用命名管道进行通信,如果需要建立第二个连接则需要再次打开管道和再次建立连接。
●在WindowsVista及其后的Windows系统中,由于不再包含Dr.Watson,故用户模式调试器NTSD已不复存在。
然而,在DebuggingToolsforWindows中,包含了NTSD这一工具。
如果您仍想通过NTSD来生成完整的用户模式转储(fulluser-modedumpFile),请访问:
●调试的方法多种多样,调试器也是多种多样,本文仅为大家提供一种可行的解决办法,而不一定是最优的解决办法。
例如,普通的最终用户遇到的蓝屏问题中,在能生成转储文件的情况下,双机调试就略显复杂和多余了。
●上文给出了虚机的试验方法,大家可以动手做做实验加深对其中过程和原理的理解。
参考资料:
1.《DebuggingHelp》inDebuggingToolsforWindows
2.MSDN-《WindowsDriverKit》
3.MSDN-《如何:
使用命名管道通过网络在进程之间进行通信》
4.CSDN-《怎么用命名管道实现异步通讯》
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 利用 WinDbg 进行 双机 调试 佘华煜