一、序


为什么需要学习排错

诚然,App-V很可能是应用程序部署和使用的趋势,在某种程度上正帮助我们减少应用程序出错的机会,从而减少测试和排错的精力。然而,任何大小的变化都会多多少少地遭受反对和引起疑虑,App-V这些新事物的引入,带来着基础架构的新变化,并需要改变IT和用户部署使用应用程序的观念,这种建议的提出并执行有时不是一件简单的事情,尤其是比较大型的公司, 关于安全你要说服IT Security Team,关于基础架构改变你要和技术主管展示使用的好处,关于支持你要培训IT部门不然出了问题不能总靠你自己去support,关于用户你要改变用户使用观念,关于购买你要说服老板,关于……还有很多关于…… 


对于应用程序的出错,我们有两个可以同时考虑的互不冲突的方向,一个方向是减少出错的机会,使用应用程序虚拟化例如App-V,一是提高出错时排错的能力。这篇文章介绍的是后者。


在目前的基础架构上,我们很多时候面对着蓝屏和传统应用程序报错带来的挑战。关于蓝屏分析,因为网络中的同类文章已经比较多了,这里不再赘述,但会在文章最后分享大拿Eric的精品文章链接给大家参考。这里我们说说应用程序报错的排错。
 

二、实战

 

1.  一些时候,我们会遇到应用程序的报错,但从报错的窗口我们无法知道是什么引起的报错。这是一个上周遇到的case, Outlook联网后就出现报错。


Windows高级排错实战_排错 
 

2.  我们可以让微软的 User Mode Process Dumper 出手

除了Windows 蓝屏故障以外,很多应用程序进程异常关闭或停止响应的软件故障也可以通过分析转储文件加以排查。

Windows 没有直接提供为应用程序保存转储文件的功能,但我们可以在微软官方网站下载 User Mode Process Dumper


http://www.microsoft.com/downloads/details.aspx?FamilyID=E089CA41-6A87-40C8-BF69-28AC08570B7E

 

3. 为异常关闭的进程创建 .Dmp 文件

1) 从 Program Files\Debuggers\Userdump 文件夹运行 Userdump 工具中包括的 Setup.exe 程序。此程序会安装内核模式驱动程序(Userdump.sys 文件),还会在“控制面板”中创建 Process Dump(进程转储)图标。

2) 在“控制面板”中,双击 Process Dump(进程转储),然后在 Exception Monitoring(异常监视)选项卡上单击“新建”,以向“监视器”列表添加适当的程序名称(例如,Mtx.exe 或 Dllhost.exe),然后单击“确定”。

3) 在“监视器”框中,单击程序名称,然后单击“规则”。现在,您可以选择为该程序启动 Userdump.exe 的错误类型,例如“访问冲突 (c0000005)”。当 Mtx.exe 或 Dllhost.exe 生成访问冲突时,Userdump.exe 会首先启动,然后在 %SystemRoot% 文件夹中创建转储文件 (.dmp)。通过分析此.dmp 文件,您或许能够隔离Winlogon 访问冲突错误的原因。

http://support.microsoft.com/kb/241215/zh-cn


在这里,我们新建Outlook.exe

 

Windows高级排错实战_Windows_02


4. 当你再模拟出错的时候,Dump文件会生成并放置于你设定的文件夹中。

 

Windows高级排错实战_高级_03

 

5. 在WinDbg 调试程序中能够打开并分析这样创建的用户转储,以便确定故障的原因.

启动WinDbg,在 File 菜单中,单击 Open Crash Dump,并选择此故障转储文件。

WinDbg download: http://www.microsoft.com/whdc/DevTools/Debugging/debugstart.mspx


我键入常用的分析命令  !analyze -v

Windows高级排错实战_排错_04

 

6. 这个例子并不是一个很明显找出root cause的例子,运气好的好可能一下就找分析出来了,可惜比较多Symbol没有找到,继续分析下去有些困难,但是并不妨碍我们使用搜索工具寻找Tips先去测试下.


Windows高级排错实战_排错_05

7. 建议用户将Out of Office里面的设置进行更改,报错不见了。原来就是这个问题,问题解决了。

8.  我们也可以为挂起进程创建 .Dmp 文件

1) 从 Program Files\Debuggers\Userdump 文件夹运行 Userdump 工具中包括的 Setup.exe 程序。

2) 当该程序挂起时,请在命令提示符处键入 userdump PID 命令,其中 PID 是挂起程序的进程 ID。要获取程序的 PID,请打开任务管理器,然后单击“进程”选项卡。

3) 运行 userdump PID 命令时,会生成 .dmp 文件,使用该文件可以通过程序(例如 WinDBG)执行总结调试。

 

三、Tips

使用WinDbg运气好的话,我们第一次就可以看到问题所在 
 
例如这个是和声音有关的蓝屏问题

Windows高级排错实战_排错_06

但是有时运气不好的话,内存池被破坏,我们需要二次分析

内存池破坏错误通常发生于一个驱动程序遭受了缓冲区溢出,大多为下溢,也有可能是上溢。内存池破坏引起的崩溃原则上是不可调试的,因为系统崩溃发生于破坏的数据被引用之时,而不是数据被破坏之时。


1、运行“verifier.exe”,您会看见“驱动程序验证程序管理器”向导;
2、选择第二项——“创建自定义设置(供程序开发人员使用)”,然后点击“下一步”;
3、选择第二项——“从一个完整的列表选择单个设置”,并点击“下一步”;
4、仅选中第一项——“特殊池”前面的复选框,进入下一步;
5、选择第三项——“自动选择这台计算机上安装的所有驱动程序”,点击“完成”;
6、重新启动系统;
7、尝试再次引发同样的崩溃;
8、再次分析内存转储文件。


原理解释:通过这些步骤将启用特殊内存池,被检验的所有驱动程序对于略小于一个页面大小的缓冲区申请都将使用特殊内存池,不而是使用一般情形下的换页或非换页内存池。从特殊内存池中分配的缓冲区被夹在两个无效页面之间。因此,对于小于一个页面大小的缓冲区的溢出,系统在溢出发生时就会检测到,因为它导致了在缓冲区之后的无效页面发生了页面错误,也就是pagefault。那么,再次崩溃时,将不可调试的转为可调试的了,而且运气好的话能够看见Windbg直接指出引起崩溃的驱动。

 

四、参考文献 

关于WinDbg的使用,文章比较多,可以参考下大拿Eric的文章

手握利器,直面“蓝脸”!
http://bbs.winos.cn/thread-55125-1-1.html