为什么.NET不记录StackOverflow异常的堆栈跟踪?

dan*_*dan 6 .net stack-overflow

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        throw new Exception("lol");
    }
}
Run Code Online (Sandbox Code Playgroud)

并从命令行运行exe,我在事件日志中得到两个条目.一个是应用程序错误,表示存在未处理的异常,另一个包含堆栈跟踪,源代码为.NET Runtime.

如果我写这个:

class Program
{
    static void Main(string[] args)
    {
        Recurse4Evr();
    }

    static void Recurse4Evr()
    {
        Recurse4Evr();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只在事件日志中输入一个条目,它表示应用程序错误,并且存在堆栈溢出异常.堆栈跟踪没有第二个条目,所以它基本上没用.

为什么不记录堆栈跟踪?如果我设置DebugDiag并将其附加到我的进程然后存在堆栈溢出,则DebugDiag能够记录堆栈跟踪.显然,堆栈跟踪以某种方式可用于外部世界.如果运行时因为检测到堆栈溢出而终止进程,那么它也知道堆栈是什么.

在具有许多复杂交互的大型应用程序中,通常无法重新创建导致堆栈溢出的条件.在这种情况下,堆栈跟踪是弄清楚发生了什么的唯一方法.为什么微软决定记录这些信息并不重要?是否有合理的设计决策并不明显?

dan*_*dan 1

这显然是不可能的。如果您想要堆栈跟踪以便找到导致应用程序终止的违规代码,则需要附加第 3 方工具,例如 DebugDiag 或 AdsPlus。祝你好运,这些工具基本上没有文档。