【发布时间】:2017-07-13 10:38:59
【问题描述】:
我有一个名为 ECService.asmx 的 WebService,其中包含 230 多个 WebMethod。 当我将这些方法分成几个“asmx”或注释掉一半代码时,StackOverflowException 将不再发生。
根据 MSDN:
当执行堆栈因嵌套方法调用过多而溢出时,将引发 StackOverflowException 异常。
我很确定我没有任何递归方法。 他们所做的只是在调用时返回一个数据集,仅此而已。
所以我做了一些研究,并确信使用任何工具来提取进程的完整用户转储 (iisexpress),然后使用 windbg 工具检查其中登录的堆栈树。我尝试使用 Visual Studio 2017 的选项“Debug> Save Dump As...”来捕获完整的用户转储:
kbn
.loadby sos clr
!CLRStack
然后我得到了这个
0:033> !CLRStack
OS Thread Id: 0x584 (33)
Child SP IP Call Site
06b625a8 77a21d3c [FaultingExceptionFrame: 06b625a8]
06b9ef00 77a21d3c [InlinedCallFrame: 06b9ef00]
06b9f540 77a21d3c [InlinedCallFrame: 06b9f540]
06b9f53c 65cce181 DomainNeutralILStubClass.IL_STUB_PInvoke(IntPtr, System.Web.RequestNotificationStatus ByRef)
06b9f540 65c7b892 [InlinedCallFrame: 06b9f540] System.Web.Hosting.UnsafeIISMethods.MgdIndicateCompletion(IntPtr, System.Web.RequestNotificationStatus ByRef)
06b9f574 65c7b892 System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(IntPtr, IntPtr, IntPtr, Int32)
06b9f578 65c7b39f [InlinedCallFrame: 06b9f578]
06b9f670 65c7b39f System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(IntPtr, IntPtr, IntPtr, Int32)
06b9f748 05aeeb10 [ContextTransitionFrame: 06b9f748]
但我几乎没有发现任何与 StackOverflowException 相关的内容。老实说,我已经不知道该做什么了……
我也尝试使用调试诊断工具来捕获完整的转储,但是我设置的规则“所有 IIS/COM+ 相关进程的崩溃规则”从未被触发。我做错了吗?如果我遗漏了什么,我想提供更多信息。
(请原谅,由于业务敏感性,我可能无法包含完整的文件。现在我在一家商业公司实习,经理问我不能通过使用任何机械变通方法来忽略这个问题。)
研究参考:
exception code: 0xc00000fd. Debugging a StackOverflowException
【问题讨论】:
-
tt 自从我使用 SOS 以来已经有一段时间了,但 CLRStack 只会转储当前线程。试试 !EEStack -EE 看看它给了你什么——它会转储所有线程的堆栈跟踪,你应该能够看到哪个方法被自己包裹住了。 docs.microsoft.com/en-us/dotnet/framework/tools/…
-
analyze -v在有问题的线程上设置线程上下文。从那里你可以使用 !CLRStack。 -
@AdamBenson
!EEStack -EE确实像你说的那样转储了所有线程,但我未能识别出有问题的线程。您提供的参考很有帮助,感谢您的快速评论! @LievenKeersmaekers。上面写着FAILURE_FUNCTION_NAME: DomainNeutralILStubClass.IL_STUB_PInvokefull result 所以我想我应该从这里开始调查,不是吗?谢谢!
标签: c# asp.net stack-overflow asmx windbg