ベクトルと行列を操作しているコード内で、Win32、DirectX ゲームがリリース モードでクラッシュします。具体的には、次の命令でクラッシュが発生します。
014E2752 unpcklps xmm1,xmmword ptr [esp+3Ch]
RodinaRelease.exe の 0x014E2752 での初回例外: 0xC0000005: アクセス違反の読み取り場所 0xFFFFFFFF
私はアセンブリとレジスタを掘り下げることにあまり経験がありませんが、esp = 0x0043f31c
それはesp+3Ch = 0x0043f358
さて、これとこれによると、unpcklps
命令は16バイトのアラインメントを必要とするSSE命令です。0x0043f358
は 16 バイトでアラインされていません。正しいですか? スタックの配置がクラッシュの原因であると考えるのは正しいですか?
もしそうなら、これに値するために私は何をしましたか???? 私は自分のゲームで SSE 命令を使用していないので、このようなアライメントの問題を無視できます - それはナイーブ/間違っていますか? この動作をオフにする方法はありますか?
関連するポイント:
私は最近 Visual Studio 2013 にアップグレードしましたが、このバグがこの頃に発生したのではないかと疑っています。私の問題に似たバグレポートを見つけました。
私のゲームでは、XNAMath、特に XMMATRIX と XMVECTOR を使用しています。通常、これにはすべてを調整する必要があります。ただし、このような問題に遭遇したくなかったので、XNAMath による SIMD 命令の使用をオフにすることになっている _XM_NO_INTRINSICS_ フラグを使用してコンパイルしています。それが今まで問題になったことは一度もありません。私が対処している特定のクラッシュは、私自身のベクター型によるものですが、XMMATRIX コードに十分に近いため、最適化によってすべてが混ざり合っていると考えられます。
私のゲームは Win32 アプリケーションとしてビルドされています。x64 への切り替えはこれに対する実行可能な解決策ですか、それともばかげたやり過ぎでしょうか? 私が使用するライブラリの 64 ビット バージョンを取得する必要がある以外に、どのような結果が生じるかはわかりません。