Это сбой выравнивания данных? (возможно, со смещением стека, XNAMath, Visual Studio 2103)

Моя игра Win32, DirectX падает в режиме выпуска в коде, который манипулирует векторами и матрицами. В частности, сбой происходит по этой инструкции:

014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]

Исключение первого шанса в 0x014E2752 в RodinaRelease.exe: 0xC0000005: место чтения нарушения доступа 0xFFFFFFFF

Я не слишком разбираюсь в сборке и регистрах, но кажется, что esp = 0x0043f31c что сделало бы esp+3Ch = 0x0043f358

Теперь согласно этот а также этот, unpcklps инструкция — это инструкция SSE, которая требует выравнивания 16 байтов. 0x0043f358 НЕ выровнен 16 байт, верно? Правильно ли я считаю, что выравнивание стека является причиной моего сбоя?

Если так, что я сделал, чтобы заслужить это? Я не использую инструкции SSE в своей игре, поэтому могу игнорировать подобные проблемы выравнивания — это наивно / неправильно? Есть ли способ отключить это поведение?

Соответствующие пункты:

  • Я недавно обновился до Visual Studio 2013 и подозреваю, что эта ошибка появилась примерно в это время. Я нашел сообщение об ошибке это похоже на мою проблему.

  • Моя игра использует XNAMath, в частности XMMATRIX и XMVECTOR. Обычно это потребует, чтобы я все выровнял. Однако, поскольку я не хотел сталкиваться с подобными проблемами, я компилирую с флагом _XM_NO_INTRINSICS_, который должен отключить использование SIMD инструкций XNAMath. Это никогда не казалось проблемой до сих пор. Конкретный сбой, с которым я имею дело, связан с моим собственным векторным типом, но он достаточно близок к коду XMMATRIX, и я считаю, что все это смешано с помощью оптимизаций.

  • Моя игра построена как приложение Win32. Является ли переход на x64 жизнеспособным решением этой проблемы или это было бы нелепым излишеством? Я не знаю, какие последствия это имело бы, кроме необходимости получать 64-битные версии библиотек, которые я использую.

2

Решение

Увидеть этот ответ Больше подробностей.

Имейте в виду, что VS 2013 для x86 по умолчанию использует /arch:SSE2 так даже с _XM_NO_INTRINSICS_ определено, компилятор будет использовать SSE / SSE2. По этой причине вам, вероятно, следует прекратить использование _XM_NO_INTRINSICS_ и просто заставьте свой код правильно использовать DirectXMath или XNAMath.

Тем не менее, вы можете попробовать построить с /arch:IA32 заставить Visual Studio использовать устаревшую версию x87 вместо SSE / SSE2 …

1

Другие решения


По вопросам рекламы [email protected]