问题简述
客户的一台测试服务器出现IIS进程无法启动的现象。Windows事件查看器给出如下信息:
现场已经检查过IIS相关配置信息,没有发现问题。另外,也使用过aspnet_regiis.exe来重新注册,但仍然不能解决问题。
初步分析
仔细检查Windows事件查看器给出的信息,基本都是连续5次警告后,接着一个错误。警告信息如下:
这说明是IIS连续5次都未能为应用程序池”DefaultAppPool”成功创建w3wp进程,于是自动禁用了应用程序池。通过EventID=5022可以检索到更多信息:
http://technet.microsoft.com/en-us/library/cc735004(WS.10).aspx
在这个网页中,指示微软提供了一个Err.exe工具,可以查看错误号的具体含义:
1. 下载地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=985
2. Err工具相关说明:http://blogs.msdn.com/b/astebner/archive/2008/06/17/8611734.aspx
Ok,首先通过查看事件的详细信息可以得到具体的错误号(0x80070002):
接着就用这个Err工具来查看错误号的具体含义:
从以上信息可初步推断,FileNotFound是最可能的问题原因。
问题确认
既然怀疑的方向是FileNotFound,那么就该确认究竟是什么文件不能被找到?这就要使用ProcMon工具了(Sysinternals著名的系列工具之一)。
运行ProcMon,先仅选中Show File System Activity。然后尝试登录Portal,复现w3wp无法启动的现象,从文件跟踪过程中找到与w3wp有关的一段信息:
有趣,似乎是要用一个aqDebuggerWrapper6x64.exe的程序来启动w3wp.exe?
再次重现问题,这次我们同时启用ProcMon的Show Registry Activity:
Ok,至此问题已经清楚,原来是启用了ImageFileExecutionOptions调试功能,该功能允许启动任意一个程序时将控制权转由另外一个程序来执行。通常,这个功能被调试器所用。检查C:\Windows\System32下,并无aqDebuggerWrapper6x64.exe程序,难怪报错FileNotFound(0x80070002)。
经了解,原来这台机器上刚安装过一个AQTime 6.2的分析工具,但使用时总是出现AV错误,所以又被卸掉了。看来,就是在卸载过程中出现了异常,在注册表中还残留了一些与AQTime相关的信息,导致w3wp启动时转由AQTime调试器来执行,而AQTime调试器已经被卸掉了,所以w3wp无法启动。
总结
分析这个案例有两个收获:
- 找到一个Err.exe工具
这个工具可用于查找微软底层程序报出的错误号的具体含义,很有用 - 了解到注册表ImageFileExecutionOptions控制的调试功能
以前也接触过,但略过去了。这次细致研究了一下,发现的确是一个很有用的特性。例如,可以利用这个功能在w3wp启动阶段挂windbg或Visual Studio调试器。
参考文章如下:
http://msdn.microsoft.com/en-us/library/a329t4ed(v=vs.71).aspx
http://blogs.technet.com/b/marcelofartura/archive/2007/08/09/how-to-attach-a-debugger-from-the-creation-time-of-the-worker-process-w3wp-exe.aspx
http://mvolo.com/blogs/serverside/archive/2007/05/19/Troubleshooting-IIS7-503-_2200_Service-unavailable_2200_-errors-with-startup-debugging.aspx