Можно ли определить, какая строка в источнике имеет проблемы в соответствии с разборкой? - PullRequest
1 голос
/ 10 октября 2010

Проблема существует на 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;
            }

Можно ли определить, какая строка в источнике имеет проблему в соответствии с разборкой?

UPDATE

Что означает __RTC_CheckEsp?

UPDATE2

Воспроизведение в отладчике

alt text

Update3

alt text

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Похоже, это вызов 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)
0 голосов
/ 10 октября 2010

Вы можете использовать DIA SDK , чтобы запросить, какая строка источника соответствует RVA.Обратите внимание, что DIA требует символы (т.е. файлы PDB).Посмотрите на этот SO вопрос на RVA.

После того, как вы определили RVA для рассматриваемой разборки, вы можете загрузить PDB для этого двоичного файла.Создайте сеанс, а затем посмотрите на функцию findLinesByRVA() в интерфейсе IDiaSession.Это вернет вам перечисление строк, которые соответствуют этому RVA.Запросите итоговые IDiaLineNumber экземпляры, для какого файла соответствует номер строки.

В ответ на ваше обновление __RTC_CheckEsp - это вызов, который проверяет правильность esp, stack, register.Он вызывается для гарантии того, что значение esp было сохранено при вызове функции.Это то, что компилятор вставляет для вас.

...