Symbolpfade
Die DbgHelp-Bibliothek verwendet den Symbolsuchpfad, um Debugsymbole (PDB- und DBG-Dateien) zu suchen. Der Suchpfad kann aus einem oder mehreren Pfadelementen bestehen, die durch Semikolons getrennt sind.
Angeben von Suchpfaden
Rufen Sie die SymSetSearchPath-Funktion auf, um anzugeben, wo der Symbolhandler Datenträgerverzeichnisse nach Symboldateien durchsucht. Alternativ können Sie einen Symbolsuchpfad im UserSearchPath-Parameter der SymInitialize-Funktion angeben.
Der Parameter UserSearchPath in SymInitialize und der SearchPath-Parameter in SymSetSearchPath verwenden einen Zeiger auf eine null-endende Zeichenfolge, die einen Pfad oder eine Reihe von Pfaden angibt, die durch ein Semikolon getrennt sind. Der Symbolhandler verwendet diese Pfade, um nach Symboldateien zu suchen. Wenn dieser Parameter NULL ist, durchsucht der Symbolhandler das Verzeichnis, das das Modul enthält, nach dem Symbole gesucht werden. Andernfalls durchsucht der Symbolhandler, wenn dieser Parameter als Nicht-NULL-Wert angegeben wird, zuerst die von der Anwendung festgelegten Pfade, bevor er das Modulverzeichnis durchsucht. Wenn Sie die _NT_SYMBOL_PATH oder _NT_ALT_SYMBOL_PATH Umgebungsvariable festlegen, sucht der Symbolhandler in der folgenden Reihenfolge nach Symboldateien:
- Die _NT_SYMBOL_PATH Umgebungsvariable.
- Die umgebungsvariable _NT_ALT_SYMBOL_PATH.
- Das Verzeichnis, das das entsprechende Modul enthält.
Rufen Sie die SymGetSearchPath-Funktion auf, um die Suchpfade abzurufen.
Der Suchpfad für Programmdatenbankdateien (PDB) unterscheidet sich vom Pfad für Debugdateien (.dbg). Der Algorithmus wird durch die Funktionalität der Symbolbibliothek bestimmt. Standardmäßig erstellt Microsoft Visual C/C++ Microsoft-Formatsymbole, entfernt sie aus dem Bild und platziert sie in einer separaten PDB-Datei. In der Regel befindet sich die PDB-Datei in dem Verzeichnis, das das ausführbare Image enthält. Visual C/C++ bettet den absoluten Pfad zur PDB-Datei in das ausführbare Image ein. Wenn der Symbolhandler die PDB-Datei an diesem Speicherort nicht finden kann oder wenn die PDB-Datei in ein anderes Verzeichnis verschoben wurde, sucht der Symbolhandler die PDB-Datei mithilfe des suchpfads, der für DBG-Dateien beschrieben ist.
Path-Elementtypen
Es gibt drei Arten von Pfadelementen.
Standardpfad-Element
Ein Standardpfadelement wird durchsucht, indem im Stammverzeichnis des durch das path-Element angegebenen Verzeichnisses gesucht wird. Der Symbolhandler sucht auch in einem Unterverzeichnis von "Symbols", das der Dateierweiterung des Moduls entspricht, nach dem Symbole gesucht werden. Dies ist in der Regel "dll", "exe" oder "sys". Schließlich sucht es in einem Unterverzeichnis namens "symbols" mit einem Verzeichnis mit demselben Namen wie die Erweiterung. Wenn beispielsweise das Element des Symbolpfads "c:\mySymbols" lautet und die Datei, nach der symbole gesucht wird, "boo.dll" lautet, würden die folgenden Verzeichnisse durchsucht.
- c:\mySymbols
- c:\mySymbols\dll
- c:\mySymbols\symbols\dll
Der Symbolhandler verwendet diese Logik, um alle Pfadelemente zu durchsuchen, die die Kriterien als Symbolserver oder -cache nicht erfüllen (siehe unten).
Symbolserverpfadelement
Ein Symbolserverpfadelement verwendet eine spezielle Technologie, die ein Symbol finden kann, das eine genaue Übereinstimmung für das betreffende Modul darstellt. Weitere Informationen finden Sie unter Verwenden von SymSrv .
Der Symbolhandler behandelt ein path-Element als Symbolserver, wenn es mit dem Text "srv*" beginnt.
Hinweis
Wenn der Text "srv*" nicht angegeben ist, aber das eigentliche path-Element ein Symbolserverspeicher ist, verhält sich der Symbolhandler so, als ob "srv*" angegeben wäre. Der Symbolhandler nimmt diese Bestimmung vor, indem er nach dem Vorhandensein einer Datei namens "pingme.txt" im Stammverzeichnis des angegebenen Pfads sucht.
Cache path-Element
Ein Cachepfadelement ist eine Variation eines Symbolserverpfadelements.
Dieses Verzeichnis wird wie jeder andere Symbolserver durchsucht. Wenn das Symbol hier jedoch nicht gefunden wird und es in einem Pfadelement weiter unten in der Kette des Symbolpfads gefunden wird, wird das Symbol kopiert und auf dem in diesem Element angegebenen Symbolserver gespeichert.
Der Symbolhandler behandelt ein path-Element als Cacheelement, wenn es mit dem Text "cache*" beginnt. Um einen Cache in "c:\myCache" anzugeben, verwenden Sie das Symbolpfadelement "cache*c:\myCache".
Beispielsuchpfad
Um zu sehen, wie dies funktioniert, legen Sie diesen Suchpfad fest.
cache*c:\myCache;srv*\\symbols\symbols
Im Folgenden finden Sie eine Liste der ausführlichen Ausgabe des Symbolhandlers bei der Suche nach ntdll.pdb unter Verwendung des oben aufgeführten Suchpfads.
DBGHELP: .\ntdll.pdb - file not found
DBGHELP: .\dll\ntdll.pdb - file not found
DBGHELP: .\symbols\dll\ntdll.pdb - file not found
SYMSRV: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb not found
SYMSRV: ntdll.pdb from \\symbols\symbols: 10497024 bytes - copied
DBGHELP: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb already cached
DBGHELP: ntdll - private symbols & lines
c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb
Die ersten drei Ausgabezeilen zeigen den Symbolhandler, der das erste path-Element von .
verarbeitet. Dies ist ein Standardpfadelement.
Die vierte Zeile zeigt den Symbolhandler, der den Symbolserver verwendet, um im zweiten path-Element nach der Datei zu suchen, von cache*c:\myCache
der ein Cachepfadelement ist.
Die fünfte Zeile zeigt, dass sich die Datei im dritten Path-Element von srv*\\symbols\symbols
befindet, das ein Symbolserverpfadelement ist.
Die sechste Zeile zeigt, dass die Datei in den Cache kopiert wird.
Die letzten beiden Zeilen, die die Datei aus dem Cache geöffnet wird.