【问题标题】:How to get the .NET exception message and stack trace from a failing Windows Service?如何从失败的 Windows 服务中获取 .NET 异常消息和堆栈跟踪?
【发布时间】:2015-04-05 14:16:21
【问题描述】:

我已经用 C#/.NET 编写了一个 Windows 服务,但到目前为止它还没有启动。在其OnStart 方法中抛出异常。

由于我没有在 Windows 事件日志中找到有关未处理异常的任何信息(除了不是很有帮助的 P4: System.Data),我正在寻找另一种获取堆栈跟踪和异常消息的简单方法。

我知道,我可以尝试debug Windows 服务,但由于它在timeout 下运行的OnStart 方法中失败,因此调试并不有趣。此外,它需要以管理员身份启动 VS。

或者我应该将所有内容包装在 try-catch 中并在某处记录异常?如果是这样,去哪里?最佳做法是什么?

【问题讨论】:

    标签: c# .net debugging windows-services


    【解决方案1】:

    将代码的所有关键部分包装在单独的 try/catch 块中,将日志写入 Windows 事件日志,安装全局异常处理程序。将这些异常也写入 Windows 事件日志。

    您应该在服务中执行所有这些操作,即使它不会崩溃。

    【讨论】:

    • 为什么要安装全局异常处理程序使用 try/catch 块?我会简单地做AppDomain.CurrentDomain.UnhandledException += ...EventLog.WriteEntry...。看来这就够了。
    • 您希望尽可能多地记录有关每个异常的信息。这就是为什么您有 local try/catch 块,您可以在其中添加有关程序状态的更多信息。您希望全局捕获异常,因为总有机会获得您没有为其提供 try/catch 块的异常。底线:将尽可能多的详细信息写入事件日志。这将最大限度地减少您调试服务所需的时间并使其以稳定的方式运行。
    • 听起来有点计数器stackoverflow.com/a/4827646/331281 也是因为我不知道要向未处理的异常添加哪些信息。但总的来说,我明白你的意思。
    • 嗯,主要目标是快速找出您的服务崩溃的原因(不仅是今天,而且在未来的几个月和几年内)。所以我会在你的服务的 top level 有两个或三个 try/catch 块来生成有意义的日志条目(如前所述)
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2023-02-17
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多