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
Um anzugeben, wo der Symbolhandler Datenträgerverzeichnisse nach Symboldateien durchsucht, rufen Sie die SymSetSearchPath--Funktion auf. Alternativ können Sie einen Symbolsuchpfad im UserSearchPath- Parameter der SymInitialize-Funktion angeben.
Der parameter UserSearchPath in SymInitialize und der parameter SearchPath in SymSetSearchPath einen Zeiger auf eine mit Null beendete Zeichenfolge, die einen Pfad angibt, oder eine Reihe von Pfaden, 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 durchsucht werden. Andernfalls durchsucht der Symbolhandler zuerst die von der Anwendung festgelegten Pfade, bevor das Modulverzeichnis durchsucht wird, wenn dieser Parameter als nicht-NULL- Wert angegeben ist. Wenn Sie die Umgebungsvariable _NT_SYMBOL_PATH oder _NT_ALT_SYMBOL_PATH festlegen, sucht der Symbolhandler in der folgenden Reihenfolge nach Symboldateien:
- Die _NT_SYMBOL_PATH Umgebungsvariable.
- Die _NT_ALT_SYMBOL_PATH Umgebungsvariable.
- Das Verzeichnis, das das entsprechende Modul enthält.
Rufen Sie zum Abrufen der Suchpfade die SymGetSearchPath--Funktion auf.
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 im 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 wird.
Path-Elementtypen
Es gibt drei Arten von Pfadelementen.
Standard Path-Element
Ein Standardpfadelement wird durchsucht, indem im Stammverzeichnis des durch das Pfadelement angegebenen Verzeichnisses gesucht wird. Der Symbolhandler sucht auch in einem Unterverzeichnis von "Symbolen", das der Dateierweiterung des Moduls entspricht, nach dem Symbole gesucht werden. Dies ist in der Regel "dll", "exe" oder "sys". Schließlich sieht es in einem Unterverzeichnis namens "Symbole" mit einem Verzeichnis mit demselben Namen wie die Erweiterung aus. Wenn beispielsweise das Symbolpfadelement "c:\mySymbols" lautet und die Datei, nach der Symbole gesucht werden, "boo.dll" lautet, werden die folgenden Verzeichnisse durchsucht.
- c:\mySymbols
- c:\mySymbols\dll
- c:\mySymbols\symbols\dll
Der Symbolhandler verwendet diese Logik, um jedes Pfadelement zu durchsuchen, das die Kriterien nicht erfüllt, um ein Symbolserver oder Cache- zu sein (siehe unten).
Symbol Server Path-Element
Ein Symbolserver Path-Element verwendet spezielle Technologie, mit der ein Symbol gefunden werden kann, das eine genaue Übereinstimmung für das betreffende Modul darstellt. Weitere Informationen finden Sie unter Verwenden von SymSrv-.
Der Symbolhandler behandelt ein Pfadelement als Symbolserver, wenn es mit dem Text "srv*" beginnt.
Anmerkung
Wenn der Text "srv*" nicht angegeben ist, aber das tatsächliche Pfadelement ein Symbolserverspeicher ist, fungiert der Symbolhandler so, als ob "srv*" angegeben wurde. Der Symbolhandler bestimmt diese Bestimmung, indem im Stammverzeichnis des angegebenen Pfads nach der Existenz einer Datei namens "pingme.txt" gesucht wird.
Cache Path-Element
Ein Cache Pfadelements 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 Pfadelement als Cacheelement, wenn es mit dem Text "cache*" beginnt. Verwenden Sie zum Angeben eines Caches in "c:\myCache" ein Symbolpfadelement von "cache*c:\myCache".
Beispiel-Suchpfad
Um zu sehen, wie dies funktioniert, legen Sie diesen Suchpfad fest.
cache*c:\myCache;srv*\\symbols\symbols
Es folgt eine Auflistung der ausführlichen Ausgabe des Symbolhandlers bei der Suche nach ntdll.pdb mithilfe 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 Pfadelement von .
verarbeitet. Dies ist ein Standardpfadelement.
Die vierte Zeile zeigt den Symbolhandler mithilfe des Symbolservers, um nach der Datei im zweiten Pfadelement von cache*c:\myCache
zu suchen, bei dem es sich um ein Cachepfadelement handelt.
Die fünfte Zeile zeigt, dass die Datei im dritten Pfadelement von srv*\\symbols\symbols
gefunden wird, bei dem es sich um ein Symbolserverpfadelement handelt.
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.