非托管代码中的 ASP Net Core 1.1 和 EF 6 异常?

Posted

技术标签:

【中文标题】非托管代码中的 ASP Net Core 1.1 和 EF 6 异常?【英文标题】:ASP Net Core 1.1 and EF 6 Exception in Unmanaged Code? 【发布时间】:2017-03-13 20:13:22 【问题描述】:

好的,这是一个刚刚发展起来的非常奇怪的问题,我这辈子都不知道从哪里开始。

由于某种原因,我在 EF 6 的某个地方遇到了一个致命错误,但这只是在我转换到 .NET Core 1.1 之后才发生的。此应用程序在 ASP.Net MVC 4 上运行没有问题。

对于搜索引擎:

Managed Debugging Assistant 'FatalExecutionEngineError' : '运行时遇到致命错误。错误地址位于线程 0x2520 上的 0x77c81a09。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。 ```

从我在网上可以找到的信息来看,这是 在 .NET 的托管环境之外存在的问题......这意味着我只是害羞无知。

我第一次遇到这个错误时,一个简单的 Clean and Build 修复了一段时间,然后它再次出现在同一个地方。

到目前为止,我已经在两个地方看到了这个错误:

var vm = new ManagerLogIndexViewModel()

    Locations = await _db.Locations.ToListAsync(),
;

还有(虽然更复杂):

var results = await _db.InvolvedPersons
    .Where(
        x =>
            x.LastName.ToUpper().Contains(q) || x.FirstName.ToUpper().Contains(q) ||
            (x.FirstName + " " + x.LastName).ToUpper().Contains(q))
    .Select(x => new x.FirstName, x.LastName, x.Id)
    .GroupBy(x => x.LastName + " " + x.LastName)
    .Select(x => x.FirstOrDefault())
    .ToDictionaryAsync(x => x.FirstName + " " + x.LastName, x => x.Id.ToString());

会不会和async有关?

还有其他 Entity Framework 调用,即使使用异步运算符,一切正常。

即使是第一个示例在清理和构建之后也能正常工作。

我真的不知道该怎么办。我读过它可能与环境有关。目前,我没有可供测试的替代环境,只有我的开发机器。如果我在另一台机器上启动它,我会稍后尝试更新。


我刚刚在发帖前做了另一个测试:

如果我单步执行代码(第一个示例),一切都会按预期进行。

停下来。删除断点。开始。崩溃。

这把我逼上墙了。


更新

好像这不会变得很陌生,这个错误不会在我每次启动时发生。

我会说它大约 60/40 有利于崩溃。当它运行(并且第一个查询通过)时,我在进程的生命周期内没有任何问题。

另一个更新

看起来这与在 IIS Express 下运行是隔离的。如果我以独立方式运行应用程序,我无法产生崩溃。


更多技术细节:

ASP.Net Core 1.1 .NET 4.5.2 Windows 7 SP1 EF 6.1.3

关闭编辑

为了这个线程的完整性(因为此时有几个线程),@gregg-miskelly 提供的解决方法(并由@SwampyFox 提交给 SO)确实有效。该错误已提交给 MS,应该会在未来的 .NET Framework 版本中修复。

讨论发生在coreclr GitHub page

【问题讨论】:

您似乎在 .NET Core 中发现了一个错误。为什么不尝试找到导致此错误的“最小代码”并将问题提交给 .NET Core 团队? 我也遇到了同样的问题。正如您所指出的,完全清理/重建似乎可以修复它(通常)。但是,有时需要手动删除受影响项目的“bin”和“obj”文件夹。 我一定会尝试找到导致此问题的基本情况。 @BenWalters 如果您有任何关于您的情况的信息,请分享。我今天被下雪了,但听到这不仅仅是我的消息,我感到很欣慰。 我建议你在这个 repo github.com/aspnet/EntityFramework6 或者直接在github.com/dotnet/coreclr中打开一个问题 我只想说我遇到了同样的问题,这让我发疯了。 100% 完全相同的堆栈,并且这个错误有 50% 的时间发生。清理/重建有时会修复它。 【参考方案1】:

根据github上的OP帖子EF 6.1.3 Crashing IIS Express with FatalExecutionEngineError in ASP.Net Core MVC #10717,这是Framework中的崩溃。

崩溃是由开启 ETW GC 内存跟踪触发的。

要解决此问题,您可以尝试在 Visual Studio 中关闭 ETW GC 内存跟踪。

    打开工具->选项 在搜索栏中输入“诊断工具” 取消选中“调试常规”部分下的“调试时启用诊断工具”。

【讨论】:

你到底是怎么找到这个解决方案的?!十分感谢。 (更新:doh,我猜你分享了源代码) 当时,我遇到了这个问题,正在密切关注 GIT 存储库。【参考方案2】:

我在使用 EF 6.1.3 项目的 net462 和 ASP.NET 1.1 中遇到了同样的问题

  <PropertyGroup>
    <TargetFramework>net462</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
    <PackageReference Include="EntityFramework" Version="6.1.3" />
  </ItemGroup>

当我在 IIS Express 中运行时,我经常(但不是全部)收到以下异常:

托管调试助手 'FatalExecutionEngineError' : '运行时 遇到了致命错误。错误的地址在 0x709a1a09,在线程 0x5020 上。错误代码为 0xc0000005。这个错误 可能是 CLR 中的错​​误,或者是不安全或不可验证的部分 用户代码。此错误的常见来源包括用户编组错误 用于 COM 互操作或 PInvoke,这可能会损坏堆栈。'

如果我调用异步或同步,或者即使我从 Main 调用我的 DbContext,也会发生这种情况:

    public static void Main(string[] args)
    
        using (var db = new MyDbContext())
        
            var WorkOrders = db.WorkOrders.ToList();
        

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

        host.Run();
    

如果我直接运行我的应用程序(在 IIS Express 之外),这永远不会发生。

所以显然这仍然是一个问题。

【讨论】:

以上是关于非托管代码中的 ASP Net Core 1.1 和 EF 6 异常?的主要内容,如果未能解决你的问题,请参考以下文章

在 ServiceFabric 中托管旧版 ASP.NET(不是 ASP.NET Core)

Ktor 中的后台任务,例如 ASP.Net Core 中的“托管服务”

ASP.NET Core 进程内(InProcess)托管

HTTP 错误 500.0 - Dot net core 3.1 中的 ASP.NET Core IIS 托管失败(进程中)

ASP.NET Core 进程外(out-of-process)托管

在 Chrome 中托管在 Azure 中的 ASP.NET Core Web 应用程序上的异常 HTTP 响应