在.NET中记录StackOverflowException

dan*_*dan 25 .net c# asp.net

我最近在我的.NET应用程序(asp.net网站)中有一个堆栈溢出异常,我知道因为它出现在我的EventLog中.我知道无法捕获或处理StackOverflow异常,但有没有办法在它杀死你的应用程序之前记录它?我有100k行代码.如果我知道堆栈跟踪,或者只是堆栈跟踪的一部分,我可以追踪无限循环/递归的来源.但是没有任何有用的诊断信息,看起来它需要进行大量的猜测和测试.

我想在我的应用程序域(在Global.asax中)建立一个未处理的异常处理,但似乎并没有执行,这是有道理的,如果一个堆栈溢出应该终止,不能运行任何catch/finally块.

有没有办法记录这些,或者是否有一些我可以启用的秘密设置,当应用程序崩溃时将堆栈帧保存到磁盘?

vcs*_*nes 7

您最好的选择是使用ADPlus.

Windows NT内核调试团队有一篇很好的博客文章,介绍如何用它捕获CLR异常.关于它的不同配置选项有很多细节.

ADPlus将监控应用程序.您可以指定它在崩溃模式下运行,这样您就可以告诉ADPlus在发生StackOverflowException时正确进行内存转储.

一旦你有内存转储,你可以使用WinDbg和像Psscor这样的托管调试扩展来查看堆栈溢出期间发生了什么.


Lia*_*ian 2

您可以尝试在应用程序的关键点记录消息,并删除日志消息流中断的部分。

然后,尝试使用单元测试将其复制到该代码部分。

据我所知,跟踪堆栈溢出错误的唯一方法是让中间层拍摄正在运行的代码的快照并将其写出来。这总是会对性能产生严重影响。