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能够记录堆栈跟踪.显然,堆栈跟踪以某种方式可用于外部世界.如果运行时因为检测到堆栈溢出而终止进程,那么它也知道堆栈是什么.
在具有许多复杂交互的大型应用程序中,通常无法重新创建导致堆栈溢出的条件.在这种情况下,堆栈跟踪是弄清楚发生了什么的唯一方法.为什么微软决定记录这些信息并不重要?是否有合理的设计决策并不明显?
这显然是不可能的。如果您想要堆栈跟踪以便找到导致应用程序终止的违规代码,则需要附加第 3 方工具,例如 DebugDiag 或 AdsPlus。祝你好运,这些工具基本上没有文档。
| 归档时间: |
|
| 查看次数: |
853 次 |
| 最近记录: |