【发布时间】:2012-09-22 18:14:46
【问题描述】:
可能重复:
How do I prevent and/or handle a StackOverflowException? (C#)
C# catch a stack overflow exception
我有一个用 C# 编写的相当复杂的应用程序(使用 .NET 2.0)。该程序以高度递归的方式处理大量文件,并且在某些客户端它会遇到堆栈溢出异常。该程序非常复杂,我们甚至无法重现该问题 - 甚至在发生问题的客户那里也无法重现。
显而易见的解决方案是修复导致堆栈溢出的代码,但这似乎不太可能 - 我们的代码库有超过 200 万行代码,它们在内存中创建了一个大型递归数据结构。我们不太可能只是偶然发现问题部分。 (无论如何,短期内不会。)
但是,我们的程序也会备份文件并对正在处理的文件进行更改,如果出现异常,它会将所有内容恢复到原始状态。当堆栈溢出异常发生时,进程只是终止,并且此恢复功能没有机会运行,因为无法捕获堆栈溢出。
所以我的问题是:有没有办法在 .NET 2.0 中捕获堆栈溢出异常。我无法托管 CLR,异常是真正的堆栈溢出,而不是由我们的代码引发。能够做到这一点至少让我能够恢复程序终止之前所做的更改。
编辑:请注意,我很清楚堆栈溢出异常是什么以及它有多严重。我不是在寻找寻找建议的建议——这种情况很少发生。我要做的是在磁盘空间有限的环境中恢复客户端数据当发生。如果我的程序在恢复操作后死机,我可以接受。
【问题讨论】:
-
您能否发布一个您当前正在使用的有问题的代码示例。也许您遇到的只是一个简单的逻辑错误或内存泄漏问题
-
一旦你发现了一个 SO 异常,你打算做什么?您将如何从中恢复?
-
听起来您迫切需要日志记录。我猜你有一些 try-catch 块正在吸收错误,阻止你找到它。如果你有一个堆栈溢出异常,你不能真正忽略它或在代码中更正它,堆栈溢出通常意味着你用掉了太多空间以至于你不能做任何事情,这是一个你必须修复而不是解决的错误。
-
这个 SO 问题的第二个答案可能会有所帮助:stackoverflow.com/questions/107735/…
-
最好是支持原始答案,也许可以在该答案中添加评论以确认其有效,然后将此问题作为该问题的副本关闭。
标签: c# .net exception .net-2.0 stack-overflow