Отладка исключения 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 дополнительные регистры изменили объем данных, хранящихся для переключения контекста.

Другие вопросы по тегам