如果我這樣寫:爲什麼.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