我遇到了我公司编写的软件问题,它是一个运行为Windows服务的实时服务器,它使用RabbitMQ与WebApplication / Silverlight客户端连接。在启动服务后10分钟到2周之间,它会意外崩溃。应用程序事件查看器中记录了2个错误(我已使用XXX替换了类和exe名称):
来源:应用程序错误,EventId:1000,任务:(100)
错误应用程序XXX.exe,版本0.0.1.18195,时间戳 0x4e4a015e,错误模块clr.dll,版本4.0.30319.1,时间戳 0x4ba21eeb,异常代码0xc0000005,故障偏移 0x000000000018063e,进程ID 0x%9,应用程序启动时间0x%10。
和
来源:.NET Runtime,EventId:1023,任务:无
应用程序:XXX.exe Framework版本:v4.0.30319描述: 由于.NET运行时中的内部错误,进程终止 IP 000007FEF973063E(000007FEF95B0000),退出代码为80131506。
以下异常被抛出。它似乎是在迭代列表的底层数组时遇到问题,这可能是null,这超出了我的范围。
XXX`1 [XXX];异常:System.NullReferenceException:Object 引用未设置为对象的实例。在 System.Collections.Generic.List`1.Enumerator.MoveNext()at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1集合)
我已尝试将ADPlus附加到服务中,但它会使其速度降低,因此无法使用。由于Watson博士不再可用,难以获得内存转储,任何人都可以推荐任何其他不会影响性能的工具吗?
以前有人见过这样的事吗?
答案 0 :(得分:1)
如果Windows服务中的后台线程发生异常,该服务将崩溃。看来IEnumerable<T>
传递给InsertRange
的{{1}}是null
。
修复此问题并且问题应该消失,但您仍然容易崩溃。我建议所有后台线程捕获并处理异常。例如,要启动一个安全的线程池线程,您可以执行以下操作:
ThreadPool.QueueUserWorkItem(o =>
{
try
{
//...
}
catch (Exception e)
{
Log.Error(e);
}
}