繁体   English   中英

使用异常代码从窗口服务获取错误:0xc0000005

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM