我继承了一个庞大而复杂的C#windows服务项目,它偶尔会崩溃。日志记录系统没有记录我最初认为奇怪的任何消息,但我现在明白,如果存在堆栈溢出或内存不足异常,日志记录可能会失败。
所以我的任务之一就是尝试查找可能会破坏堆栈的任何递归函数。 VS2010或其他代码分析软件中是否有任何工具可以帮助检测递归代码?
作为第二个问题:还有什么可能导致Windows服务中的日志记录失败?
(Project使用VS2010,但仍使用C#3.0定位.net 3.5)
答案 0 :(得分:3)
下载Debug Diagnostic Tool,将其指向您的服务并在例外列表中添加堆栈溢出并让它运行。当服务失败时,它将转储内存。在Visual Studio中打开转储并检查所有线程上的所有堆栈以识别令人反感的代码。您可能需要服务的原始调试符号才能获得可理解的信息。
有关使用VS2010 here进行内存转储调试的更多信息。更多关于使用Tess Ferrandez观察这类问题的观察this
更新:Tutorial有关详细信息的堆栈溢出异常。它基于IIS中的Web应用程序,但您可以轻松地将相同的技术应用于服务,这就是您采用不同内存转储的方式。
HTH
答案 1 :(得分:1)
您是否附加了 AppDomain.UnHandledException 事件?如果发生未处理的异常,它应该引发一个事件。你还检查过Eventlog吗?
尝试猜测可能导致服务崩溃的原因非常困难。如果您对我提到的事件感兴趣,那么我想它实际上只能是少数事件之一,StackOverflow例外就是其中之一。如果您没有附加到该事件,它可能是任何事情。
如果您真的感到茫然,可以随时在Visual Studio中尝试run the service as a console application。如果确实发生错误,Visual Studio应该会显示错误。根据您的环境,这并不总是可行的。