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