2009-11-06 5 views
3

Regardez cette capture d'écran d'une session de débogage de Visual C++:débogueur Visual C++ et BoundsChecker mystère

http://yp.lviv.ua/philez/wtf.PNG

Le point d'exécution est maintenant à l'intérieur d'une fonction virtuelle. "mDb" est une référence à un objet qui est le membre de cette classe. "mDb" a le type CDbBackend &. Il n'y a qu'un seul fil. Les valeurs dans les rectangles rouges devraient être égales, ... mais elles ne le sont pas. Comment cela est-il possible?

Le code en cours de débogage a été instrumenté avec BoundsChecker (un débogueur de mémoire et un profileur). La divergence conduit à un accident plus tard. Le code non instrumenté n'entraîne aucun de ces effets. Je pense qu'il est trop tôt pour blâmer BoundsChecker - il pourrait bien s'agir d'un bug caché dans mon programme que BoundsChecker a révélé, c'est pourquoi je suis très enclin à comprendre la situation.

L'assemblage généré pour l'instruction "b = & mDb" est le suivant, dans le cas où cela est pertinent. Le déplacement à travers cet assemblage, avec la montre et les registres visibles, est capturé here (fichier avi de 500 kb).

007AB7B0 push  4  
007AB7B2 push  80000643h 
007AB7B7 push  4  
007AB7B9 push  0C0002643h 
007AB7BE lea   eax,[ebp-10h] 
007AB7C1 push  eax 
007AB7C2 call  dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)] 
007AB7C8 mov   eax,dword ptr [eax] 
007AB7CA add   eax,1CCh 
007AB7CF push  eax 
007AB7D0 call  dword ptr [_numega_finalcheck_C_110456 (8FA8A8h)] 
007AB7D6 mov   dword ptr [ebp-70h],eax 
007AB7D9 push  dword ptr [ebp-70h] 
007AB7DC push  4  
007AB7DE push  50000643h 
007AB7E3 lea   eax,[ebp-20h] 
007AB7E6 push  eax 
007AB7E7 call  dword ptr [_numega_finalcheck_Y_110456 (8FA8ECh)] 
007AB7ED mov   ecx,dword ptr [ebp-70h] 
007AB7F0 mov   ecx,dword ptr [ecx] 
007AB7F2 mov   dword ptr [eax],ecx 

Répondre

0

Est-ce que mDb est également de type CDbBackend? Si non, alors la divergence est due au casting.

Étant donné:

class A 
{ 
    // Stuff 
}; 

class B : public A 
{ 
    // More stuff 
}; 

B *b = new B; 
A *a = (A *)&b; 

puis b et pourrait ou non être équivalent en fonction de ce que exactement « Stuff » et « Plus Stuff » sont. Les plus grandes choses qui vont changer les castings de pointeurs sont les virtuals et l'héritage multiple. Si c'est le cas dans votre exemple, la sortie de votre débogueur est correcte et normale. Si vous développez la vue de classe pour mDb, je ne serais pas surpris si vous trouvez un pointeur CDbBackend contenu à l'intérieur qui correspond à votre deuxième sortie ci-dessous.

+0

Oui.Il a le type de CDbBackend & et est déclaré dans la classe de base. Je suis en train d'éditer le post. Quoi qu'il en soit, la différence entre les pointeurs est si énorme qu'il pourrait difficilement être un décalage lié à la disposition de l'héritage. – user38329

1
  1. Veuillez le reconstruire et le tester à nouveau. (Je sais que cela semble stupide :)

  2. Le code est compilé en mode débogage sans aucune optmisation, non? Je suppose. Mais, dans le démontage, aucune information symbolique n'est présentée. Je ne peux voir que [ebp - offset]; ceci devrait être représenté comme un nom symbolique tel que b. Veillez à activer "Afficher les noms des symboles" dans la vue de démontage. Je ne suis pas sûr que le code de désassemblage que vous avez collé est le code b = &mDb. On dirait que [ebp-10h] ou [ebp-70h] serait b, mais mDb ne semble pas être ici. Tout le code ici appelle simplement une fonction instrumentée. Pourriez-vous donner plus de désassemblage avec le code source autour d'eux?

  3. J'ai une expérience où les informations de débogage sont incorrectement générées, donc le débogage symbolique a donné une valeur incorrecte. Ma solution de contournement consistait à modifier la disposition des variables membres et à mettre du padding dans la pile locale. Mais je ne suis pas sûr que ce soit un bug de compilateur. Je travaillais sur Visual Studio 2008 avec le compilateur Intel C/C++, et le projet était assez complexe.

L'information est quelque peu insuffisante pour résoudre ce problème. Ce serait mieux si vous donniez plus de désassemblage.

+0

1. Ne semble pas si stupide, mais j'ai déjà essayé plusieurs fois, en vain. 2. Oui, débogage et aucune optimisation. En ce qui concerne la substitution de symboles: c'est comme ça que le désassemblage m'a toujours cherché ... Je ne me souviens pas de registres de substitution de débogueur et d'adresses avec des symboles - ça n'a pas toujours de sens. "Afficher les noms des symboles" est activé. 3. Je suis sûr que c'est le bon démontage. S'il vous plaît jetez un coup d'oeil vous-même: J'ai capturé une vidéo à travers le démontage du code instrumenté et non instrumenté. Les vidéos sont sur http://yp.lviv.ua/tmp. Merci! – user38329