【问题标题】:Getting the stack trace from the caller?从调用者那里获取堆栈跟踪?
【发布时间】:2015-11-18 08:37:36
【问题描述】:

我有一些简单的代码用于将错误/警告/信息消息以及时间、日期等写入文本文件。

我要写入文件的常见内容之一是堆栈跟踪,像这样......

New Diagnostics.StackTrace(New Diagnostics.StackFrame(True))

问题在于,如果我将该代码放在日志文件处理程序中,我会获得到该点的堆栈跟踪,这可能与事件的实际位置相距几个调用。

因此,我将其作为日志文件的参数,但这会导致该行代码在我的应用程序中传播数百或数千次。

如果我可以将该代码放入日志记录代码本身会简单得多。这也将使其更便携 - StackTrace 仅存在于 Windows 上。

那么代码是否有某种方法可以确定“此对象之外的第一个调用者”,以便我可以修剪调用堆栈以显示这一点?

【问题讨论】:

  • 你究竟想把你的日志记录点放在哪里?您只是想在异常发生时捕获堆栈跟踪,还是实际上尝试进行某种调试跟踪以查看流程?
  • 如果您正在尝试跟踪流程,您应该尝试使用其中一个开源库,而不必费心编写自己的库。 log4net 和 Elmah 是其中的一些例子。
  • @JeffPrince 更像前者,只是为了让我们可以看到调用日志函数的许多地方中的哪一个被调用了,并且行号非常有用。请注意,您提到的库以及我见过的所有其他库都只能在 Windows 上运行,所以如果我们移植,我会再次回到这里。
  • 两件事:(1)如果你只想记录异常,你可以从Exception对象上的一个属性中获取堆栈跟踪; (2) 如果跨平台是一个真正的问题,那就四处寻找;还有其他支持多个平台的选择。 Stack Overflow 出于某种原因不喜欢图书馆推荐,所以我不愿提及其他人。我只是认为不值得你花时间自己写。有很多免费的选择。

标签: .net vb.net error-handling exception-handling


【解决方案1】:

所以答案是“阅读文档”。 “诀窍”是使用 StackTrace 中的集合并向后遍历帧,直到找到一个名字与您所在的班级不同的人。

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多