Symboles publics, globaux et locaux
Les fonctionnalités de gestion des symboles de l’API DbgHelp ont évolué au fil des ans. Pour vous assurer que votre code fonctionne dans divers scénarios et fournit des détails complets sur les symboles, utilisez les fonctions les plus récentes dans la mesure du possible. Par exemple, SymEnumSymbols remplace SymEnumerateSymbols64, SymFromName remplace SymGetSymFromName64 et SymFromAddr remplace SymGetSymFromAddr64.
Symboles publics
Les versions initiales de DbgHelp.dll prises en charge l’examen des symboles publics uniquement. Ces symboles sont générés pour tout élément du code qui doit être exposé entre différents fichiers sources. Ils incluent également tous les éléments exportés hors du module.
Les symboles sont incorporés dans l’image ou stockés séparément dans un fichier .dbg ou .pdb. Les seules informations stockées sont le nom et l’adresse du symbole. Les noms sont disponibles sous forme de noms décorés. Pour afficher les noms non supprimés, appelez la fonction SymSetOptions avec SYMOPT_UNDNAME ou utilisez la fonction UnDecorateSymbolName .
Notez que l’API DbgHelp n’a pas été initialement conçue pour prendre en charge plusieurs instances du même symbole au sein d’un module. Cela est dû au fait que les symboles publics sont limités aux noms uniques au sein d’un module. Par conséquent, SymGetSymFromName64 retourne uniquement le premier symbole correspondant. Pour récupérer tous les symboles qui correspondent, appelez SymEnumSymbols.
Symboles globaux et locaux
Les versions plus récentes de DbgHelp.dll prennent en charge les symboles globaux et locaux lors de l’utilisation de fichiers .pdb. Ces nouvelles versions incluent des fonctions statiques, des fonctions délimitées dans un fichier source, des paramètres de fonction et des variables locales. Lorsque DbgHelp recherche un symbole, il vérifie les tables de symboles globaux et locaux avant de vérifier la table de symboles publics. Cela est dû au fait qu’il y a plus d’informations disponibles pour ces types de symboles que pour les symboles publics.
Les symboles globaux et locaux sont stockés avec des noms non décorées. Par conséquent, l’indicateur SYMOPT_UNDNAME n’a aucun effet. Pour obtenir des noms de symboles décorés, vous devez utiliser l’indicateur SYMOPT_PUBLICS_ONLY. Cela oblige DbgHelp à rechercher uniquement les symboles publics.
Pour afficher les symboles locaux ou les paramètres de fonction, appelez la fonction SymSetContext avec le membre InstructionOffset de la structure IMAGEHLP_STACK_FRAME défini sur l’adresse d’un symbole de fonction. Les appels suivants à SymFromName et SymEnumSymbols peuvent fonctionner dans le contexte de cette adresse. Pour ce faire, définissez le paramètre BaseOfDll sur NULL et omettez le spécificateur de module dans le paramètre Name ou Mask . Cela force DbgHelp à rechercher des symboles correspondants dans l’étendue indiquée par SymSetContext.
Pour déterminer si un symbole est un paramètre, case activée le membre Flags de la structure SYMBOL_INFO. Si le symbole est un paramètre, le membre contient SYMFLAG_PARAMETER. S’il s’agit d’un symbole local, le membre contient SYMFLAG_LOCAL.