【问题标题】:log a StackOverflowException in .NET在 .NET 中记录 StackOverflowException
【发布时间】:2011-11-19 18:33:51
【问题描述】:

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

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

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

【问题讨论】:

  • ADPlus
  • @martin 我不熟悉 DebugDiag。它会给我的服务器增加任何开销(比如附加调试器的方式很慢),还是它是用于进程崩溃的系统级事件处理程序?
  • @dan- 我不记得了,因此只发表了评论。几年前,我使用它来查明由第三方组件引起的 stackoverflow 的底部,但这很容易重现,并且只能在内部低流量网站上。
  • 这样的网站最相关的问题! StackOverflow 异常!

标签: c# .net asp.net


【解决方案1】:

最好的办法是使用ADPlus

Windows NT 内核调试团队有一个很好的blog post 介绍了如何使用它来捕获 CLR 异常。有很多关于它的不同配置选项的详细信息。

ADPlus 将监控应用程序。您可以指定它在 crash mode 中运行,这样您就可以告诉 ADPlus 在 StackOverflowException 发生时立即进行内存转储。

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

【讨论】:

    【解决方案2】:

    在 StackOverflow 上询问有关 StackOverFlowException 的问题非常明智:)

    AFAIK,您唯一能做的就是在崩溃时转储。除非您托管自己的 CLR,否则 CLR 将让您失望。

    有关在崩溃时获取 IIS 工作进程转储的相关问题:

    这里有几个其他与 SO 相关的线程:

    希望这些指点有所帮助。

    【讨论】:

      【解决方案3】:

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

      然后,尝试使用单元测试将其复制到那段代码中。

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

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 2011-04-03
        • 2014-11-14
        • 2016-12-24
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多