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意思?

更新2

在调试器中重现

替代文字

更新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, stack, register 正确性的调用。调用它以确保esp在函数调用中保存 的值。这是编译器为您插入的东西。

于 2010-10-10T03:40:47.723 回答