Отладка исключения 0xc000001d с WinDbg
Я пытаюсь найти основную причину исключения "Недопустимая инструкция" (0xc000001d) с WinDbg. Проект был построен с VC++2015. У меня есть два дампа памяти из двух тестовых прогонов.
На данный момент я нашел следующее, что верно для обоих дампов:
- исключение указывает на "
movq mmword ptr [ecx], xmm0
"инструкция - xmm0 содержит нули
- исключение происходит в конструкторе объекта
- адрес находится внутри DS
- адрес принадлежит записи в куче, которая выглядит действительной
- адрес указывает на объект, который создается, поэтому кажется, что он пытается установить нулевое значение для члена obj.m_data, который также выглядит допустимым
Я понятия не имею, куда идти дальше, поэтому буду признателен за любые указания.
UPD:
...
movq xmm0,mmword ptr [esi]
lea ecx,[edi+94h]
movq mmword ptr [ecx],xmm0 ; << this causes the exception
1 ответ
Недопустимая инструкция возникает, когда операционная система обрабатывает ошибку от ЦПУ, где она не смогла декодировать инструкцию. Это может произойти, если расширение инструкции не поддерживается ЦП или операционной системой. msdn: недопустимая инструкция AVX. В этом случае ошибка в msvc 2013
произошло, когда процессор поддерживает AVX, но операционная система - нет.
Неисправные процессоры не поддерживают SSE2, что, вероятно, является причиной этой проблемы.
В случае, когда я столкнулся с проблемой AVX, при использовании инструмента для определения того, использовался ли AVX, был тест процессора, который решил, что AVX не поддерживается инструментом (поставляется Intel).
Я не знаю об инструменте AMD, и я бы с осторожностью относился к тому, чтобы такой инструмент работал, так как, возможно, отсутствует поддержка операционной системы.
Обновить
Почему инструкция не выполняется, если операционная система не поддерживает ее? Примером этого являются инструкции AVX, которые из википедии: состояния AVX.
AVX добавляет новое состояние регистра через 256-битный регистровый файл YMM, поэтому для правильного сохранения и восстановления расширенных регистров AVX между переключениями контекста требуется явная поддержка операционной системы.
Любые изменения в работе или памяти, необходимые операционной системе, вероятно, требуют явного согласия. В случае AVX дополнительные регистры изменили объем данных, хранящихся для переключения контекста.