【问题标题】:How to debug: w3wp.exe process was terminated due to a stack overflow (works on one machine but not another)如何调试:w3wp.exe 进程因堆栈溢出而终止(可在一台机器上工作,但不能在另一台机器上工作)
【发布时间】:2011-06-30 12:51:59
【问题描述】:

问题
我有一个 ASP.NET 4.0 应用程序在一台计算机上因堆栈溢出而崩溃,但在另一台计算机上却没有。它在我的开发环境中运行良好。当我将站点移动到生产服务器时,它会引发堆栈溢出异常(在事件日志中看到)并且 w3wp.exe 工作进程死亡并被另一个替换。

到目前为止我已经尝试过什么
作为参考,我使用调试诊断工具尝试确定导致溢出的代码段,但我不确定如何解释它的输出。输出包括在下面。

ASP.NET 网站如何在一台机器上导致堆栈溢出,而在另一台机器上却没有?
经验丰富的领导者表示赞赏。我将在引导我的答案下方发布结果解决方案。

调试输出

应用程序:w3wp.exe 框架版本:v4.0.30319 描述:进程因堆栈溢出而终止。

In w3wp__PID__5112__Date__02_18_2011__Time_09_07_31PM__671__First Chance Stack Overflow.dmp the assembly instruction at nlssorting!SortGetSortKey+25 in C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll from Microsoft Corporation has caused a stack overflow exception (0xC00000FD) when trying to write to memory location 0x01d12fc0 on thread 16
Please follow up with the vendor Microsoft Corporation for C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll
Information:DebugDiag determined that this dump file (w3wp__PID__5112__Date__02_18_2011__Time_09_07_31PM__671__First Chance Stack Overflow.dmp) is a crash dump and did not perform any hang analysis. If you wish to enable combined crash and hang analysis for crash dumps, edit the IISAnalysis.asp script (located in the DebugDiag\Scripts folder) and set the g_DoCombinedAnalysis constant to True.
Entry point   clr!ThreadpoolMgr::intermediateThreadProc 
Create time   2/18/2011 9:07:10 PM 
Function     Arg 1     Arg 2     Arg 3   Source 
nlssorting!SortGetSortKey+25     01115a98     00000001     0651a88c    
clr!SortVersioning::SortDllGetSortKey+3b     01115a98     08000001     0651a88c    
clr!COMNlsInfo::InternalGetGlobalizedHashCode+f0     01115a98     05e90268     0651a88c    
mscorlib_ni+2becff     08000001     0000000f     0651a884    
mscorlib_ni+255c10     00000001     09ed57bc     01d14348    
mscorlib_ni+255bc4     79b29e90     01d14350     79b39ab0    
mscorlib_ni+2a9eb8     01d14364     79b39a53     000dbb78    
mscorlib_ni+2b9ab0     000dbb78     09ed57bc     01ff39f4    
mscorlib_ni+2b9a53     01d14398     01d1439c     00000011    
mscorlib_ni+2b9948     0651a884     01d143ec     7a97bf5d    
System_ni+15bd65     6785b114     00000000     09ed5748    
System_ni+15bf5d     1c5ab292     1b3c01dc     05ebc494    
System_Web_ni+6fb165 
***These lines below are repeated many times in the log, so I just posted one block of them
1c5a928c     00000000     0627e880     000192ba    
1c5a9dce     00000000     0627e7c4     00000000    
1c5a93ce     1b3c01dc     05ebc494     1b3c01dc    
1c5a92e2
.....(repeated sequence from above)
System_Web_ni+16779c     1b338528     00000003     0629b7a0    
System_Web_ni+1677fb     00000000     00000017     0629ac3c    
System_Web_ni+167843     00000000     00000003     0629ab78    
System_Web_ni+167843     00000000     00000005     0629963c    
System_Web_ni+167843     00000000     00000001     0627e290    
System_Web_ni+167843     00000000     0627e290     1a813508    
System_Web_ni+167843     01d4f21c     79141c49     79141c5c    
System_Web_ni+1651c0     00000001     0627e290     00000000    
System_Web_ni+16478d     00000001     01ea7730     01ea76dc    
System_Web_ni+1646af     0627e290     01d4f4c0     672c43f2    
System_Web_ni+164646     00000000     06273aa8     0627e290    
System_Web_ni+1643f2     672d1b65     06273aa8     00000000    
1c5a41b5     00000000     01d4f520     06273aa8    
System_Web_ni+18610c     01d4f55c     0df2a42c     06273f14    
System_Web_ni+19c0fe     01d4fa08     0df2a42c     06273e5c    
System_Web_ni+152ccd     06273aa8     05e9f214     06273aa8    
System_Web_ni+19a8e2     05e973b4     062736cc     01d4f65c    
System_Web_ni+19a62d     06a21c6c     79145d80     01d4f7fc    
System_Web_ni+199c2d     00000002     672695e8     00000000    
System_Web_ni+7b65cc     01d4fa28     00000002     01c52c0c    
clr!COMToCLRDispatchHelper+28     679165b0     672695e8     09ee2038    
clr!BaseWrapper<Stub *,FunctionBase<Stub *,&DoNothing<Stub *>,&StubRelease<Stub>,2>,0,&CompareDefault<Stub *>,2>::~BaseWrapper<Stub *,FunctionBase<Stub *,&DoNothing<Stub *>,&StubRelease<Stub>,2>,0,&CompareDefault<Stub *>,2>+fa     672695e8     09ee2038     00000001    
clr!COMToCLRWorkerBody+b4     000dbb78     01d4f9f8     1a78ffe0    
clr!COMToCLRWorkerDebuggerWrapper+34     000dbb78     01d4f9f8     1a78ffe0    
clr!COMToCLRWorker+614     000dbb78     01d4f9f8     06a21c6c    
1dda1aa     00000001     01b6c7a8     00000000    
webengine4!HttpCompletion::ProcessRequestInManagedCode+1cd     01b6c7a8     69f1aa72     01d4fd6c    
webengine4!HttpCompletion::ProcessCompletion+4a     01b6c7a8     00000000     00000000    
webengine4!CorThreadPoolWorkitemCallback+1c     01b6c7a8     0636a718     0000ffff    
clr!UnManagedPerAppDomainTPCount::DispatchWorkItem+195     01d4fe1f     01d4fe1e     0636a488    
clr!ThreadpoolMgr::NewWorkerThreadStart+20b     00000000     0636a430     00000000    
clr!ThreadpoolMgr::WorkerThreadStart+3d1     00000000     00000000     00000000    
clr!ThreadpoolMgr::intermediateThreadProc+4b     000c3470     00000000     00000000    
kernel32!BaseThreadStart+34     792b0b2b     000c3470     00000000    
NLSSORTING!SORTGETSORTKEY+25In w3wp__PID__5112__Date__02_18_2011__Time_09_07_31PM__671__First Chance Stack Overflow.dmp the assembly instruction at nlssorting!SortGetSortKey+25 in C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll from Microsoft Corporation has caused a stack overflow exception (0xC00000FD) when trying to write to memory location 0x01d12fc0 on thread 16

【问题讨论】:

  • 哇,我们又来了。 0xC00000FD,老兄,你的问题就在这里:System_Web_ni+152ccd 06273aa8 05e9f214 06273aa8
  • 可能重复:stackoverflow.com/questions/5053440/… 也可能重复用户帐户:stackoverflow.com/users/624716/kevin :-)
  • 作为不再存在的问题的完全重复而关闭?!哇!
  • 我要求重新打开这个问题,因为原来的问题现在已经消失了。这不再是一个骗局。我自己在 .NET 4 上遇到了一个非常相似的错误,堆栈溢出异常发生在一个 Web 服务器上,而不是另一个相同的程序集上。
  • 旁注:该站点的存在使得搜索有关实际堆栈溢出的信息非常麻烦。我花了一段时间才找到这个。

标签: asp.net debugging stack-overflow


【解决方案1】:

w3wp.exe 的默认堆栈限制是个笑话。我总是用editbin /stack:9000000 w3wp.exe 提出,应该足够了。首先摆脱堆栈溢出,然后调试任何你想要的。

【讨论】:

  • Server 2003 使用 Windows 文件保护,因此一旦运行 editbin 并且堆栈大小发生更改,Windows 会将文件恢复为原始文件。还有其他方法可以增加堆栈大小而不会出现还原问题吗?
  • 摆脱这个无用的文件保护的东西(有办法绕过它,例如support.microsoft.com/kb/555486)。或者在 Server 2008 上运行您的应用程序,它允许更改 IIS 文件。
  • 如何确定 w3wp.exe 的当前堆栈大小是多少?
  • @Anders,见editbin /headers 输出(size of stack reserve 行)
  • 有这个问题,它是一个堆栈溢出,虽然错误消息并不清楚它是
【解决方案2】:

获取故障转储,针对 Microsoft 的 Debug Diagnostic Tool 运行它并向我们展示结果。

还可以查看http://support.microsoft.com/kb/919789/en-us,它详细解释了所有必要的步骤。

【讨论】:

    【解决方案3】:

    在分析任何内存转储之前,我会尝试两件事。

    1. 在 Web 服务器上安装远程调试工具并尝试以这种方式进行调试。您可以在 Visual Studio 安装 DVD 上找到此工具。
    2. 安装 Elmah。 Elmah 可以添加到正在运行的 ASP.NET 应用程序中以进行日志记录和调试。我可能会先选择这个选项,这是最不痛苦的方法。 http://code.google.com/p/elmah/

    【讨论】:

      【解决方案4】:

      您的应用程序在生产和开发中表现不同的一种可能性可能是代码中的预处理器指令,如#if DEBUG。当您部署到生产环境时,发布版本将具有与调试版本不同的代码段。

      另一种选择是您的应用程序在生产环境中抛出了一个不相关的异常。并且错误处理代码以某种方式以无限函数调用循环结束。您可能想要寻找一个无限循环,该循环具有对自身的函数调用或另一个调用此函数的函数。由于无限 for 或 while 循环,这最终导致无限函数 callig 循环。我为“无限”这个词过分道歉。

      我之前也发生过这种情况,当时我不小心创建了一个属性并将该属性返回到我的属性中。喜欢:

      public string SomeProperty { get { return SomeProperty; } }
      

      此外,如果可能的话,您可以对 global.asax 的 Application_error 函数中的异常进行特殊处理。 使用 server.getlasterror() 获取异常并记录/显示堆栈跟踪。您可能希望对任何innerexceptions 或innerexceptions 或innerexceptions 等执行相同操作。

      您可能已经在做上述事情,但我想提一下以防万一。

      此外,从您的跟踪来看,GetSortKey 中似乎发生了错误。这是你代码中的一个函数吗?如果是这样,那么你无限的自我呼唤可能会从那里开始。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        这个问题有点老了,但我刚刚找到了一种在溢出之前获取应用程序堆栈跟踪的好方法,我想与其他谷歌用户分享:

        1. 当您的 ASP.NET 应用程序崩溃时,一组调试文件被转储到此主文件夹内的“崩溃文件夹”中:

          C:\ProgramData\Microsoft\Windows\WER\ReportQueue

        2. 可以使用 WinDbg 分析这些文件,您可以从以下链接之一下载:

        3. 在您的应用崩溃的同一台机器上安装后,点击文件>打开崩溃转储并选择“崩溃文件夹”中最大的.tmp文件(我的有 180 MB)。比如:

          AppCrash_w3wp.exe_3d6ded0d29abf2144c567e08f6b23316ff3a7_cab_849897b9\WER688D.tmp

        4. 然后,在刚刚打开的命令窗口中运行以下命令:

          .loadby sos clr
          !clrstack
          
        5. 最后,生成的输出将包含溢出前的应用堆栈跟踪,您可以轻松追踪导致溢出的原因。就我而言,这是一种错误的日志记录方法:

          000000dea63aed30 000007fd88dea0c3 Library.Logging.ExceptionInfo..ctor(System.Exception)
          000000dea63aedd0 000007fd88dea0c3 Library.Logging.ExceptionInfo..ctor(System.Exception)
          000000dea63aee70 000007fd88dea0c3 Library.Logging.ExceptionInfo..ctor(System.Exception)
          000000dea63aef10 000007fd88dea0c3 Library.Logging.ExceptionInfo..ctor(System.Exception)
          000000dea63aefb0 000007fd88de9d00 Library.Logging.RepositoryLogger.Error(System.Object, System.Exception)
          000000dea63af040 000007fd88de9ba0 Library.WebServices.ErrorLogger.ProvideFault(System.Exception, System.ServiceModel.Channels.MessageVersion, System.ServiceModel.Channels.Message ByRef)
          

        感谢 Paul White 和他的博文:Debugging Faulting Application w3wp.exe Crashes

        【讨论】:

          猜你喜欢
          • 2011-06-30
          • 1970-01-01
          • 1970-01-01
          • 2017-08-07
          • 1970-01-01
          • 2015-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多