我们有一个在 Windows 7 上运行的服务器进程,它用 C++ 编写,具有多个线程。我们只是在一个简单的任务中随机崩溃,请参阅以下说明:
--- 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 的对象是有效的,但寄存器已损坏!!!也许我错了,但操作系统会在切换线程时保留所有寄存器,对吧?
所以我的问题是,这里到底发生了什么以及如何解决它?
非常感谢。