查看 Visual C++ 调试器会话的屏幕截图:
(来源:lviv.ua)
执行点现在位于虚函数内部。“mDb”是对该类成员的对象的引用。“mDb”的类型为CDbBackend&。只有一个线程。红色矩形中的值应该相等,......但它们不是。这怎么可能?
正在调试的代码已使用 BoundsChecker(内存调试器和分析器)进行了检测。这种差异导致后来的崩溃。非插桩代码不会导致任何这些影响。我认为现在责怪 BoundsChecker 还为时过早——它很可能是 BoundsChecker 揭示的我的程序中的一个隐藏错误,这就是为什么我非常倾向于了解这种情况的原因。
为“b = &mDb”语句生成的程序集如下,以防相关。在此处捕获了通过此程序集的步骤,并显示了监视和寄存器(500kb avi 文件)。
007AB7B0 push 4
007AB7B2 push 80000643h
007AB7B7 push 4
007AB7B9 push 0C0002643h
007AB7BE lea eax,[ebp-10h]
007AB7C1 push eax
007AB7C2 call dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)]
007AB7C8 mov eax,dword ptr [eax]
007AB7CA add eax,1CCh
007AB7CF push eax
007AB7D0 call dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)]
007AB7D6 mov dword ptr [ebp-70h],eax
007AB7D9 push dword ptr [ebp-70h]
007AB7DC push 4
007AB7DE push 50000643h
007AB7E3 lea eax,[ebp-20h]
007AB7E6 push eax
007AB7E7 call dword ptr [_numega_finalcheck_Y_110456 (8FA8ECh)]
007AB7ED mov ecx,dword ptr [ebp-70h]
007AB7F0 mov ecx,dword ptr [ecx]
007AB7F2 mov dword ptr [eax],ecx