Verwenden von SymChk
Die grundlegende Syntax für SymChk lautet wie folgt:
symchk [/r] FileNames /s SymbolPath
FileNames gibt mindestens eine Programmdatei an, deren Symbole benötigt werden. Wenn FileNames ein Verzeichnis ist und das / r-Flag verwendet wird, wird dieses Verzeichnis rekursiv untersucht, und SymChk versucht, Symbole für alle Programmdateien in dieser Verzeichnisstruktur zu finden. SymbolPath gibt an, wo SymChk nach Symbolen suchen soll.
Es gibt viele weitere Befehlszeilenoptionen. Eine vollständige Auflistung finden Sie unter SymChk Command-Line Optionen.
Abrufen von symchk
Symchk wird wie andere Debugtools als Teil des Debuggers ausgeliefert. Weitere Informationen finden Sie unter Debugtools für Windows.
Sobald die Debugtools installiert sind, ist symchk in diesem Verzeichnis für 64-Bit-Windows verfügbar.
C:\Programme (x86)\Windows Kits\10\Debuggers\x64
Beispielverwendung
Der angegebene Symbolpfad kann eine beliebige Anzahl von lokalen Verzeichnissen, UNC-Verzeichnissen oder Symbolservern enthalten. Lokale Verzeichnisse und UNC-Verzeichnisse werden nicht rekursiv durchsucht. Es werden nur das angegebene Verzeichnis und ein Unterverzeichnis, das auf der Erweiterung der ausführbaren Datei basiert, durchsucht. Beispiel: Die Abfrage
symchk thisdriver.sys /s G:\symbols
durchsucht G:\mysymbols und G:\mysymbols\sys.
Sie können einen Symbolserver angeben, indem Sie eine der folgenden Syntaxen als Teil Ihres Symbolpfads verwenden:
srv*DownstreamStore*\\Server\Share
srv*\\Server\Share
Dies ähnelt der Verwendung eines Symbolservers im Symbolpfad des Debuggers. Ausführliche Informationen hierzu finden Sie unter Verwenden von Symbolservern und Symbolspeichern.
Wenn ein Downstreamspeicher angegeben wird, erstellt SymChk Kopien aller gültigen Symboldateien, die vom Symbolserver gefunden wurden, und platziert sie im nachgelagerten Speicher. Nur Symboldateien, die vollständige Übereinstimmungen sind, werden nachgeschaltet.
SymChk durchsucht immer den Downstreamspeicher, bevor der Symbolserver abfragt. Daher sollten Sie bei der Verwendung eines Downstreamspeichers vorsichtig sein, wenn der Symbolspeicher von einer anderen Person gepflegt wird. Wenn Sie SymChk einmal ausführen und Symboldateien finden, werden diese in den Downstreamspeicher kopiert. Wenn Sie SymChk dann erneut ausführen, nachdem diese Dateien im Symbolspeicher geändert oder gelöscht wurden, wird SymChk diese Tatsache nicht bemerken, da es im Downstreamspeicher fündig wird und nicht weiter sucht.
Hinweis SymChk verwendet immer SymSrv (Symsrv.dll) als Symbolserver-DLL. Andererseits können die Debugger eine andere Symbolserver-DLL als SymSrv auswählen, wenn eine verfügbar ist. (SymSrv ist der Symbolserver, der im Paket Debugtools für Windows enthalten ist.)
Verwenden von SymChk zum Bestimmen, ob Symbole privat oder öffentlich sind
Um zu bestimmen, ob eine Symboldatei privat oder öffentlich ist, verwenden Sie den Parameter /v , damit SymChk ausführliche Ausgabe anzeigt. Angenommen, MyApp.exe und MyApp.pdb sich im Ordner c:\sym befinden. Geben Sie diesen Befehl ein.
symchk /v C:\sym\MyApp.exe /s C:\sym**
Wenn MyApp.pdb private Symbole enthält, sieht die Ausgabe von SymChk wie folgt aus.
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - private symbols & lines
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Wenn MyApp.pdb nur öffentliche Symbole enthält, sieht die Ausgabe von SymChk wie folgt aus.
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - public symbols
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Verwenden Sie die Option s mit dem / s-Parameter (/ss), um die Suche so einzuschränken, dass nur öffentliche Symboldateien gefunden werden. Der folgende Befehl findet eine Übereinstimmung, wenn MyApp.pdb nur öffentliche Symbole enthält. Es findet keine Übereinstimmung, wenn MyApp.pdb private Symbole enthält.
symchk /v C:\sym\MyApp.exe /s C:\sym
Weitere Informationen finden Sie unter Öffentliche und private Symbole.
Beispiele
Hier sehen Sie einige Beispiele: Der folgende Befehl sucht nach Symbolen für das Programm Myapp.exe:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\applications
SYMCHK: Myapp.exe FAILED - Myapp.pdb is missing
SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0
Sie können es mit einem anderen Symbolpfad erneut versuchen:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Die Suche war diesmal erfolgreich. Wenn die Ausführliche Option nicht verwendet wird, listet SymChk nur Dateien auf, für die Symbole nicht gefunden werden konnten. In diesem Beispiel wurden also keine Dateien aufgeführt. Sie können feststellen, dass die Suche erfolgreich war, da jetzt eine Datei in der Kategorie "bestanden" und keine in der Kategorie "Fehler" aufgeführt ist.
Eine Programmdatei wird ignoriert, wenn sie keinen ausführbaren Code enthält. Viele Ressourcendateien sind von diesem Typ.
Wenn Sie lieber die Dateinamen aller Programmdateien anzeigen möchten, können Sie die Option /v verwenden, um ausführliche Ausgabe zu generieren:
E:\debuggers> symchk /v F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: MyApp.exe PASSED
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Der folgende Befehl sucht nach einer großen Anzahl von Windows-Symbolen auf einem Symbolserver. Es gibt eine Vielzahl möglicher Fehlermeldungen:
E:\debuggers> symchk /r C:\windows\system32 /s srv*\\manysymbols\windows
SYMCHK: msisam11.dll FAILED - MSISAM11.pdb is missing
SYMCHK: msuni11.dll FAILED - msuni11link.pdb is missing
SYMCHK: msdxm.ocx FAILED - Image is split correctly, but msdxm.dbg i
s missing
SYMCHK: expsrv.dll FAILED - Checksum doesn't match with expsrv.DBG
SYMCHK: imeshare.dll FAILED - imeshare.opt.pdb is missing
SYMCHK: ir32_32.dll FAILED - Built with no debugging information
SYMCHK: author.dll FAILED - rpctest.pdb is missing
SYMCHK: msvcrt40.dll FAILED - Built with no debugging information
......
SYMCHK: FAILED files = 211
SYMCHK: PASSED + IGNORED files = 4809