我有一个用 C# 编写的相当复杂的应用程序(使用 .NET 2.0)。该程序以高度递归的方式处理大量文件,并且在某些客户端它会遇到堆栈溢出异常。该程序非常复杂,我们甚至无法重现问题——甚至在发生问题的客户那里也无法重现。
显而易见的解决方案是修复导致堆栈溢出的代码,但这似乎不太可能——我们的代码库有超过 200 万行代码,它们在内存中创建了一个大型递归数据结构。我们不太可能只是偶然发现问题部分。(无论如何,短期内不会。)
但是,我们的程序也会备份文件并对正在处理的文件进行更改,如果出现异常,它会将所有内容恢复到原始状态。当发生堆栈溢出异常时,进程将终止,并且此恢复功能没有机会运行,因为无法捕获堆栈溢出。
所以我的问题是:有没有办法在 .NET 2.0 中捕获堆栈溢出异常。我无法托管 CLR,异常是真正的堆栈溢出,而不是由我们的代码引发。能够做到这一点至少让我能够恢复程序终止之前所做的更改。
编辑:请注意,我很清楚堆栈溢出异常是什么以及它有多严重。我不是在寻找寻找建议的建议——这种情况很少发生。我要做的是在发生这种情况时在磁盘空间有限的环境中恢复客户端数据。如果我的程序在恢复操作后死机,我可以接受。