1

我们有一个在 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 的对象是有效的,但寄存器已损坏!!!也许我错了,但操作系统会在切换线程时保留所有寄存器,对吧?

所以我的问题是,这里到底发生了什么以及如何解决它?

非常感谢。

4

2 回答 2

1

还有什么其他代码在 ecx+10h 处弄乱了数据?

从内存到 esi 的 mov 和后来的 esi 使用之间有很大的空间,因为内存已经改变了。然后看起来好像 esi 应该有一个很好的价值。

想象一下,在从该位置读取 0(?) 之后,一个不同的线程或中断介入以在 ecx+10h 处放置有效的东西。

于 2012-11-08T18:19:33.753 回答
0

这些“不可能的”错误有一个很常见的原因:硬件故障。CPU可能会失败或太热。

这种情况发生的频率比人们想象的要多。硬件不工作或不工作。除了 1e10 机会中的一种情况外,它可以大部分工作。

于 2012-06-07T12:49:21.303 回答