Исключение ASP Net Core 1.1 и EF 6 в неуправляемом коде?
Хорошо, это действительно причудливая проблема, которая только что сложилась, и для жизни меня я не знаю, с чего начать.
По какой-то причине я получаю фатальную ошибку где-то в EF 6, но это произошло только после того, как я конвертировал в .NET Core 1.1. Это приложение запускалось без проблем в ASP.Net MVC 4.
![Причина моих бессонных ночей]()
Для поисковых систем:
Помощник по удаленной отладке "FatalExecutionEngineError": 'Среда выполнения столкнулась с фатальной ошибкой. Адрес ошибки был равен 0x77c81a09, на потоке 0x2520. Код ошибки: 0xc0000005. Эта ошибка может быть ошибкой в CLR или в небезопасных или не поддающихся проверке частях кода пользователя. Общие источники этой ошибки включают ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек. `` `
Из того, что я могу найти в Интернете, это проблема вне управляемой среды .NET. Это означает, что я просто стесняюсь невежественности.
В первый раз, когда я был поражен этой ошибкой, простая "Чистая" и "Сборка" фиксировали ее на некоторое время, затем она снова появилась в том же месте.
Я видел эту ошибку в двух местах:
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, где все работает нормально, даже с оператором async.
Даже первый пример работал после Clean и Build.
Я действительно в недоумении, что делать. Я читал, что это может иметь какое-то отношение к окружающей среде. На данный момент у меня нет альтернативных условий для тестирования, только моя машина dev. Я попытаюсь обновить его позже, если я закрою его на альтернативной машине.
Я только что сделал еще один тест перед публикацией:
Если я пройду через код (первый пример), все будет работать по назначению.
Стоп. Удалить точку останова. Начало. Краш.
Это подталкивает меня к стене.
Обновление
Как будто это не может стать намного более странным, эта ошибка не возникает при каждом запуске.
Я бы сказал, что около 60/40 в пользу крушения. Когда он запускается (и первый запрос проходит), у меня нет проблем для времени жизни процесса.
Другое обновление
Похоже, он изолирован от работы под IIS Express. Если я запускаю приложение автономно, я не смог выполнить сбой.
Еще несколько технических бит:
- ASP.Net Core 1.1
- .NET 4.5.2
- Windows 7 SP1
- EF 6.1.3
Закрытие Редактировать
Для полноты этой темы (поскольку в этой точке есть несколько потоков), обходной путь, предоставляемый @gregg-miskelly (и представленный SO by @SwampyFox), действительно работает. Ошибка была отправлена в MS и должна быть исправлена в будущей версии .NET Framework.
Обсуждение состоялось на странице coreclr GitHub
Ответы
Ответ 1
Согласно сообщению OP на github, EF 6.1. 3 Сбой IIS Express с FatalExecutionEngineError в ASP.Net Core MVС# 10717, это крах в Framework.
Сбой запускается при включении трассировки памяти ETW GC.
Чтобы обойти это, вы можете попробовать отключить трассировку памяти ETW GC в Visual Studio.
- Открыть инструменты- > Параметры
- Введите "Диагностические инструменты" в строке поиска
- Снимите флажок "Включить инструменты диагностики во время отладки" в разделе "Отладка".
Ответ 2
Я испытываю ту же проблему с net462 и ASP.NET 1.1 с проектом EF 6.1.3
<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-interop или PInvoke, которые могут повредить стек.
Это происходит, если я вызываю асинхронный или синхронный или даже если я вызываю свой DbContext из Main:
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).
По-видимому, это все еще проблема.