2009-03-20 6 views
0

Je suis intéressé par le fichier de symboles utilisé lorsque nous analysons un fichier de vidage à l'aide de Windbg ou de Visual Studio. Supposons que mon application utilise une bibliothèque d'utilitaires et que la bibliothèque d'utilitaires ait un fichier de symboles privé associé. Lorsqu'il y a un vidage sur incident dans mon application, j'ai besoin du symbole de la bibliothèque utilitaire pour analyser la pile d'appels complète. Mais parfois, les environnements build/runtime/debug sont installés avec différentes versions de la bibliothèque d'utilitaires - qui sont (à coup sûr) des différentes versions des symboles de la bibliothèque d'utilitaires. Supposons que nous ayons une version (par exemple la version A) de la bibliothèque utilitaire (et du symbole associé) pour construire mon application, en utilisant une autre version (par exemple la version B) de la bibliothèque utilitaire (et le symbole associé) est crash, et en utilisant une autre version différente (par exemple la version C) de la bibliothèque utilitaire (et le symbole associé) dans Windbg lorsque j'analyse le vidage sur incident.Problème de symbole de débogage

Ma question est, lorsque le plantage est genarated en exécution, le symbole version B est utilisé pour générer le vidage sur incident (pour remplir le vidage avec des informations de symbole)? Mais lors de l'utilisation d'une version différente du symbole C dans l'environnement de débogage Windbg, il y aura un problème de correspondance de symbole? Et quelle version de la bibliothèque est utilisée pour construire n'a pas d'importance? Mes compréhensions sont-elles toutes correctes?

merci à l'avance, George

Répondre

1

En général, les symboles doivent être dans le même fichier que le code (qui est pourquoi les versions de débogage sont généralement plus). Je ne peux pas me souvenir d'un cas où un débogueur tirerait les symboles d'un binaire tout en en exécutant un autre - mais alors, ceci est de la connaissance générale et pas d'aucune information spécialisée au sujet de votre environnement.

+0

Hi MarkusQ, pour des raisons non techniques (les commandes build/run/debug sont exécutées par différentes parties et ne sont pas encore synchronisées) différents binaires sont utilisés. Ma question est quand le dump est produit, est-ce que le dump dépend des symboles de bibliothèque d'exécution pour remplir l'information de vidage? – George2

+0

@George - Je parlais juste en général. Voir la réponse de Matt Ellis pour de bons détails. (Je le vénère) – MarkusQ

+0

Salut MarkusQ, je n'ai pas trouvé ma réponse à partir de son post - pourquoi il y aura une non-concordance de symboles (ou signaler une mauvaise information) si l'environnement (qui génère un crash dump) utilise une version différente du symbole , mais l'environnement utilisé pour exécuter windbg pour analyser la décharge utilise une autre version du symbole? – George2

3

Il semble que vous souhaitiez utiliser un Symbol Server afin que WinDBG ou VS puissent extraire les symboles correspondant à la version de la bibliothèque que vous déboguez. S'il s'agit d'un composant tiers et que vous avez des symboles privés, vous pouvez soit les placer dans votre propre serveur, soit voir si le tiers a un serveur de symboles public.

Windbg ne chargera pas les symboles s'ils ne correspondent pas à la DLL que vous déboguez, vous pouvez utiliser! Sym bruyant pour en savoir plus sur le processus de chargement des symboles. Si vous choisissez de ne pas utiliser un serveur de symboles, vous pouvez gérer manuellement tous les pdb et les charger manuellement dans windbg (utilisez lm v pour obtenir des informations détaillées sur un module chargé dans votre processus)

+0

Je veux savoir pourquoi il y aura incompatibilité de symbole (ou signaler des informations erronées) si l'environnement (qui génère un vidage sur incident) utilise une version différente de symbole, mais l'environnement utilisé pour exécuter windbg pour analyser la sauvegarde utilise une autre version de symbole? – George2

+0

Je suis d'accord avec vous en utilisant le serveur de symboles est une bonne solution pour résoudre ce problème, mais dans mon environnement, pour des raisons non techniques, runtime/build/debug sont exécutés par différents groupes de personnes et parfois difficile de synchroniser le code immédiatement. :-) – George2

+0

Dans votre premier exemple, vous obtiendrez une correspondance manquante si les symboles de la machine sur lesquels vous utilisez le débogage ne correspondent pas à la DLL sur laquelle vous avez effectué le vidage. Dans ce cas, vous devez copier les symboles sur votre machine locale, ajouter le répertoire à l'endroit où ils sont sympathiques, puis faire un.reload/f –