Freigeben über


Öffentliche, globale und lokale Symbole

Die Funktionen für die Symbolbehandlung der DbgHelp-API haben sich im Laufe der Jahre weiterentwickelt. Um sicherzustellen, dass Ihr Code in einer Vielzahl von Szenarien funktioniert und vollständige Details zu den Symbolen bereitstellt, verwenden Sie nach Möglichkeit die neuesten Funktionen. SymEnumSymbols ersetzt beispielsweise SymEnumerateSymbols64, SymFromName ersetzt SymGetSymFromName64 und SymFromAddr ersetzt SymGetSymFromAddr64.

Öffentliche Symbole

Anfängliche Versionen von DbgHelp.dll nur die Untersuchung öffentlicher Symbole unterstützt. Diese Symbole werden für jedes Element im Code generiert, das zwischen verschiedenen Quelldateien verfügbar gemacht werden muss. Sie enthalten auch alle Elemente, die aus dem Modul exportiert werden.

Die Symbole werden entweder in das Bild eingebettet oder separat in einer DBG- oder PDB-Datei gespeichert. Die einzigen gespeicherten Informationen sind der Symbolname und die Adresse. Die Namen sind als ergänzte Namen verfügbar. Rufen Sie zum Anzeigen nicht ausgebuchter Namen die SymSetOptions-Funktion mit SYMOPT_UNDNAME auf, oder verwenden Sie die Funktion UnDecorateSymbolName .

Beachten Sie, dass die DbgHelp-API ursprünglich nicht für die Unterstützung mehrerer Instanzen desselben Symbols innerhalb eines Moduls konzipiert wurde. Dies liegt daran, dass öffentliche Symbole auf eindeutige Namen innerhalb eines Moduls beschränkt sind. Daher gibt SymGetSymFromName64 nur das erste Symbol zurück, das übereinstimmt. Um alle übereinstimmenden Symbole abzurufen, rufen Sie SymEnumSymbols auf.

Globale und lokale Symbole

Neuere Versionen von DbgHelp.dll unterstützen globale und lokale Symbole, wenn PDB-Dateien verwendet werden. Diese neuen Versionen umfassen statische Funktionen, Funktionen innerhalb einer Quelldatei, Funktionsparameter und lokale Variablen. Wenn DbgHelp nach einem Symbol sucht, überprüft es die globalen und lokalen Symboltabellen, bevor die öffentliche Symboltabelle überprüft wird. Dies liegt daran, dass für diese Arten von Symbolen mehr Informationen verfügbar sind als für öffentliche Symbole.

Globale und lokale Symbole werden mit nicht ergänzten Namen gespeichert. Daher hat das flag SYMOPT_UNDNAME keine Auswirkung. Sie müssen das Flag SYMOPT_PUBLICS_ONLY verwenden, um ergänzte Symbolnamen zu erhalten. Dies bewirkt, dass DbgHelp nur die öffentlichen Symbole durchsucht.

Um lokale Symbole oder Funktionsparameter anzuzeigen, rufen Sie die SymSetContext-Funktion auf, wobei der InstructionOffset-Member der IMAGEHLP_STACK_FRAME-Struktur auf die Adresse eines beliebigen Funktionssymbols festgelegt ist. Nachfolgende Aufrufe von SymFromName und SymEnumSymbols können im Kontext dieser Adresse ausgeführt werden. Legen Sie hierzu den BaseOfDll-Parameter auf NULL fest, und lassen Sie den Modulspezifizierer im Parameter Name oder Mask aus. Dies zwingt DbgHelp, nach übereinstimmenden Symbolen innerhalb des durch SymSetContext angegebenen Bereichs zu suchen.

Um zu bestimmen, ob ein Symbol ein Parameter ist, überprüfen Sie den Flags-Member der SYMBOL_INFO-Struktur . Wenn das Symbol ein Parameter ist, enthält das Element SYMFLAG_PARAMETER. Wenn es sich um ein lokales Symbol handelt, enthält das Element SYMFLAG_LOCAL.