在.net中记录一个StackOverflowException

本文关键字:一个 StackOverflowException net 记录 | 更新日期: 2023-09-27 18:09:01

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

我尝试在我的应用程序域(在global.asax)上设置一个未处理的异常处理程序,但这似乎没有执行,如果堆栈溢出应该终止并且不运行任何catch/finally块,这是有意义的。

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

在.net中记录一个StackOverflowException

你最好使用ADPlus。

Windows NT内核调试团队有一篇关于如何用它捕获CLR异常的博文。这里有很多关于它的不同配置选项的细节。

ADPlus将监视应用程序。你可以指定它在崩溃模式下运行,这样你就可以告诉ADPlus在StackOverflowException发生时立即进行内存转储。

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

非常明智地询问StackOverflow上的StackOverFlowException:)

我敢说,你唯一能做的就是在崩溃时获得转储。CLR会让你崩溃,除非你托管自己的CLR。

关于获取IIS工作进程崩溃时的转储的一个相关问题:

  • 获取IIS工作进程崩溃转储

下面是几个与SO相关的线程:

    如何打印StackOverflowException的堆栈跟踪c#捕获栈溢出异常

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

然后,尝试用单元测试来复制这段代码。

我所知道的跟踪堆栈溢出错误的唯一方法是让中间层获取运行代码的快照并将其写出来。

相关文章: