【问题标题】:Finding stack overflow exceptions in a windows service在 Windows 服务中查找堆栈溢出异常
【发布时间】:2011-04-14 00:35:40
【问题描述】:

我继承了一个大型而复杂的 C# Windows 服务项目,该项目时不时地崩溃。日志系统没有记录任何我最初认为奇怪的消息,但我现在明白如果出现堆栈溢出或内存不足异常,日志记录可能会失败。

因此,我的任务之一是尝试找到任何可能破坏堆栈的递归函数。 VS2010 或其他代码分析软件中是否有任何工具可以帮助检测递归代码?

作为第二个问题:还有什么可能导致 Windows 服务中的日志记录失败?

(项目使用 VS2010,但仍以 .net 3.5 和 C# 3.0 为目标)

【问题讨论】:

  • +1 用于在问题标题中使用堆栈溢出。
  • 日志机制本身的故障可能会导致 SO。如果记录失败,则抛出异常,将尝试记录,...
  • 您使用的是哪个日志框架?例如,log4net 是尽力而为 - 如果它无法记录,它不会使您的应用程序崩溃。
  • @nonnb:不,不可能以这种方式生成堆栈溢出异常。

标签: c# .net windows-services recursion


【解决方案1】:

下载Debug Diagnostic Tool,将其指向您的服务并在异常列表中添加堆栈溢出并让它运行。当服务失败时,它将转储内存。在 Visual Studio 中打开转储并检查所有线程上的所有堆栈以识别攻击性代码。您可能需要服务的原始调试符号才能获得可理解的信息。

有关使用 VS2010 here 调试内存转储的更多信息。更多关于使用 Tess Ferrandez 手表调试此类问题this

更新:Tutorial 关于堆栈溢出异常的详细信息。它基于 IIS 中的 Web 应用程序,但您可以轻松地将相同的技术应用于服务,只是您获取内存转储的方式不同。

HTH

【讨论】:

    【解决方案2】:

    您是否附加到 AppDomain.UnHandledException 事件?如果发生未处理的异常,它应该引发一个事件。另外,你检查过事件日志吗?

    尝试猜测可能导致您的服务崩溃的原因非常困难。如果您关注我提到的事件,那么我想它可能只是少数事件之一,StackOverflow 异常就是其中之一。如果您没有附加到该事件,它可能是任何东西。

    如果您真的不知所措,您可以随时尝试从 Visual Studio 中run the service as a console application。如果确实发生了错误,Visual Studio 应该会向您显示错误。这并不总是可行的,具体取决于您的环境。

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2016-02-19
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多