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

スタック フロンティア データは、問題なく機能しているように見える 2 回のプッシュと呼び出しから得られます。

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