ExecutionEngineException только при отладке
У меня есть код C#, который генерирует исключение ExecutionEngineException, только когда я его отлаживаю. Когда я просто запускаю его из Visual Studio без отладки (нажмите кнопку "Пуск без отладки"), этот фрагмент кода работает нормально. Но когда я отлаживаю его из Visual Studio, он генерирует исключение ExecutionEngineException.
Из-за этой проблемы я не могу отладить свое приложение, так как код, который я пытаюсь отладить, выполняется ПОСЛЕ проблемного фрагмента кода.
Вот некоторые детали:
- Я использую Visual Studio 2012
- Основное приложение - это приложение C++/CLI, которое вызывает мой код на C#
- Приложение работает некоторое время, пока не достигнет проблемных строк кода в C#
- Соответствующий код представляет собой запрос к контексту Entity Framework.
- Я использую Entity Framework 5
- БД, в которой хранятся мои сущности, - это SQL Server LocalDB (та, которая поставляется с VS2012)
редактировать
Дальнейшие исследования показывают, что действительной проблемой является исключение нарушения прав доступа, которое возникает в конструкторе по умолчанию System.Data.DataSet, что также происходит, если я просто пишу new DataSet()
,
Редактировать 2 Я создал небольшое приложение, которое демонстрирует эту проблему. Исходный код можно найти здесь.
Вы можете скомпилировать его и попробовать запустить проект Application
, Это должно врезаться в Adder.cs
с ExecutionEngineException
при создании нового DataSet
, Обратите внимание, что отладчик должен быть Mixed, а не Managed/Native.
1 ответ
Ваш код C++/CLI, скорее всего, повреждает кучу мусора. Очень типичный способ неправильного поведения неуправляемого кода. Это не будет обнаружено позже, например, когда вы создаете новый объект или запускаете сборщик мусора. Таким образом, код, который дает сбой, совершенно не связан с кодом, который вызвал повреждение, и не дает вам никакого намека на то, где находится ошибка.
Отладка в этом очень мала, обычно требуется тщательный анализ кода, множество модульных тестов неуправляемого кода и несколько дней отладки, чтобы найти его. Сценарий "сбой только в отладочной сборке" также очень распространен, это не означает, что в выпускной сборке нет повреждения кучи. Вам немного повезло, что такой сбой происходит следующим образом, отладка кучи намного сложнее отлаживать, когда она происходит в сборке релиза. Вы захотите инвестировать в распределитель отладки, чтобы поймать ошибку в действии, например ту, из которой вы вышли <crtdbg.h>
, Эта проблема в целом сделала сборщики мусора излюбленным способом управления памятью.
Мои соболезнования и удачи в этом.