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

时间:2019-11-25 14:45:26

标签: c# windows-services

我们在服务器上遇到错误,我们的服务在服务器中自动停止。 随机应用程序在大约1小时内崩溃,并且出现以下错误,错误为-

  

错误的应用程序名称:Chubb.Studio.Event.Processor.exe,版本:   0.0.0.0,时间戳:0x5c0ab1b7故障模块名称:KERNELBASE.dll,版本:6.3.9600.19425,时间戳:0x5d26b6e9异常代码:   0xc0000005故障偏移量:0x0000000000001556故障进程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);

        }
    }

1 个答案:

答案 0 :(得分:0)

正如克劳斯(Klaus)在他的评论中所说,STATUS_ACCESS-VIOLATION异常是由进程读取或写入它不拥有的内存引起的。鉴于这是C#,最可能的原因是错误使用P/Invoke或使用unsafe code

调试像这样模糊的东西的最好方法是通过逐个删除P / Invoke调用直到问题没有发生来隔离问题。很难精确地说,因为异常可能是从原因(内存或堆栈损坏)起很长的距离内触发的。

This SO answer很好地列出了托管代码中访问冲突的可能原因。

  

托管应用中的访问冲突通常发生于其中一种   原因:

     
      
  • 您P /调用一个本机API,将其传递给被管理对象的句柄,而本机API使用该句柄。如果您得到收藏并且   在本机API运行时进行压缩时,托管对象可能会   移动并且指针变为无效。
  •   
  • 您使用小于或小于传递的大小的缓冲区P / Invoke某些东西,并且API超出了读取或写入的范围
  •   
  • 您传递给P / Invoke调用的指针(IntPtr等)无效(-1或0),并且本机在使用前未对其进行检查
  •   
  • 您P /调用了本地调用,并且本地代码用完了内存(通常是虚拟的),并且不检查分配失败和   读取/写入无效地址
  •   
  • 您使用未初始化的GCHandle或以某种方式指向已完成并已收集的对象(因此它不是   指向一个对象,它指向一个对象所在的地址   曾经是)
  •   
  • 您的应用使用句柄来处理因睡眠/唤醒而无效的内容。这比较深奥,但肯定会发生。例如,   如果您使用存储卡运行应用程序,则整个应用程序   没有加载到RAM中。使用中的零件按需求分页   执行。这一切都很好。现在,如果您关闭设备电源,   司机全部关闭。上电后,许多设备仅   重新安装存储设备。当您的应用需要按需进入时   更多的程序,它不再存在,它死了。类似   挂载存储上的数据库可能会发生这种行为。如果您有   在睡眠/唤醒周期后打开数据库的句柄,然后连接   句柄可能不再有效。
  •