【问题标题】:Is there a way to log or intercept First Chance Exceptions有没有办法记录或拦截 First Chance Exceptions
【发布时间】:2008-11-02 05:15:57
【问题描述】:

没有使用分析器,在运行的程序中是否有任何方法可以检测第一次机会异常?理想情况下,我想记录更详细的状态信息,一旦 catch 块接管了最终异常,这些信息将不可用。

【问题讨论】:

  • 你丢失了什么信息?
  • 很高兴得到纠正:如果您不处理每个方法中的所有异常并确保所有变量都在 try-catch 块之外定义,那么在引发最终异常时,您将不会t 有权访问原始异常的执行上下文中可用的所有变量。

标签: .net exception


【解决方案1】:

我在谷歌上搜索 FirstChanceException,两年多后我忍不住回答了这个问题......

现在,在 .net 4.0 中,您可以捕获 AppDomain 的 FirstChanceException event。它只是一个事件,因此您无法处理错误,但它似乎是获取有关异常信息的一种很好的集中方式,无论它们是否被处理。 FirstChanceException 事件在一个 catch 块被允许处理它之前被抛出。我没有找到很多关于它的信息,但除了 microsoft 文档之外,更好的来源之一是 Mitch Sellers Blog

【讨论】:

  • 我希望在 .net 3.5 中有一种方法可以做到这一点。我在生产中有一个 3.5 进程,3.5 中的 FirstChanceException 之类的东西可能会帮助我找出断开连接的问题...
【解决方案2】:

我认为在 .NET 中获取该信息的唯一方法是使用调试器。

否则,您将不得不自己开发一个解决方案来保存堆栈帧的状态并使用一种特殊的方式来记录异常。您基本上会做与内存分析器相同的事情,跟踪创建的实例。除非您限制要记录的信息量,否则这将对性能造成巨大影响。

更好的解决方案是使用 System.Diagnostics 命名空间中的 Trace 和 Assert 功能来选择性地跟踪程序状态,或者使用日志工具(log4net、EnterpriseLibrary、NLog,您自己的简单工具)来转储线程/堆栈/变量信息随你走。

无论如何,添加所有这些额外信息是一项很大的开销。

编辑:我在我的提要中得到了这个项目的消息:NTrace。看起来它更适合您尝试做的事情。

【讨论】:

    【解决方案3】:

    使用Adplus。 它将在进程中附加一个调试器,并在第一次出现异常时生成(默认情况下)一个小型小型转储。 Adplus 生成的日志文件也将包含异常信息。只需确保您有 PDB 可以查看完整的 calstack 信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多