1

問題は次の場所にあり017D0B5F call eax ます:

017D0B56  mov         esi,esp 
017D0B58  mov         edx,dword ptr [ebp-20h] 
017D0B5B  push        edx  
017D0B5C  mov         eax,dword ptr [ecx+8] 
017D0B5F  call        eax  
017D0B61  cmp         esi,esp 
017D0B63  call        @ILT+2525(__RTC_CheckEsp) (17C49E2h) 
017D0B68  cmp         dword ptr [ebp-2Ch],0 
017D0B6C  je          CSourceStream::DoBufferProcessingLoop+10Ah (17D0B8Ah) 
017D0B6E  mov         eax,dword ptr [ebp-2Ch] 
017D0B71  push        eax  
017D0B72  push        offset string "Deliver() returned %08x; stoppin"... (17F7278h) 

対応するソースは次のとおりです。

 // Virtual function user will override.
 hr = FillBuffer(pSample);

 if (hr == S_OK) {
 hr = Deliver(pSample);
            pSample->Release();

            // downstream filter returns S_FALSE if it wants us to
            // stop or an error if it's reporting an error.
            if(hr != S_OK)
            {
              DbgLog((LOG_TRACE, 2, TEXT("Deliver() returned %08x; stopping"), hr));
              return S_OK;
            }

ソースのどの行に問題があるかを逆アセンブルで推測することはできますか?

アップデート

とは__RTC_CheckEspどういう意味ですか?

UPDATE2

デバッガで再現

代替テキスト

更新3

代替テキスト

4

2 に答える 2

2

pSample->Release() 呼び出しのようです - どのようなエラーが表示されますか?

017D0B56  mov         esi,esp 
017D0B58  mov         edx,dword ptr [ebp-20h]     // get the pSample this pointer
017D0B5B  push        edx                         // push it
017D0B5C  mov         eax,dword ptr [ecx+8]       // move pSample to eax
017D0B5F  call        eax                         // call it
017D0B61  cmp         esi,esp                     // maybe a stack/heap check?
017D0B63  call        @ILT+2525(__RTC_CheckEsp) (17C49E2h) 
017D0B68  cmp         dword ptr [ebp-2Ch],0       // if hr!=S_OK
017D0B6C  je          CSourceStream::DoBufferProcessingLoop+10Ah (17D0B8Ah) 
017D0B6E  mov         eax,dword ptr [ebp-2Ch] 
017D0B71  push        eax                         // get ready to call DbgLog
017D0B72  push        offset string "Deliver() returned %08x; stoppin"... (17F7278h)
于 2010-10-10T04:24:37.470 に答える
0

DIA SDKを使用して、RVAに対応するソースの行を照会できます。DIAにはシンボル(つまり、PDBファイル)が必要であることに注意してください。RVAに関するこのSOの質問を見てください。

問題の逆アセンブルのRVAを決定したら、そのバイナリのPDBをロードできます。セッションを作成してfindLinesByRVA()から、インターフェイスの関数を確認しIDiaSessionます。これにより、そのRVAに対応する行の列挙が返されます。IDiaLineNumber結果のインスタンスで、行番号が対応するファイルを照会します。

更新に応答するのは、スタック、レジスタ__RTC_CheckEspの正確さを検証する呼び出しです。espの値が関数呼び出し全体で確実espに保存されるようにするために呼び出されます。これは、コンパイラーが挿入するものです。

于 2010-10-10T03:40:47.723 に答える