1

我创建了一个 ASP.NET MVC 应用程序,它有一个附加到PreApplicationStartMethodAttribute的初始化程序。初始化时,将实例化一个集合,该集合实现了我定义的接口。当我实例化此集合时,w3wp.exe 崩溃,事件日志中出现以下两个难以理解的条目:

Faulting application name: w3wp.exe, version: 7.5.7600.16385, time stamp: 0x4a5bd0eb
Faulting module name: clr.dll, version: 4.0.30319.1, time stamp: 0x4ba21eeb
Exception code: 0xc00000fd
Fault offset: 0x0000000000001177
Faulting process id: 0x1348
Faulting application start time: 0x01cb0224882f4723
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: c6a0941e-6e17-11df-864d-000acd16dcdb

和:

Fault bucket , type 0
Event Name: APPCRASH
Response: Not available
Cab Id: 0

Problem signature:
P1: w3wp.exe
P2: 7.5.7600.16385
P3: 4a5bd0eb
P4: clr.dll
P5: 4.0.30319.1
P6: 4ba21eeb
P7: c00000fd
P8: 0000000000001177
P9: 
P10: 

Attached files:

These files may be available here:


Analysis symbol: 
Rechecking for solution: 0
Report Id: c6a0941e-6e17-11df-864d-000acd16dcdb
Report Status: 0

如果我删除集合的实例化,应用程序将正常启动。如果我离开实例化,w3wp 会崩溃。如果我修改接口,w3wp 仍然崩溃。我已经尝试了所有我能想出的关于保持实例化但以不同方式做其他事情的主题的变体,但 w3wp 仍然崩溃。

我最大的问题是我完全不知道为什么 w3wp 会崩溃。这不是 StackOverflowException 或任何类似的具体东西,我得到的只是上面引用的不智能的垃圾。

我尝试使用DebugDiagIISState来调试 w3wp 进程,但 DebugDiag 仅可用于 x64 中的转储后分析(我在 Windows 7 x64 上运行,因此 w3wp 进程是 64 位的)并且 IISStat 说当我尝试运行它时:

D:\Programs\iisstate>IISState.exe -p 9204 -d
Symbol search path is: SRV*D:\Programs\iisstate\symbols*http://msdl.microsoft.com/download/symbols

IISState is limited to processes associated with IIS.
If you require a generic debugger, please use WinDBG or CDB.
They are available for download from http://www.microsoft.com/ddk/debugging.
This error may also occur if a debugger is already attached to the process
being checked.

Incorrect Process Attachment

我已经仔细检查了 10 次我的 w3wp 进程的进程 ID 是否正确。我怀疑 IISState 也只能调试 x86 进程。在应用程序的任何地方设置断点绝对没有任何作用。一旦请求从浏览器到达 IIS,断点就不会被命中,w3wp 就会崩溃。在 Visual Studio 2010 中使用 F5 启动应用程序或启动另一个应用程序以启动并运行 w3wp 进程,然后将 VS2010 调试器附加到它,然后访问出现故障的应用程序没有帮助。

我还尝试按照KB-911816中的说明添加 HTTP 模块,并将其添加到我的web.config文件中:

<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="true" />
  </runtime>
</configuration>

不用说,这完全没有区别。所以我无法调试 w3wp 进程,无法从中提取任何信息并完成垃圾转储到我的事件日志中。如果有人对如何调试此问题有任何想法,请告诉我!

4

2 回答 2

1

我将回答我自己的问题只是为了结束,尽管我意识到这不是解决可能导致 W3WP 崩溃的各种问题的唯一且唯一的解决方案。

我的集合是根据RouteTable.Routes可能引发异常的集合进行初始化的(可能是因为在 ASP.NET 生命周期的早期阶段还没有被初始化)。将与的沟通推迟RouteTable.Routes到稍后阶段解决了问题。

虽然这不是一个适用于所有人的解决方案,但它对我有用,而且我发现这个问题非常模糊,我会把它留给任何人评论和回答,因为我发现没有关于这个问题的现有帖子任何地方,所以它可能在未来有很好的参考。

于 2011-05-09T10:51:15.197 回答
0

在最新的 Windows 调试工具中使用 ADplus.exe 来捕获故障转储。然后转储分析应该向您显示导致崩溃的原因,

http://www.microsoft.com/whdc/devtools/debugging/default.mspx

http://www.microsoft.com/downloads/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en

版本 6.12.2.633 是必须的,因为它仅包含 adplus.exe 的工作副本(请注意,您不应使用 adplus.vbs)。

于 2010-06-05T12:38:22.577 回答