当引发`System.StackOverflowException`时如何找出最外层的堆栈?

时间:2017-06-09 23:37:28

标签: c# visual-studio

在Visual Studio 2015 for C#中,我调试了一个程序。调试器暂停某处并引发System.StackOverflowException

  

mscorlib.dll中出现未处理的“System.StackOverflowException”类型异常

这意味着正在进行无限递归。

我想找出最初调用哪个方法然后导致异常,所以我转向调用堆栈窗口,但是有很多堆栈,最多的堆栈已被截断在Call Stack窗口之外:

  

...
  Visual Studio支持的最大堆栈帧数   已超出。

  • System.StackOverflowException发生时,是否有某种方法可以找出最多的堆栈?

  • 是否有某种方法可以在System.StackOverflowException被引发之前限制最大堆栈帧数,以便所有堆栈帧都可以显示在“调用堆栈”窗口中?

感谢。

2 个答案:

答案 0 :(得分:2)

  

有没有办法限制之前的最大堆栈帧数   引发System.StackOverflowException,以便所有堆栈帧   可以在Call Stack窗口中显示吗?

临时黑客攻击:使堆叠框架变小,直到看到原因为止。然后将大小恢复为默认值。没有项目设置,但这个老技巧可能仍然有效:

EDITBIN.EXE /STACK:<stacksize> file.exe
  

有什么方法可以找出最多的堆栈   System.StackOverflowException发生了吗?

一种方法是使用Trace或Debug类将所有调用的日志记录添加到递归函数函数。调用此函数“Cursed()”如果代码中有10个位置调用“Cursed()”,则在强调之前为每个添加一个跟踪:

Trace.WriteLine("Foo calling Cursed()");
... 
Trace.WriteLine("Bar calling Cursed()");

您可以添加所需的任何变量。

您可以在support.microsoft.com上看到如何使用Trace和Debug,“如何在Visual C#中跟踪和调试” - https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

如果你查看调试或跟踪输出,你会看到哪些函数和值触发了无限递归。

添加更多日志记录,断言,条件断点以缩小范围。

答案 1 :(得分:0)

您可以使用我的Runtime Flow工具(30天试用版)运行程序,并且应该能够在StackOverflowException之前查看所有方法调用。