这是数据对齐崩溃吗? (可能涉及堆栈错位,XNAMath,Visual Studio 2103)
Is this a data alignment crash? (potentially involving stack misalignment, XNAMath, Visual Studio 2103)
我的 Win32、DirectX 游戏在处理向量和矩阵的代码中以发布模式崩溃。具体来说,崩溃发生在这条指令上:
014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]
First-chance exception at 0x014E2752 in RodinaRelease.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF
我不太了解汇编和寄存器,但看来 esp = 0x0043f31c
会使 esp+3Ch = 0x0043f358
现在,根据this and this,unpcklps
指令是一条SSE指令,需要16字节对齐。 0x0043f358
不是 16 字节对齐的,对吗?我认为堆栈对齐是我崩溃的原因是对的吗?
如果是这样,我做了什么值得这个????我在我的游戏中不使用 SSE 指令,所以我可以忽略像这样的对齐问题 - 是 naive/wrong 吗?有什么办法可以关闭此行为吗?
相关要点:
我最近升级到 Visual Studio 2013,我怀疑这个错误大约是在这个时候出现的。我发现了一个与我的问题相似的bug report。
我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想 运行 遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是一个问题。我正在处理的具体崩溃是我自己的向量类型,但它与 XMMATRIX 代码非常接近,我相信它们都是通过优化混合在一起的。
我的游戏是作为 Win32 应用程序构建的。切换到 x64 是解决这个问题的可行解决方案还是太荒谬了?我不知道除了需要获得我使用的 64 位版本的库之外还会有什么后果。
有关详细信息,请参阅 。
请记住,用于 x86 的 VS 2013 默认使用 /arch:SSE2
,因此即使定义了 _XM_NO_INTRINSICS_
,编译器仍将使用 SSE/SSE2。出于这个原因,您可能应该停止使用 _XM_NO_INTRINSICS_
并让您的代码正确使用 DirectXMath 或 XNAMath。
就是说,您可以尝试使用 /arch:IA32
构建以强制 Visual Studio 使用旧式 x87 而不是 SSE/SSE2...
我的 Win32、DirectX 游戏在处理向量和矩阵的代码中以发布模式崩溃。具体来说,崩溃发生在这条指令上:
014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]
First-chance exception at 0x014E2752 in RodinaRelease.exe: 0xC0000005: Access violation reading location 0xFFFFFFFF
我不太了解汇编和寄存器,但看来 esp = 0x0043f31c
会使 esp+3Ch = 0x0043f358
现在,根据this and this,unpcklps
指令是一条SSE指令,需要16字节对齐。 0x0043f358
不是 16 字节对齐的,对吗?我认为堆栈对齐是我崩溃的原因是对的吗?
如果是这样,我做了什么值得这个????我在我的游戏中不使用 SSE 指令,所以我可以忽略像这样的对齐问题 - 是 naive/wrong 吗?有什么办法可以关闭此行为吗?
相关要点:
我最近升级到 Visual Studio 2013,我怀疑这个错误大约是在这个时候出现的。我发现了一个与我的问题相似的bug report。
我的游戏使用 XNAMath,特别是 XMMATRIX 和 XMVECTOR。通常这需要我对齐所有内容。但是,因为我不想 运行 遇到这样的问题,所以我使用 _XM_NO_INTRINSICS_ 标志进行编译,该标志应该关闭 XNAMath 对 SIMD 指令的使用。直到现在,这似乎从来都不是一个问题。我正在处理的具体崩溃是我自己的向量类型,但它与 XMMATRIX 代码非常接近,我相信它们都是通过优化混合在一起的。
我的游戏是作为 Win32 应用程序构建的。切换到 x64 是解决这个问题的可行解决方案还是太荒谬了?我不知道除了需要获得我使用的 64 位版本的库之外还会有什么后果。
有关详细信息,请参阅
请记住,用于 x86 的 VS 2013 默认使用 /arch:SSE2
,因此即使定义了 _XM_NO_INTRINSICS_
,编译器仍将使用 SSE/SSE2。出于这个原因,您可能应该停止使用 _XM_NO_INTRINSICS_
并让您的代码正确使用 DirectXMath 或 XNAMath。
就是说,您可以尝试使用 /arch:IA32
构建以强制 Visual Studio 使用旧式 x87 而不是 SSE/SSE2...