【问题标题】:A more complete error log更完整的错误日志
【发布时间】:2010-08-19 20:14:44
【问题描述】:

当我记录错误时,我通常会包含堆栈跟踪。这很好,但通常很难判断错误到底在哪里。

是否可以设置一个例程,在错误发生时收集(可能通过反射)参数、局部变量等...?

【问题讨论】:

  • 你能举一个“无法判断错误发生在哪里”的例子吗?我想知道您的问题是错误的异常处理(破坏调用堆栈跟踪),还是只是您需要帮助阅读堆栈跟踪。
  • 不幸的是,堆栈跟踪没有显示本地/参数的值。 afaik 你不能通过运行时日志来做到这一点 - 只能通过闯入调试器(即 VS)。但是它应该准确地告诉您异常发生的位置(至少是外部异常)。
  • 糟糕的异常处理也是我的想法。我经常看到像try { ... } catch (Exception ex) { Log.Error(ex); throw ex; } 甚至只是try { ... } catch (Exception ex) { throw ex; } 这样的异常处理,当throw ex; 被执行时,它们都会丢弃异常中的堆栈跟踪。如果需要重新抛出异常,通常最好使用throw;try { ... } catch (Exception ex) { Log.Error(ex); throw; } 一样,或者以原来的异常作为内部异常抛出一个新的异常。
  • 我确实有合法的堆栈跟踪。我没有的是上下文。方法或局部变量的参数是什么。

标签: c# .net error-handling


【解决方案1】:

如果你没有 VS2010,你可以使用 PostSharp 编入代码,在函数调用时收集参数。不过,它会减慢代码速度,因此仅对调试有用。

编辑:(从我刚刚发表的评论中宣传)

如果您想在生产中使用它,您可以限制 PostSharp 编织的范围,使其仅在某些类/命名空间/程序集(甚至函数)上运行,或者您可以限制您在建议时执行的操作被执行。我尝试过但没有完全遵循的一件事是让建议方法简单地将堆栈帧信息记录在环形缓冲区中。当发生异常时,您的记录器可以从环形缓冲区中获取堆栈帧信息并生成合适的日志消息。否则,当环形缓冲区填满时,帧信息就会被覆盖。您甚至可以只使用堆栈而不是环形缓冲区,并让堆栈随着调用堆栈的增长和收缩而增长和收缩,记录帧信息。警告:您将无法从 PostSharp 无法修改的框架代码或第 3 方代码中获取框架信息。

【讨论】:

  • PostSharp 是为调试目的启用跟踪日志记录的好方法,但如果不谨慎使用,这肯定会产生 很多 噪音。我已经看到生产中的应用程序每天生成 100 MB 的日志文件。只要您有磁盘空间、可以承受性能损失并有适当的工具来解析/过滤日志,那么这些数据就是有价值的,这样您就可以理解它们。
【解决方案2】:

如果您可以升级到 VS2010,您可以尝试使用 IntelliTrace 功能,它正是这样做的。

【讨论】:

  • 尽管您可能需要进行第二次抵押以支付终极版许可证。 :)
  • 我的意思是一旦我将应用程序部署到生产环境中,而不是在开发过程中。
  • 首先,您不应该在生产中遇到这些问题。进行更好的测试,并首先将它们放在测试中。其次,我不确定,但其中一些可能在生产中可用。如果数据收集器真的需要从 Visual Studio 启动,我会感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多