我有一个复杂的 32 位多线程程序在 64 位 Windows Server 2008 R2 Enterprise SP1 系统上运行。
在 MSVC 调试器下运行时,我有时会在 winsock 代码中的一条指令上报告访问冲突而停止,该指令没有明显的原因导致异常。一个典型的例子:
调试器报告了 82 个线程。当访问冲突触发程序中断时选择的那个显示这个......
寄存器:
EAX = 0DBC9918 EBX = 54007022
ECX = 00374248 EDX = 00000000
ESI = 00000000 EDI = 00370924
EIP = 745616B4 ESP = 0DBC98C8
EBP = 0DBC9934 EFL = 00010246
拆卸:
745616B4 68 27 2F 58 74 push 74582F27h
745616B9 64 FF 35 00 00 00 00 push dword ptr fs:[0]
745616C0 8B 44 24 10 mov eax,dword ptr [esp+10h]
745616C4 89 6C 24 10 mov dword ptr [esp+10h],ebp
内存(地址 esp-4)
0DBC98C4 00370844 745636C2 74563808 0000003C
0DBC98D4 75B83D70 00000002 00000001 00000000
堆栈边界数据来自几个推送和一个调用,似乎工作得很好:
745636B6 6A 3C push 3Ch
745636B8 68 08 38 56 74 push 74563808h
745636BD E8 F2 DF FF FF call 745616B4
745636C2 ...
考虑到它的地址和之前的成功推送,推送似乎不应该遇到保护页面异常。从调用堆栈信息来看,其他线程似乎不太可能导致异常。我不知道是否有一些我忽略的机制可能会在该指令上产生访问冲突,或者调试器是否误导了我。任何你能散发出来的光都将不胜感激。