Utiliser les symboles de Debug Publiques de Microsoft
Remarque : Si vous ne savez pas ce que sont les symboles,
lisez tout d'abord ma page décrivant comment
les générer dans vos applications
Microsoft met à disposition des Serveurs de symboles, et il est très simple de
configurer vos outils de développement pour qu'ils téléchargent automatiquement les
symboles publiques des dll et exécutables correspondant précisément à votre Windows
(ou celui d'où provient un crash dump que vous analysez). Ceci fonctionnera depuis
Visual C++ 2003, depuis WinDBG (des
Microsoft
Debugging Tools for Windows), depuis l'outil
Process Explorer
de Sysinternals, depuis l'outil
PEBrowse Professional, de
SmidgeonSoft, et depuis d'autres outils de
Debugging.
Remarque : Vous remarquerez que je ne cite pas, ici, Visual C++ 6,
et c'est exprès : avec lui, il est possible d'installer les "gros" packages de symboles
que fournissait Microsoft, mais il n'est pas possible d'utiliser de façon automatiques
les serveurs de symboles tels que c'est précisé ici. Si vous souhaitez absolument le faire,
il y a quelques contournements possible : cherchez sur les NewsGroup, vous trouverez quelques
solutions. En fait, je n'en précise aucune ici, car bien que travaillant encore avec
Visual C++ 6, les projets sur lesquels je l'utilise en ce moment font planter son debugger.
J'utilise donc WinDBG qui est en fait infiniment plus puissant : j'en suis donc très content.
A quoi cela sert-il ?
Et bien tout d'abord, on peut se demander quel peut être l'intérêt d'avoir ces symboles.
Voici quelques pistes :
- Si vous ne savez pas ce que sont les symboles, lisez tout d'abord
ma page décrivant comment les générer dans vos
applications
- Grâce aux symboles de Windows, la pile affichée par votre debugger ira plus loin, et
par exemple, si votre programme plante au fin fond de kernel32.dll ou ntdll.dll, vous
verrez
plus précisément les noms des fonctions dans lesquels vous êtes : cela proviendra
très probablement d'une erreur dans votre code, mais voir cette pile plus complète
vous donnera parfois une idée plus précise de sa nature.
- Grâce à ces symboles, si votre pile "traverse" du code de Microsoft, vous
verrez des noms de fonctions clairs, et traverser ce genre de code est
extrêmement fréquent : par exemple, pour des programmes serveur, vous traversez
souvent des dll de com, dcom et rpc, et pour les programmes interactifs, vous
traversez user32.dll, et d'autres dll de contrôles Windows, etc.
- Grâce à ces symboles, vous pourrez regarder les différentes piles de tout vos
threads, et par exemple, vous pourrez reconnaître à leur pile les threads en appel COM et DCOM
sortant, entrants, inter-appartement, et aussi à distance ou non.
- Grâce à eux, vous pourrez utiliser certaines fonctions évoluées
d'outils de Debugging (comme WinDBG), qui ne fonctionnent qu'avec les symboles.
En effet, ils profitent de ces symboles pour avoir des structure de données
correspondant à votre version de Windows.
- Vous pourrez aussi, dans un but informatif bien sûr, examiner certaines
portion du code dans des dll et outils Microsoft.
- Et j'oublie probablement encore plein d'exemples où c'est utile voir
indispensable.
Comment fait-on ???
Alors après mon "blabla", vous allez rire : l'explication est bien
plus longue que leur configuration : c'est très très très simple !!!
En fait, il suffit d'avoir une connexion Internet directe, et de :
- Créer un répertoire temporaire où se téléchargeront les symboles : par exemple,
d:\websymbols
- Mettre une variable d'environnement _NT_SYMBOL_PATH à
SRV*d:\websymbols*http://msdl.microsoft.com/download/symbols
- Et c'est tout, les symboles seront automatiquement téléchargés et utilisés par
Visual C++ 2003, WinDBG, Process Explorer etc. !!! Vous pouvez par exemple faire
un essai avec
Process Explorer
de Sysinternals, allez dans les
properties d'un processus, et ensuite dans l'onglet threads. La
première fois, ce sera un peu lent, car les symboles se téléchargeront : regardez
votre répertoire se remplir. Ici, vous pourez alors double-cliquer sur un thread
puis voir sa pile courante.
En fait, il y a d'autres options, et je vous invite à les regarder dans l'aide des
regarder dans l'aide des Microsoft
Debugging Tools for Windows, dans les rubriques :
- Using Debugging Tools for Windows, Symbols,
Using Symbol Servers and Symbol Stores, Using SymSrv.
- Using Debugging Tools for Windows, Debugger Reference,
Environment Variables, General Environment Variables.
Je vous entends déjà pleurer, "ma société a eu l'extrême bêtise de mettre un serveur proxy
http...
Comment puis-je faire ???". Dans ce cas, vous pouvez regarder du côté de la variable d'environnement
_NT_SYMBOL_PROXY : toujours dans la documentation des
Microsoft
Debugging Tools for Windows, regardez les rubriques :
- Using Debugging Tools for Windows, Debugger Reference,
Environment Variables, General Environment Variables.
- Using Debugging Tools for Windows, Symbols,
Using Symbol Servers and Symbol Stores, Firewalls and Proxy Servers
Et si ceci ne suffit pas (votre proxy est non standard, ou bien vous n'avez pas
accès du tout à internet), faites du lobbying pour rendre possible l'accès
direct (ou via un proxy standard) l'accès à ce serveur de symbole correspondant
aux sous répertoires de http://msdl.microsoft.com/download/symbols, et même
par la même occasion, de tout microsoft.com.
Et voilà
Comme vous pouvez le constater, c'est tout simple et le seul inconvénient
est que ça prends un peu de place disque. Donc pourquoi s'en priver ???