[英]Getting error from window service with Exception code: 0xc0000005
我们在服务器上出错,我们的服务在服务器中自动停止。 随机应用程序在大约 1 小时内崩溃,错误如下 -
错误应用程序名称:Chubb.Studio.Event.Processor.exe,版本:0.0.0.0,时间戳:0x5c0ab1b7 错误模块名称:KERNELBASE.dll,版本:6.3.9600.19425,时间戳:0x5d26b6e9 异常代码:0xc5000000000错误进程 ID:0x115c 错误应用程序启动时间:0x01d5a35fd202f96d 错误应用程序路径:E:\\WindowsService\\DevInt\\Chubb.Studio.EventProcessor\\Chubb.Studio.Event.Processor.exe 错误模块路径:C:\\Windows\\system32\\KERNELBASE。 dll 报告 ID:762c15d4-0f5b-11ea-8120-005056a27597 错误包全名:错误包相关应用程序 ID:
我们的代码看起来像 -
protected override void OnStarted()
{
//IntializeEventsExecution();
Task task = Task.Factory.StartNew(() => IntializeEventsExecution());
base.OnStarted();
}
public void IntializeEventsExecution()
{
StartEvents();
}
public void StartEvents()
{
var eventList = GetEventTopics();
Parallel.ForEach(eventList,
new ParallelOptions { MaxDegreeOfParallelism = eventList.Count },
(item, state, index) =>
{
StartProcessingEvent(eventList[(int)index]);
});
}
/// <summary>
///
/// </summary>
/// <param name="index"></param>
public void StartProcessingEvent(EventTopic topic)
{
try
{
Task task = Task.Factory.StartNew(() => ExecuteProcessingEvent(topic));
task.Wait();
}
catch (Exception)
{
}
finally
{
new _processingDelegate(StartProcessingEvent).Invoke(topic);
}
}
正如克劳斯在他的评论中所说,STATUS_ACCESS-VIOLATION 异常是由进程读取或写入它不拥有的内存引起的。 鉴于这是 C#,最可能的原因是不正确使用P/Invoke或使用不安全代码。
调试此类模糊问题的最佳方法是通过一一删除 P/Invoke 调用来隔离问题,直到异常不会发生。 很难说得更准确,因为异常可能在很远的地方触发(内存或堆栈损坏)。
这个 SO 答案很好地列出了托管代码中访问冲突的可能原因。
托管应用程序中的访问冲突通常是由于以下原因之一而发生的:
- 您 P/Invoke 本机 API 将句柄传递给托管对象,本机 API 使用该句柄。 如果在本机 API 运行时获得集合和压缩,则托管对象可能会移动并且指针无效。
- 您使用太小或小于您传入的大小的缓冲区 P/Invoke 某些内容,并且 API 超出读取或写入
- 您传递给 P/Invoke 调用的指针(IntPtr 等)无效(-1 或 0)并且本机在使用前不会检查它
- 您 P/Invoke 本机调用,本机代码耗尽内存(通常是虚拟的)并且不检查失败的分配和读取/写入无效地址
- 您使用未初始化的 GCHandle 或以某种方式指向已完成并收集的对象(因此它不是指向对象,而是指向对象曾经所在的地址)
- 您的应用程序使用了因睡眠/唤醒而无效的内容的句柄。 这更深奥,但肯定会发生。 例如,如果您在存储卡上运行应用程序,则整个应用程序不会加载到 RAM 中。 使用中的片段被按需分页以供执行。 这一切都很好。 现在,如果您关闭设备电源,驱动程序将全部关闭。 当您重新启动电源时,许多设备只需重新安装存储设备即可。 当您的应用程序需要在更多程序中请求页面时,它不再是原来的位置并且它会死掉。 装载存储上的数据库可能会发生类似的行为。 如果您有一个打开的数据库句柄,在睡眠/唤醒周期之后,连接句柄可能不再有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.