J'utilise outils de débogage pour Windows et le message d'erreur suivant s'affiche lors du démarrage de WinDbg/cdb ou ntsd:
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path. *
* Use .symfix to have the debugger choose a symbol path. *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Lors de l'exécution de commandes arbitraires, j'obtiens également le message d'erreur
*** ERROR: Module load completed but symbols could not be loaded for <module>.<ext>
Et ce qui suit semble être lié:
*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
* *
* The Symbol Path can be set by: *
* using the _NT_SYMBOL_PATH environment variable. *
* using the -y <symbol_path> argument when starting the debugger. *
* using .sympath and .sympath+ *
*********************************************************************
Dans un !analyze -v
J'ai aussi vu
DEFAULT_BUCKET_ID: WRONG_SYMBOLS
et
*************************************************************************
*** ***
*** Either you specified an unqualified symbol, or your debugger ***
*** doesn't have full symbol information. Unqualified symbol ***
*** resolution is turned off by default. Please either specify a ***
*** fully qualified symbol module!symbolname, or enable resolution ***
*** of unqualified symbols by typing ".symopt- 100". Note that ***
*** enabling unqualified symbol resolution with network symbol ***
*** server shares in the symbol path may cause the debugger to ***
*** appear to hang for long periods of time when an incorrect ***
*** symbol name is typed or the network symbol server is down. ***
*** ***
*** For some commands to work properly, your symbol path ***
*** must point to .pdb files that have full type information. ***
*** ***
*** Certain .pdb files (such as the public OS symbols) do not ***
*** contain the required information. Contact the group that ***
*** provided you with these symbols if you need this command to ***
*** work. ***
*** ***
*************************************************************************
Comment configurer WinDbg pour rechercher les symboles?
Avertissement: Ceci est destiné à être une question canonique à tous les symboles incorrects messages dans windbg .
Les symboles peuvent être correctement configurés de différentes manières.
[~ # ~] warning [~ # ~] : Les exemples ici utilisent \\server\symbols
qui correspond généralement à un stockage réseau indisponible. Adaptez-le à votre serveur local ou laissez cette partie de côté si vous n'en avez pas. Un serveur inexistant peut provoquer des retards, etc.
Créer un nouveau dossier c:\symbols
pour les symboles fournis par Microsoft. Puis tapez
.symfix+ c:\symbols
.reload
(ou reload -f
si nécessaire)
Assurez-vous de disposer d’une connexion Internet, car elle contactera certains serveurs Microsoft et téléchargera les symboles à partir de là.
Dans 80% des cas, cela pourrait déjà résoudre votre problème de symboles. Si non, lisez la suite.
WinDbg recherchera les symboles dans l’ordre dans lequel ils apparaissent dans le chemin des symboles. Par conséquent, il est judicieux de placer d'abord les symboles locaux, puis de partager un réseau local de la société, puis de télécharger les symboles sur Internet et d'en stocker une copie localement.
.sympath c:\mysymbols ; *** Symbols of your application, locally, flat list of PDB files
.sympath+ cache*c:\symbolcache ; *** (optional) Create a cache for everything
.sympath+ \\server\symbols ; *** Symbols provided from a network share
.symfix+ c:\symbols ; *** Microsoft symbols
Dans WinDbg (mais pas les équivalents en ligne de commande), vous pouvez définir un chemin de symbole par File/Symbol File Path...
ou en appuyant sur Ctrl+S. Vous entrez dans le format suivant
c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols
WinDbg prend également le -y
commutateur de ligne de commande si vous préférez avoir différents liens de bureau avec différentes configurations de chemin de symbole.
WinDbg -y "<symbol path>"
Notez que vous avez besoin du chemin complet ici, sous la forme suivante:
c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols
Il y a une variable d'environnement appelée _NT_SYMBOL_PATH
qui peut également être défini sur un chemin de symbole. Utilisez la syntaxe suivante:
c:\mysymbols;cache*c:\symbolcache;\\server\symbols;SRV*c:\symbols*http://msdl.Microsoft.com/download/symbols
Notez que non seulement WinDbg évalue cette variable, mais également Visual Studio, Process Explorer, Process Monitor et potentiellement d’autres logiciels. Vous pouvez être confronté à un impact sur les performances lors de la définition de cette variable d’environnement.
Si vous avez une configuration de symboles assez complexe comportant plusieurs chemins, familiarisez-vous avec le concept des espaces de travail WinDbg .
Les espaces de travail vous permettent de sauvegarder le chemin du symbole afin de ne pas avoir à ressaisir toutes les commandes dans chaque session de débogage.
Une fois que vous êtes satisfait de l’espace de travail, créez un lien pour que WinDbg puisse inclure -Q
_ qui signifie "Supprimer la question ennuyeuse" Enregistrer l'espace de travail? "".
Jusqu'ici, je suis très heureux d'avoir sauvegardé les symboles dans l'espace de travail Base
.
Les symboles différés (indiqués comme tels lors d'une commande lm
ne posent pas de problème). WinDbg les chargera chaque fois que nécessaire. Pour forcer le chargement de tous, tapez
ld*
Si les symboles (PDB) ne fonctionnent pas comme prévu, utilisez la commande
!sym noisy
pour obtenir plus d'informations sur ce que fait exactement WinDbg lors de la résolution de symboles.
Lorsque vous avez trouvé la solution, désactivez-la avec
!sym quiet
Pour vérifier l'exactitude des symboles individuels, vous pouvez utiliser l'outil symchk
fourni avec WinDbg.
Symchk /if <exe> /s <symbol path> /av /od /pf
/if = input is a file
/s = symbol file path
/od = all details
/av = verify
/pf = check if private symbols are available
ou obtenez ChkMatch qui est un peu plus facile à utiliser
ChkMatch -c <exe file> <pdb file>
Si vous ne parvenez pas à accéder aux symboles d’un partage de réseau, assurez-vous de vous être connecté au partage de réseau auparavant. AFAIR, WinDbg ne demande pas d'informations d'identification.
tilisez Microsoft Symbol Server pour obtenir des fichiers de symboles de débogage (devrait rediriger ici mais la redirection est actuellement interrompue)