在.NET中记录StackOverflowException
我最近在我的.NET应用程序(asp.net网站)中有一个堆栈溢出exception,我知道因为它出现在我的EventLog中。 我知道无法捕获或处理StackOverflowexception,但有没有办法在它杀死你的应用程序之前记录它? 我有100k行代码。 如果我知道堆栈跟踪,或者只是堆栈跟踪的一部分,我可以追踪无限循环/递归的来源。 但是没有任何有用的诊断信息,看起来它需要进行大量的猜测和测试。
我尝试在我的应用程序域(在global.asax中)设置一个未处理的exception处理程序,但似乎没有执行,这有意义,如果堆栈溢出应该终止并且不运行任何catch / finally块。
有没有办法记录这些,或者是否有一些我可以启用的秘密设置,当应用程序崩溃时将堆栈帧保存到磁盘?
您最好的选择是使用ADPlus 。
Windows NT内核调试团队有一篇关于如何用它捕获CLRexception的博文 。 关于它的不同配置选项有很多细节。
ADPlus将监控应用程序。 您可以指定它在崩溃模式下运行,这样您就可以告诉ADPlus在发生StackOverflowException时正确进行内存转储。
一旦你有内存转储,你可以使用WinDbg和像Psscor这样的托管调试扩展来查看堆栈溢出期间发生了什么。
在StackOverflow上询问StackOverFlowException非常明智:)
AFAIK,你唯一能做的就是在崩溃时获得转储。 除非您托管自己的CLR,否则CLR会让您失望。
有关在崩溃时获取IIS工作进程转储的相关问题:
- 获取IIS工作进程崩溃转储
这里有几个与SO相关的线程:
- 如何打印StackOverflowException的堆栈跟踪
- C#捕获堆栈溢出exception
希望这些指针有所帮助。
您可以尝试在应用程序的关键点记录消息,并取出日志消息流中断的部分。
然后,尝试使用unit testing使用该部分代码复制它。
获知跟踪堆栈溢出错误的唯一方法是让中间层获取正在运行的代码的快照并将其写出来。 这总是会对性能造成严重影响。