c# - Windows 服务/无法为堆栈创建新的保护页

标签 c# debugging windows-services clr stack-overflow

我有一个 Windows 服务,每分钟做一些密集的工作(实际上它每次启动一个新线程,在其中它通过 http 同步到不同的系统)。问题是,几天后,它突然停止,没有任何错误消息。

我已经安装了 NLog 并且我已经注册了 AppDomain.CurrentDomain.UnhandledException。文本文件日志中的最后一个条目只是正常条目,没有任何问题。查看事件日志,我在应用程序日志中也找不到任何消息,但是,系统日志中有两个条目。

基本上说服务已意外终止。而已。第二个事件(与第一个事件同时发生)说:“...无法为堆栈创建新的保护页...”

根据我的阅读,这可能是堆栈溢出异常。我不解析任何 XML,也不做递归工作。我使用 Gate、Nancy 和 SignalR 托管了一个网络服务器,并让 RavenDB 在嵌入式模式下运行。每分钟都会使用 .NET 4.0 中的 Taskfactory 启动一个新任务,我还有一个 ContinueWith,我在其中重新启动 System.Timers.Timer 以在一分钟内再次触发。

我怎样才能开始调查这个问题?出现此类错误的可能原因是什么?

最佳答案

根据您提供的信息,我至少会做以下事情:

  1. 特别注意任何第三方电话,并添加有关这些点的额外信息记录。
  2. 在某些情况下 AppDomain.CurrentDomain.UnhandledException 无法帮助您 - StackOverflowException 就是其中之一。我相信 CLR 在这种情况下只会给你一个字符串而不是堆栈跟踪。
  3. 特别注意引入多个线程的区域。

一个经常被忽视的 StackOverflowException 示例是:

private string myString;
public string MyString { get { return MyString; } }  //should be myString

关于c# - Windows 服务/无法为堆栈创建新的保护页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217419/

相关文章:

c# - 从模板创建 PDF

c# - Clr 命名空间映射到默认 xaml 命名空间

c++ - 如何使用CMake仅在一种模式下拥有变量

c - 使用 pow() 报告的 SIGSEGV

c# - 无法在窗口应用程序中打开计算机 '.' 上的窗口服务

c# - Visual Studio在编辑器中显示源代码时正在检测错误,并且在生成用于在 Debug模式下执行的代码时未看到任何错误

c# - where 子句中的多个列值

ios - 在 Xcode 中使用信号量进行调试 - Grand Central Dispatch - iOS

java - 如何制作自定义 Windows 服务?

visual-studio - 在visual studio中添加服务安装程序和服务进程安装程序