Symboles publics, globaux et locaux

Les fonctionnalités de gestion des symboles de l’API DbgHelp ont évolué au fil des années. Pour vous assurer que votre code fonctionne dans différents scénarios et fournit des détails complets sur les symboles, utilisez les fonctions les plus récentes chaque fois que cela est possible. Par exemple, SymEnumSymbols remplace SymEnumerateSymbols64, SymFromName remplace SymGetSymFromName64et SymFromAddr remplace SymGetSymFromAddr64.

Symboles publics

Les versions initiales de DbgHelp.dll prises en charge en examinant uniquement les symboles publics. 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 qui sont exportés à partir du module.

Les symboles sont soit incorporés dans l’image, soit 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 décoré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 à des noms uniques au sein d’un module. Par conséquent, SymGetSymFromName64 retourne uniquement le premier symbole qui correspond. Pour récupérer tous les symboles correspondants, 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 les fonctions statiques, les fonctions étendues dans un fichier source, les paramètres de fonction et les variables locales. Lorsque DbgHelp recherche un symbole, il vérifie les tables de symboles globales et locales avant de vérifier la table de symboles publique. Cela est dû au fait que des informations supplémentaires sont disponibles pour ces types de symboles et qu’elles ne sont disponibles que pour les symboles publics.

Les symboles globaux et locaux sont stockés avec des noms non décorés. Par conséquent, l' _ indicateur SYMOPT UNDNAME n’a aucun effet. Pour connaître les noms de symboles décorés, vous devez utiliser l' _ indicateur SYMOPT public _ only. Cela amène le 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 de _ _ Frame de pile imagehlp défini sur l’adresse de n’importe quel symbole de fonction. Les appels suivants à SymFromName et SymEnumSymbols peuvent fonctionner dans le contexte de cette adresse. Pour ce faire, affectez la valeur null au paramètre BaseOfDll et omettez le spécificateur de module dans le paramètre Name ou Mask . Cela force le DbgHelp à rechercher des symboles correspondants dans l’étendue indiquée par SymSetContext.

Pour déterminer si un symbole est un paramètre, vérifiez le membre Flags de la structure des _ informations de symbole . Si le symbole est un paramètre, le membre contient le _ paramètre SYMFLAG. S’il s’agit d’un symbole local, le membre contient SYMFLAG _ local.