Моя игра 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-битные версии библиотек, которые я использую.
Увидеть этот ответ Больше подробностей.
Имейте в виду, что VS 2013 для x86 по умолчанию использует /arch:SSE2
так даже с _XM_NO_INTRINSICS_
определено, компилятор будет использовать SSE / SSE2. По этой причине вам, вероятно, следует прекратить использование _XM_NO_INTRINSICS_
и просто заставьте свой код правильно использовать DirectXMath или XNAMath.
Тем не менее, вы можете попробовать построить с /arch:IA32
заставить Visual Studio использовать устаревшую версию x87 вместо SSE / SSE2 …