複数のスレッドを持つ C++ で記述された Windows 7 で実行されているサーバー プロセスがあります。そして、単純な割り当てでランダムなクラッシュが発生しました。次の手順を参照してください。
--- some function without the source:
0136E0F0 mov eax,dword ptr [esp+8]
0136E0F4 mov edx,dword ptr [esp+0Ch]
0136E0F8 push esi
0136E0F9 mov esi,dword ptr [ecx+10h] << read a member variable to esi
0136E0FC add dword ptr [ecx+esi*8+30h],eax << access violation here!
...
...
奇妙なことに、クラッシュが発生したとき、[ecx+10h] の値は 0 ですが、ESI はゼロ以外の無効な値です! そして、最後の命令が無効なメモリに書き込もうとしています! (クラッシュダンプファイルから確認しました)。つまり、ecx のオブジェクトは有効ですが、レジスタが壊れています!!! たぶん私が間違っているかもしれませんが、スレッドを切り替えるときにOSはすべてのレジスタを保持しますよね?
だから私の質問は、ここで実際に何が起こったのか、そしてそれを修正する方法は?
どうもありがとう。