如果我这样写:为什么.NET不为StackOverflow异常记录堆栈跟踪?
class Program
{
static void Main(string[] args)
{
throw new Exception("lol");
}
}
,并运行在命令行的EXE,我得到了我的事件日志中的两个项目。一个是应用程序错误,表示存在未处理的异常,另一个包含堆栈跟踪,源为.NET运行时。
如果我这样写:
class Program
{
static void Main(string[] args)
{
Recurse4Evr();
}
static void Recurse4Evr()
{
Recurse4Evr();
}
}
我只得到我的事件日志,它说应用程序错误的一个条目,并且有一个堆栈溢出异常。堆栈跟踪没有第二个条目,所以它基本上没用。
为什么不记录堆栈跟踪?如果我设置DebugDiag并将其附加到我的进程,然后出现堆栈溢出,DebugDiag可以记录堆栈跟踪。很显然,堆栈跟踪以某种方式可用于外部世界。如果运行时正在终止进程,因为它检测到了堆栈溢出,那么它也知道堆栈是什么。
在有许多复杂交互的大型应用程序中,通常不可能重新创建导致堆栈溢出的条件。在这种情况下,堆栈跟踪是了解发生情况的唯一方法。为什么微软决定记录这些信息并不重要?有没有一个合理的设计决定不明显?
我的猜测是生成堆栈跟踪进程需要函数调用,因为堆栈溢出而无法工作。调试器通过能够使用自己的数据结构和(有希望)健康的堆栈来遍历堆栈。 – siride
这是一个很好的问题!我不知道它是否与检测堆栈溢出的方式有关......在.Net 2.0之后,似乎你也无法捕获它,所以它看起来好像是按照一组特殊的规则来玩。 –
[C#捕获堆栈溢出异常]的可能重复(http://stackoverflow.com/questions/1599219/c-catch-a-stack-overflow-exception) – balexandre