在Visual Studio 2015 for C#中,我调试了一个程序。调试器暂停某处并引发System.StackOverflowException
:
mscorlib.dll中出现未处理的“System.StackOverflowException”类型异常
这意味着正在进行无限递归。
我想找出最初调用哪个方法然后导致异常,所以我转向调用堆栈窗口,但是有很多堆栈,最多的堆栈已被截断在Call Stack窗口之外:
...
Visual Studio支持的最大堆栈帧数 已超出。
在System.StackOverflowException
发生时,是否有某种方法可以找出最多的堆栈?
是否有某种方法可以在System.StackOverflowException
被引发之前限制最大堆栈帧数,以便所有堆栈帧都可以显示在“调用堆栈”窗口中?
感谢。
答案 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之前查看所有方法调用。