2010-10-10 29 views
1

Le problème existe à 017D0B5F call eax:Est-il possible de déduire quelle ligne dans la source a le problème selon le démontage?

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) 

est ici la source correspondante:

// 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; 
      } 

Est-il possible de déduire quelle ligne source a le problème selon le démontage?

MISE À JOUR

Qu'est-ce que cela signifie __RTC_CheckEsp?

MAJ2

Reproduire débogueur

alt text

Update3

alt text

+0

Avez-vous essayé de le reproduire dans un débogueur? – sbi

+0

Oui, je viens de joindre la capture d'écran pour cela. – ollydbg

+0

1. Êtes-vous sûr que Deliver ne le "libère" pas pour vous? C'est à dire une erreur de double libération. 2. Vérifiez que le vtable semble correct. 3. Il est également possible que Release soit mal implémentée dans ce cas. – FuleSnabel

Répondre

2

On dirait que c'est l'appel pSample-> Release() - quelle erreur obtenez-vous?

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

Voici l'erreur: 'Exception non gérée à 0x0469b000 dans FlashPlayer.exe: 0xC0000005: violation d'accès emplacement d'écriture 0x65bb27f6.'. Êtes-vous sûr que c'est 'pSample-> Release()' et non 'Deliver (pSample);'? – ollydbg

+0

@Jeff, votre déclaration pour l'appel est erronée. Vous dites "appelez". Qu'est-ce que ça veut dire? 'Release 'est probablement une fonction virtuelle ici et le' mov eax, dword ptr [ecx + 8] 'calcule très probablement cette adresse de fonction et c'est ce qu'elle appelle. – linuxuser27

+0

Oui, il s'agit de l'appel Release(). La 3ème fonction dans la v-table pour un objet COM (ecx + 8). On dirait une corruption de tas pour moi. –

0

Vous pouvez utiliser le DIA SDK q quelle ligne de source correspond à un RVA. Notez que DIA nécessite les symboles (c'est-à-dire les fichiers PDB). Regardez ce SO question sur les RVA.

Après avoir déterminé le RVA pour le désassemblage en question, vous pouvez charger la PDB pour ce binaire. Créez une session et puis regardez la fonction findLinesByRVA() sur l'interface IDiaSession. Cela vous retournera une énumération des lignes qui correspondent à cette RVA. Interrogez les instances IDiaLineNumber pour le fichier correspondant au numéro de ligne.

En réponse à votre mise à jour, __RTC_CheckEsp est un appel qui vérifie l'exactitude du registre esp, pile. Il est appelé pour s'assurer que la valeur du esp a été enregistrée lors d'un appel de fonction. C'est quelque chose que le compilateur insère pour vous.

+0

Existe-t-il un utilitaire binaire pour que je n'ai pas besoin de le construire moi-même? – ollydbg

+0

Je ne suis pas au courant d'un utilitaire qui fait cela pour vous autre que Visual Studio, Windbg ou un autre débogueur. Venez y penser cependant, ce serait une belle utilité. Peut-être un projet? :) – linuxuser27

+0

Est-il possible de l'analyser manuellement pour ce cas? – ollydbg