У меня есть дорогостоящее многопоточное приложение на С#, которое, похоже, постоянно срабатывает после 30-90 минут работы. Ошибка, которую она дает, -
Среда выполнения столкнулась с фатальной ошибкой. Адрес ошибки был равен 0xec37ebae, на потоке 0xbcc. Код ошибки: 0xc0000005. Эта ошибка может быть ошибкой в CLR или в небезопасных или не поддающихся проверке частях кода пользователя. Общие источники этой ошибки включают ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек.
(0xc0000005 - код ошибки для Нарушение прав доступа)
Мое приложение не вызывает какой-либо собственный код или использует любые небезопасные блоки или даже любые типы, не совместимые с CLS, такие как uint
. Фактически, строка кода, которую говорит отладчик, вызвала сбой
overallLength += distanceTravelled;
Если оба значения имеют тип double
Учитывая все это, я считаю, что авария должна быть связана с ошибкой в компиляторе или CLR или JIT. Я хотел бы выяснить, что вызывает его, или, по крайней мере, написать меньшую репродукцию для отправки в Microsoft, но я понятия не имею, с чего начать. Мне никогда не приходилось просматривать CIL-двоичный файл, или скомпилированный JIT-выход, или собственный стек (нет управляемой стека в момент сбоя), поэтому я не знаю, как это сделать. Я даже не могу понять, как просмотреть состояние всех переменных во время сбоя (VS, к сожалению, не скажет мне, что это происходит после управляемых исключений, и вывод их в консоль/файл замедлит работу приложение 1000 раз, что, очевидно, не является вариантом).
Итак, как я могу отладить это?
[Изменить] Скомпилирован под VS 2010 SP1, на котором запущена последняя версия .Net 4.0 Client Profile. По-видимому, это ".Net 4.0C/.Net 4.0E,.Net CLR 1.1.4322"