Öffentliche, globale und lokale Symbole
Die Funktionen für die Symbolverarbeitung 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 die neuesten Funktionen, wenn möglich. Beispielsweise ersetzt SymEnumSymbolsSymEnumerateSymbols64, SymFromName ersetzt SymGetSymFromName64, und SymFromAddr ersetzt SymGetSymFromAddr64.
Öffentliche Symbole
Die ersten Versionen von DbgHelp.dll unterstützen das Untersuchen nur öffentlicher Symbole. 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 verzierte Namen verfügbar. Rufen Sie zum Anzeigen nicht berücksichtigter Namen die SymSetOptions--Funktion mit SYMOPT_UNDNAME auf, oder verwenden Sie die funktion "UnDecorateSymbolName".To view unecorated names, call the SymSetOptions function with SYMOPT_UNDNAME, or use the UnDecorateSymbolName function.
Beachten Sie, dass die DbgHelp-API ursprünglich nicht entwickelt wurde, um mehrere Instanzen desselben Symbols in einem Modul zu unterstützen. 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. Rufen Sie SymEnumSymbolsauf, um alle übereinstimmenden Symbole abzurufen.
Globale und lokale Symbole
Neuere Versionen von DbgHelp.dll unterstützen globale und lokale Symbole bei Verwendung von PDB-Dateien. Diese neuen Versionen umfassen statische Funktionen, Funktionen, die in einer Quelldatei, Funktionsparametern und lokalen Variablen enthalten sind. 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 zur Verfügung stehen, als für öffentliche Symbole verfügbar sind.
Globale und lokale Symbole werden mit nicht bewerteten Namen gespeichert. Daher hat das SYMOPT_UNDNAME Flag keine Auswirkung. Um dekorative Symbolnamen zu erhalten, müssen Sie die SYMOPT_PUBLICS_ONLY-Kennzeichnung verwenden. Dies bewirkt, dass DbgHelp nur die öffentlichen Symbole durchsucht.
Rufen Sie zum Anzeigen lokaler Symbole oder Funktionsparameter die SymSetContext--Funktion mit dem InstructionOffset-Element der IMAGEHLP_STACK_FRAME Struktur auf, die 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 dazu den BaseOfDll-parameter auf NULL- fest, und lassen Sie den Modulbezeichner aus dem parameter Name oder Mask aus. Dadurch wird DbgHelp gezwungen, nach übereinstimmenden Symbolen innerhalb des bereichs zu suchen, der durch SymSetContext-angegeben ist.
Um festzustellen, ob ein Symbol ein Parameter ist, überprüfen Sie das Flags Element der SYMBOL_INFO Struktur. Wenn es sich bei dem Symbol um einen Parameter handelt, enthält das Element SYMFLAG_PARAMETER. Wenn es sich um ein lokales Symbol handelt, enthält das Element SYMFLAG_LOCAL.