2017-03-02 3 views
0

J'ai le prochain workflow:Pourquoi je me suis trompé de symboles de débogage?

1) Construire des fichiers dll et pdb.

2) dll Partager sur cutomer

3) Analize vidage de la mémoire du client.

Quand je lance !analyze -v dans WinDbg je suis arrivé (ci-dessous une partie de la production)

.... 
MANAGED_STACK_COMMAND: _EFN_StackTrace 
PRIMARY_PROBLEM_CLASS: WRONG_SYMBOLS 
BUGCHECK_STR: APPLICATION_FAULT_WRONG_SYMBOLS 
// some callstack here 
MODULE_NAME: RTPLogic 
IMAGE_NAME: RTPLogic.dll 
DEBUG_FLR_IMAGE_TIMESTAMP: 58a43706 
STACK_COMMAND: ~541s; .ecxr ; kb 
FAILURE_BUCKET_ID: WRONG_SYMBOLS_c0000374_RTPLogic.dll!CSRTPStack::Finalize 
BUCKET_ID:  X64_APPLICATION_FAULT_WRONG_SYMBOLS_rtplogic!CSRTPStack::Finalize+1da 

On dirait que nous avons symbole de débogage mauvais pour RTPLogic.dll. Je télécharge l'outil ChkMatch. je reçois chemin pdb de windbg

0:541> !lmi RTPlogic.dll 
Loaded Module Info: [rtplogic.dll] 
     Module: RTPLogic 
..... 
      Age: 1, Pdb: D:\Work\path_to_original_pdb\RTPLogic.pdb 
    Image Type: MEMORY - Image read successfully from loaded memory. 
    Symbol Type: PDB  - Symbols loaded successfully from image header. 
       C:\ProgramData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb 
     Compiler: Resource - front end [0.0 bld 0] - back end [9.0 bld 21022] 
    Load Report: private symbols & lines, not source indexed 
       C:\ProgramData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb 

Je les journaux liés à cette décharge et je vois que mes changements apparaissent dans les journaux. Donc, le client n'a pas oublié d'installer ma DLL avant d'obtenir le memdump. Je lance ChkMatch

PS D:\tools> .\ChkMatch.exe -c "D:\Work\path_to_dll\RTPLogic.dll" "C:\Progra 
mData\dbg\sym\RTPLogic.pdb\9F82CDF359044635ADEBA578CA1D1D031\RTPLogic.pdb" 
..... 
Result: Matched 

Comment il possible que je me suis mal symboles de débogage dans une telle situation?

+0

C'est trop peu d'information, trop vague. Pourriez-vous poster une sortie concrète, s'il vous plaît? Quelle est la sortie exacte de ChkMatch, quel est le texte d'avertissement exact dans WinDbg. Quel est le chemin du symbole? Les deux outils utilisent-ils vraiment les mêmes fichiers? Publiez la sortie de 'lm',' .symopt' et '.sympath' dans WinDbg. Normalement, WinDbg ne charge pas du tout les symboles non-correspondants. Si c'est le cas, vous avez déjà "modifié" quelque chose –

+0

Ok, mais maintenant il ressemble à une autre question –

+0

Ce que vous avez ajouté à la question confirme ce que j'avais en tête. Je peux maintenant répondre à votre question avec plus de confiance.+1 pour le suivi et la fourniture des informations nécessaires –

Répondre

1

Les symboles pour RTPLogic.dll!CSRTPStack::Finalize sont corrects, mais les autres symboles requis pour reconstruire la pile d'appels sont incorrects. Il est probable que vous ayez des méthodes de système d'exploitation sur la pile d'appels et que les symboles ntdll ou similaires soient manquants. Depuis ChkMatch, vous ne vérifiez qu'un seul fichier PDB, le résultat de ChkMatch est aussi fiable et correct (pour un PDB) que celui de WinDbg (pour beaucoup de PDB) et ils ne se contredisent pas.

Votre sympathique contient probablement uniquement un chemin local vers vos propres DLL et ne contient aucune information sur le serveur de symboles de Microsoft. Dans la sortie de .sympath (que vous ne publiez pas), je me attends de voir quelque chose comme

0:000> .sympath 
D:\Work\path_to_dll 

Vous devez inclure les symboles Microsoft ainsi, comme décrit dans How to set up symbols in WinDbg. Pour résoudre le problème, utilisez les commandes suivantes:

.symfix+ c:\symbols 
.reload /f 

La sortie de .sympath devrait ressembler à

0:000> .sympath 
D:\Work\path_to_dll;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols 

Cela devrait aider WinDbg dans la reconstruction de la pile d'appel complet, résoudre les méthodes OS de ntdll et d'autres et ainsi se débarrasser du message "mauvais symboles".