1

我有一个复杂的 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 ...

考虑到它的地址和之前的成功推送,推送似乎不应该遇到保护页面异常。从调用堆栈信息来看,其他线程似乎不太可能导致异常。我不知道是否有一些我忽略的机制可能会在该指令上产生访问冲突,或者调试器是否误导了我。任何你能散发出来的光都将不胜感激。

4

1 回答 1

0

那肯定是DEP(数据执行预防)。只是有完全相同的问题,类似的代码;在这些东西上花了几个小时;一直忘记 UAC 和 DEP 是两个不同的东西。

于 2014-07-22T14:55:00.580 回答