在WebService中获取StackOverflowException(ASP.NET)

时间:2017-07-13 10:38:59

标签: c# asp.net stack-overflow asmx windbg

我有一个名为ECService.asmx的WebService,它包含230多个WebMethods。 当我将这些方法分成几个" asmx"或者注释掉一半代码,StackOverflowException不再发生。

根据MSDN:

  

当执行堆栈因嵌套方法调用过多而溢出时,抛出了StackOverflowException异常。

我很确定我没有任何递归方法。 他们所做的就是在通话时返回一个数据集,这就是全部。

所以我做了一些研究并确信使用任何工具来提取过程的完整用户转换(iisexpress),然后使用windbg工具检查记录在其中的堆栈树。我尝试使用Visual Studio 2017的选项" Debug>捕获完整的userdump。将转储保存为...":

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

Using windbg to solve problems

1 个答案:

答案 0 :(得分:0)

我目前没有可用的.NET堆栈溢出崩溃转储,但这是我的记忆:

!threads命令应该列出.NET线程。如果某个线程上有异常,该线程应在“异常”列中有一个指示符。使用~<number>s切换到该主题,然后使用!clrstack

它也应该在本机端工作,因为.NET异常也是正常的SEH异常。如果使用navtive threads命令~,则应该有一个标有#的线程,表示一个带有异常的线程。如果您看不到,那么它可能是活动线程,因为活动线程指示符.会覆盖异常指示符。在任何情况下,您都应该能够使用~#s切换到具有异常的线程(字面意思是,不用数字替换#)。

堆栈空间是否真的耗尽,应该可以使用!teb命令并查看堆栈基数和堆栈限制。然后将其与堆栈指针(ESP regiser)进行比较。