Verwenden von SymStore
SymStore (symstore.exe) ist ein Tool zum Erstellen von Symbolspeichern. Sie ist im Paket Debugtools für Windows enthalten.
SymStore speichert Symbole in einem Format, mit dem der Debugger die Symbole basierend auf dem Zeitstempel und der Größe des Bilds (für eine DBG- oder ausführbare Datei) oder auf Der Signatur und dem Alter (für eine PDB-Datei) suchen kann. Der Vorteil des Symbolspeichers gegenüber dem herkömmlichen Symbolspeicherformat besteht darin, dass alle Symbole auf demselben Server gespeichert oder referenziert und vom Debugger abgerufen werden können, ohne dass vorher bekannt ist, welches Produkt das entsprechende Symbol enthält.
Beachten Sie, dass mehrere Versionen von PDB-Symboldateien (z. B. öffentliche und private Versionen) nicht auf demselben Server gespeichert werden können, da sie jeweils die gleiche Signatur und dasselbe Alter enthalten.
SymStore-Transaktionen
Jeder Aufruf von SymStore wird als Transaktion aufgezeichnet. Es gibt zwei Arten von Transaktionen: hinzufügen und löschen.
Wenn der Symbolspeicher erstellt wird, wird unter dem Stamm des Servers ein Verzeichnis mit dem Namen "000admin" erstellt. Das Verzeichnis 000admin enthält eine Datei für jede Transaktion sowie die Protokolldateien Server.txt und History.txt. Die Server.txt-Datei enthält eine Liste aller Transaktionen, die sich derzeit auf dem Server befinden. Die History.txt-Datei enthält einen chronologischen Verlauf aller Transaktionen.
Jedes Mal, wenn SymStore Symboldateien speichert oder entfernt, wird eine neue Transaktionsnummer erstellt. Anschließend wird eine Datei, deren Name diese Transaktionsnummer ist, in 000admin erstellt. Diese Datei enthält eine Liste aller Dateien oder Zeiger, die dem Symbolspeicher während dieser Transaktion hinzugefügt wurden. Wenn eine Transaktion gelöscht wird, liest SymStore die Transaktionsdatei durch, um zu bestimmen, welche Dateien und Zeiger gelöscht werden sollen.
Die Optionen zum Hinzufügen und Löschen geben an, ob eine Add- oder Delete-Transaktion ausgeführt werden soll. Das Einschließen der Option /p mit einem Add-Vorgang gibt an, dass ein Zeiger hinzugefügt werden soll. Wenn Sie die Option /p weglassen, wird angegeben, dass die tatsächliche Symboldatei hinzugefügt werden soll.
Es ist auch möglich, den Symbolspeicher in zwei separaten Phasen zu erstellen. In der ersten Phase verwenden Sie SymStore mit der Option /x , um eine Indexdatei zu erstellen. In der zweiten Phase verwenden Sie SymStore mit der Option /y , um den tatsächlichen Speicher von Dateien oder Zeigern aus den Informationen in der Indexdatei zu erstellen.
Dies kann aus verschiedenen Gründen eine nützliche Technik sein. Für instance kann der Symbolspeicher problemlos neu erstellt werden, wenn der Speicher verloren geht, solange die Indexdatei noch vorhanden ist. Oder vielleicht verfügt der Computer mit den Symboldateien über eine langsame Netzwerkverbindung mit dem Computer, auf dem der Symbolspeicher erstellt wird. In diesem Fall können Sie die Indexdatei auf demselben Computer wie die Symboldateien erstellen, die Indexdatei auf den zweiten Computer übertragen und dann den Speicher auf dem zweiten Computer erstellen.
Eine vollständige Liste aller SymStore-Parameter finden Sie unter SymStore Command-Line Optionen.
Hinweis
SymStore unterstützt keine gleichzeitigen Transaktionen von mehreren Benutzern. Es wird empfohlen, dass ein Benutzer als "Administrator" des Symbolspeichers bezeichnet wird und für alle Add- und Del-Transaktionen verantwortlich ist.
Transaktionsbeispiele
Im Folgenden finden Sie zwei Beispiele für das Hinzufügen von Symbolzeigern für Build 3790 von Windows Server 2003 zu \\sampledir\symsrv:
symstore add /r /p /f \\BuildServer\BuildShare\3790free\symbols\*.*
/s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 free"
/c "Sample add"
symstore add /r /p /f \\BuildServer\BuildShare\3790Chk\symbols\*.*
/s \\sampledir\symsrv /t "Windows Server 2003" /v "Build 3790 x86 checked"
/c "Sample add"
Im folgenden Beispiel fügt SymStore die eigentlichen Symboldateien für ein Anwendungsprojekt in \\largeapp\appserver\bins zu \\testdir\symsrv hinzu:
symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv
/t "Large Application" /v "Build 432" /c "Sample add"
Hier sehen Sie ein Beispiel für die Verwendung einer Indexdatei. Zunächst erstellt SymStore eine Indexdatei basierend auf der Sammlung von Symboldateien in \\largeapp\appserver\bins\. In diesem Fall wird die Indexdatei auf einem dritten Computer platziert, \\hubserver\hubshare. Mit der Option /g geben Sie an, dass sich das Dateipräfix "\\largeapp\appserver" in Zukunft ändern kann:
symstore add /r /p /g \\largeapp\appserver /f
\\largeapp\appserver\bins\*.*
/x \\hubserver\hubshare\myindex.txt
Angenommen, Sie verschieben alle Symboldateien aus dem Computer \\largeapp\appserver und platzieren sie auf \\myarchive\appserver. Anschließend können Sie den Symbolspeicher selbst aus der Indexdatei \\hubserver\hubshare\myindex.txt wie folgt erstellen:
symstore add /y \\hubserver\hubshare\myindex.txt
/g \\myarchive\appserver /s \\sampledir\symsrv /p
/t "Large Application" /v "Build 432" /c "Sample Add from Index"
Schließlich sehen Sie hier ein Beispiel dafür, wie SymStore eine Datei löscht, die von einer vorherigen Transaktion hinzugefügt wurde. Im folgenden Abschnitt finden Sie eine Erläuterung zum Ermitteln der Transaktions-ID (in diesem Fall 0000000096).
symstore del /i 0000000096 /s \\sampledir\symsrv
Komprimierte Dateien
SymStore kann mit komprimierten Dateien auf zwei verschiedene Arten verwendet werden.
- Verwenden Sie SymStore mit der Option /p , um Zeiger auf die Symboldateien zu speichern. Nachdem SymStore abgeschlossen ist, komprimieren Sie die Dateien, auf die die Zeiger verweisen.
- Verwenden Sie SymStore mit der Option /x , um eine Indexdatei zu erstellen. Komprimieren Sie nach Abschluss von SymStore die in der Indexdatei aufgeführten Dateien. Verwenden Sie dann SymStore mit der Option /y (und, falls gewünscht, der Option /p ), um die Dateien oder Zeiger auf die Dateien im Symbolspeicher zu speichern. (SymStore muss die Dateien nicht dekomprimieren, um diesen Vorgang auszuführen.)
Ihr Symbolserver ist für die Dekomprimierung der Dateien verantwortlich, wenn sie benötigt werden.
Wenn Sie SymSrv als Symbolserver verwenden, sollte jede Komprimierung mit dem compress.exe-Tool erfolgen, das mit dem Microsoft Windows Software Development Kit (SDK) verteilt wird. Komprimierte Dateien sollten einen Unterstrich als letztes Zeichen in ihren Dateierweiterungen aufweisen (z. B. module1.pd_ oder module2.db_). Weitere Informationen finden Sie unter Verwenden von SymSrv.
Die server.txt- und history.txt-Dateien
Wenn eine Transaktion hinzugefügt wird, werden mehrere Informationen zu server.txt und history.txt für zukünftige Suchfunktionen hinzugefügt. Im Folgenden finden Sie ein Beispiel für eine Zeile in server.txt und history.txt für eine Add-Transaktion:
0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,
Dies ist eine durch Trennzeichen getrennte Zeile. Die Felder werden wie folgt definiert.
Feld | Beschreibung |
---|---|
0000000096 | Transaktions-ID-Nummer, wie sie von SymStore erstellt wurde. |
hinzufügen | Transaktionstyp. Dieses Feld kann entweder add oder del sein. |
ptr | Gibt an, ob Dateien oder Zeiger hinzugefügt wurden. Dieses Feld kann entweder datei oder ptr sein. |
10/09/99 | Datum des Transaktionsvorgangs. |
00:08:32 | Zeitpunkt, zu dem die Transaktion gestartet wurde. |
Windows XP | Produkt |
x86 fre | Version (optional). |
Hinzugefügt von | Kommentar (optional) |
Nicht verwendet | (Zur späteren Verwendung reserviert.) |
Hier sind einige Beispielzeilen aus der Transaktionsdatei 0000000096. Jede Zeile zeichnet das Verzeichnis und den Speicherort der Datei oder des Zeigers auf, der dem Verzeichnis hinzugefügt wurde.
canon800.dbg\35d9fd51b000,\\mybuilds\symbols\sp4\dll\canon800.dbg
canonlbp.dbg\35d9fd521c000,\\mybuilds\symbols\sp4\dll\canonlbp.dbg
certadm.dbg\352bf2f48000,\\mybuilds\symbols\sp4\dll\certadm.dbg
certcli.dbg\352bf2f1b000,\\mybuilds\symbols\sp4\dll\certcli.dbg
certcrpt.dbg\352bf04911000,\\mybuilds\symbols\sp4\dll\certcrpt.dbg
certenc.dbg\352bf2f7f000,\\mybuilds\symbols\sp4\dll\certenc.dbg
Wenn Sie eine del-Transaktion verwenden, um die ursprünglichen Add-Transaktionen rückgängig zu machen, werden diese Zeilen aus server.txt entfernt, und die folgende Zeile wird history.txt hinzugefügt:
0000000105,del,0000000096
Die Felder für die Löschtransaktion sind wie folgt definiert.
Feld | Beschreibung |
---|---|
0000000105 | Transaktions-ID-Nummer, wie sie von SymStore erstellt wurde. |
del | Transaktionstyp. Dieses Feld kann entweder add oder del sein. |
0000000096 | Transaktion, die gelöscht wurde. |
Symbolspeicherformat
SymStore verwendet das Dateisystem selbst als Datenbank. Es erstellt eine große Struktur von Verzeichnissen mit Verzeichnisnamen, die auf z. B. zeitstempeln, Signaturen, Alter und anderen Daten der Symboldatei basieren.
Nachdem dem Server beispielsweise mehrere verschiedene acpi.dbg-Dateien hinzugefügt wurden, können die Verzeichnisse wie folgt aussehen:
Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999 05:46p <DIR> .
10/06/1999 05:46p <DIR> ..
10/04/1999 01:54p <DIR> 37cdb03962040
10/04/1999 01:49p <DIR> 37cdb04027740
10/04/1999 12:56p <DIR> 37e3eb1c62060
10/04/1999 12:51p <DIR> 37e3ebcc27760
10/04/1999 12:45p <DIR> 37ed151662060
10/04/1999 12:39p <DIR> 37ed15dd27760
10/04/1999 11:33a <DIR> 37f03ce962020
10/04/1999 11:21a <DIR> 37f03cf7277c0
10/06/1999 05:38p <DIR> 37fa7f00277e0
10/06/1999 05:46p <DIR> 37fa7f01620a0
In diesem Beispiel könnte der Suchpfad für die Symboldatei acpi.dbg etwa wie folgt aussehen: \\mybuilds\symsrv\acpi.dbg\37cdb03962040.
Im Nachschlageverzeichnis sind möglicherweise drei Dateien vorhanden:
- Wenn die Datei gespeichert wurde, ist acpi.dbg dort vorhanden.
- Wenn ein Zeiger gespeichert wurde, ist eine Datei namens file.ptr vorhanden, die den Pfad zur eigentlichen Symboldatei enthält.
- Eine Datei namens refs.ptr, die eine Liste aller aktuellen Speicherorte für acpi.dbg mit dieser Zeitstempel- und Bildgröße enthält, die derzeit dem Symbolspeicher hinzugefügt werden.
Die Verzeichnisliste von \\mybuilds\symsrv\acpi.dbg\37cdb03962040 zeigt Folgendes an:
10/04/1999 01:54p 52 file.ptr
10/04/1999 01:54p 67 refs.ptr
Die Datei file.ptr enthält die Textzeichenfolge "\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg". Da es in diesem Verzeichnis keine Datei mit dem Namen acpi.dbg gibt, versucht der Debugger, die Datei unter \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg zu finden.
Der Inhalt von refs.ptr wird nur von SymStore und nicht vom Debugger verwendet. Diese Datei enthält einen Datensatz aller Transaktionen, die in diesem Verzeichnis stattgefunden haben. Eine Beispielzeile aus refs.ptr kann wie folgt sein:
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg
Dies zeigt, dass ein Zeiger auf \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg mit der Transaktion "0000000026" hinzugefügt wurde.
Einige Symboldateien bleiben über verschiedene Produkte oder Builds oder ein bestimmtes Produkt konstant. Ein Beispiel hierfür ist die Datei msvcrt.pdb. Ein Verzeichnis mit \\mybuilds\symsrv\msvcrt.pdb zeigt, dass dem Symbolserver nur zwei Versionen von msvcrt.pdb hinzugefügt wurden:
Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999 05:37p <DIR> .
10/06/1999 05:37p <DIR> ..
10/04/1999 11:19a <DIR> 37a8f40e2
10/06/1999 05:37p <DIR> 37f2c2272
Ein Verzeichnis mit \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 zeigt jedoch, dass refs.ptr mehrere Zeiger enthält.
Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999 02:50p 54 file.ptr
10/05/1999 02:50p 2,039 refs.ptr
Der Inhalt von \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr ist wie folgt:
0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb
Dies zeigt, dass dieselbe msvcrt.pdb für mehrere Builds von Symbolen verwendet wurde, die auf \\mybuilds\symsrv gespeichert sind.
Hier sehen Sie ein Beispiel für ein Verzeichnis, das eine Mischung aus Datei- und Zeigerzufügungen enthält:
Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999 01:54p 141,232 dbghelp.dbg
10/13/1999 04:57p 49 file.ptr
10/13/1999 04:57p 306 refs.ptr
In diesem Fall hat refs.ptr den folgenden Inhalt:
0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg
Daher haben die Transaktionen 43, 44 und 45 dieselbe Datei dem Server hinzugefügt, und die Transaktionen 46 und 47 haben Zeiger hinzugefügt. Wenn die Transaktionen 43, 44 und 45 gelöscht werden, wird die Datei dbghelp.dbg aus dem Verzeichnis gelöscht. Das Verzeichnis enthält dann den folgenden Inhalt:
Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999 05:01p 49 file.ptr
10/13/1999 05:01p 130 refs.ptr
Datei.ptr enthält nun "\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg", und refs.ptr enthält
0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg
Wenn der letzte Eintrag in refs.ptr ein Zeiger ist, ist die Datei file.ptr vorhanden und enthält den Pfad zur zugeordneten Datei. Wenn der letzte Eintrag in refs.ptr eine Datei ist, ist keine datei.ptr in diesem Verzeichnis vorhanden. Daher kann jeder Löschvorgang, der den endgültigen Eintrag in refs.ptr entfernt, dazu führen, dass datei.ptr erstellt, gelöscht oder geändert wird.