Uso di SymStore

SymStore (symstore.exe) è uno strumento per la creazione di archivi simboli. È incluso nel pacchetto Strumenti di debug per Windows .

SymStore archivia i simboli in un formato che consente al debugger di cercare i simboli in base al timestamp e alle dimensioni dell'immagine (per un file con estensione dbg o eseguibile) o alla firma e all'età (per un file con estensione pdb). Il vantaggio dell'archivio simboli rispetto al formato di archiviazione dei simboli tradizionale è che tutti i simboli possono essere archiviati o a cui si fa riferimento nello stesso server e recuperati dal debugger senza alcuna conoscenza precedente del prodotto che contiene il simbolo corrispondente.

Si noti che più versioni dei file di simboli con estensione pdb (ad esempio versioni pubbliche e private) non possono essere archiviate nello stesso server, perché ognuna contiene la stessa firma e la stessa età.

Transazioni symstore

Ogni chiamata a SymStore viene registrata come transazione. Esistono due tipi di transazioni: aggiungere ed eliminare.

Quando viene creato l'archivio simboli, viene creata una directory denominata "000admin" nella radice del server. La directory 000admin contiene un file per ogni transazione, nonché i file di log Server.txt e History.txt. Il file Server.txt contiene un elenco di tutte le transazioni attualmente presenti nel server. Il file History.txt contiene una cronologia cronologica di tutte le transazioni.

Ogni volta che SymStore archivia o rimuove i file di simboli, viene creato un nuovo numero di transazione. Viene quindi creato un file, il cui nome è questo numero di transazione, in 000admin. Questo file contiene un elenco di tutti i file o puntatori aggiunti all'archivio simboli durante questa transazione. Se una transazione viene eliminata, SymStore leggerà il relativo file di transazione per determinare quali file e puntatori eliminare.

Le opzioni add e del specificano se deve essere eseguita una transazione di aggiunta o eliminazione. L'inclusione dell'opzione /p con un'operazione di aggiunta specifica che deve essere aggiunto un puntatore. L'omissione dell'opzione /p specifica che deve essere aggiunto il file di simboli effettivo.

È anche possibile creare l'archivio simboli in due fasi separate. Nella prima fase si usa SymStore con l'opzione /x per creare un file di indice. Nella seconda fase si usa SymStore con l'opzione /y per creare l'archivio effettivo di file o puntatori dalle informazioni nel file di indice.

Questa può essere una tecnica utile per diversi motivi. Ad esempio, ciò consente di ricreare facilmente l'archivio simboli se l'archivio viene in qualche modo perso, purché il file di indice esista ancora. O forse il computer contenente i file di simboli ha una connessione di rete lenta al computer in cui verrà creato l'archivio simboli. In questo caso, è possibile creare il file di indice nello stesso computer dei file di simboli, trasferire il file di indice nel secondo computer e quindi creare l'archivio nel secondo computer.

Per un elenco completo di tutti i parametri symstore, vedere Opzioni della riga di comando di SymStore.

Nota

SymStore non supporta transazioni simultanee da più utenti. È consigliabile che un utente sia designato "amministratore" dell'archivio simboli e sia responsabile di tutte le transazioni di aggiunta e del .

 

Esempi di transazioni

Ecco due esempi di SymStore che aggiungono puntatori ai simboli per la build 3790 di Windows Server 2003 a \\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"

Nell'esempio seguente SymStore aggiunge i file di simboli effettivi per un progetto di applicazione in \\largeapp\appserver\bins a \\testdir\symsrv:

symstore add /r /f \\largeapp\appserver\bins\*.* /s \\testdir\symsrv 
   /t "Large Application" /v "Build 432" /c "Sample add"

Di seguito è riportato un esempio di utilizzo di un file di indice. Prima di tutto, SymStore crea un file di indice basato sulla raccolta di file di simboli in \\largeapp\appserver\bins\. In questo caso, il file di indice viene inserito in un terzo computer, \\hubserver\hubshare. Usare l'opzione /g per specificare che il prefisso del file "\\largeapp\appserver" potrebbe cambiare in futuro:

symstore add /r /p /g \\largeapp\appserver /f 
   \\largeapp\appserver\bins\*.* 
   /x \\hubserver\hubshare\myindex.txt

Si supponga ora di spostare tutti i file di simboli dal computer \\largeapp\appserver e inserirli in \\myarchive\appserver. È quindi possibile creare l'archivio simboli stesso dal file di indice \\hubserver\hubshare\myindex.txt come indicato di seguito:

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"

Infine, ecco un esempio di SymStore che elimina un file aggiunto da una transazione precedente. Vedere la sezione seguente per una spiegazione di come determinare l'ID transazione (in questo caso, 0000000096).

symstore del /i 0000000096 /s \\sampledir\symsrv

File compressi

SymStore può essere usato con file compressi in due modi diversi.

  1. Usare SymStore con l'opzione /p per archiviare i puntatori ai file di simboli. Al termine di SymStore, comprimere i file a cui fanno riferimento i puntatori.
  2. Usare SymStore con l'opzione /x per creare un file di indice. Al termine di SymStore, comprimere i file elencati nel file di indice. Usare quindi SymStore con l'opzione /y (e, se si desidera, l'opzione /p ) per archiviare i file o i puntatori ai file nell'archivio simboli. SymStore non dovrà decomprimere i file per eseguire questa operazione.

Il server dei simboli sarà responsabile della decompressione dei file quando sono necessari.

Se usi SymSrv come server di simboli, qualsiasi compressione deve essere eseguita usando lo strumento compress.exe distribuito con Microsoft Windows Software Development Kit (SDK). I file compressi devono avere un carattere di sottolineatura come ultimo carattere nelle relative estensioni di file( ad esempio, module1.pd_ o module2.db_). Per informazioni dettagliate, vedere Uso di SymSrv.

File server.txt e history.txt

Quando viene aggiunta una transazione, vengono aggiunti diversi elementi di informazioni a server.txt e history.txt per una funzionalità di ricerca futura. Di seguito è riportato un esempio di riga in server.txt e history.txt per una transazione di aggiunta:

0000000096,add,ptr,10/09/99,00:08:32,Windows XP,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,

Si tratta di una linea delimitata da virgole. I campi sono definiti come segue.

Campo Descrizione
0000000096 Numero ID transazione, come creato da SymStore.
add (aggiungi) Tipo di transazione. Questo campo può essere aggiunto o del.
ptr Indica se sono stati aggiunti file o puntatori. Questo campo può essere file o ptr.
10/09/99 Data in cui si è verificata la transazione.
00:08:32 Ora di avvio della transazione.
Windows XP Prodotto.
x86 fre Versione (facoltativa).
Aggiunta da Commento (facoltativo)
Non utilizzato (Riservato per un uso successivo).

 

Ecco alcune righe di esempio del file di transazione 0000000096. Ogni riga registra la directory e il percorso del file o del puntatore aggiunto alla directory.

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

Se si utilizza una transazione del per annullare le transazioni di aggiunta originali, queste righe verranno rimosse da server.txt e la riga seguente verrà aggiunta a history.txt:

0000000105,del,0000000096

I campi per la transazione di eliminazione sono definiti come segue.

Campo Descrizione
0000000105 Numero ID transazione, come creato da SymStore.
del Tipo di transazione. Questo campo può essere aggiunto o del.
0000000096 Transazione eliminata.

 

Formato Archiviazione simbolo

SymStore usa il file system stesso come database. Crea un albero di grandi dimensioni di directory, con nomi di directory basati su elementi quali timestamp dei file di simboli, firme, età e altri dati.

Ad esempio, dopo l'aggiunta di diversi file acpi.dbg al server, le directory potrebbero avere un aspetto simile al seguente:

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 questo esempio il percorso di ricerca per il file di simboli acpi.dbg potrebbe essere simile al seguente: \\mybuilds\symsrv\acpi.dbg\37cdb03962040.

È possibile che esistano tre file all'interno della directory di ricerca:

  1. Se il file è stato archiviato, acpi.dbg esisterà.
  2. Se è stato archiviato un puntatore, esisterà un file denominato file.ptr e conterrà il percorso del file di simboli effettivo.
  3. File denominato refs.ptr, che contiene un elenco di tutti i percorsi correnti per acpi.dbg con questo timestamp e le dimensioni dell'immagine attualmente aggiunte all'archivio simboli.

La visualizzazione dell'elenco di directory \\mybuilds\symsrv\acpi.dbg\37cdb03962040 fornisce quanto segue:

10/04/1999  01:54p                  52 file.ptr
10/04/1999  01:54p                  67 refs.ptr

Il file.ptr contiene la stringa di testo "\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg". Poiché in questa directory non è presente alcun file denominato acpi.dbg, il debugger tenterà di trovare il file in \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg.

Il contenuto di refs.ptr viene usato solo da SymStore, non dal debugger. Questo file contiene un record di tutte le transazioni eseguite in questa directory. Una riga di esempio da refs.ptr potrebbe essere:

0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg

Ciò mostra che un puntatore a \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg è stato aggiunto con la transazione "0000000026".

Alcuni file di simboli rimangono costanti attraverso vari prodotti o compilazioni o un particolare prodotto. Un esempio è il file msvcrt.pdb. Se si esegue una directory di \\mybuilds\symsrv\msvcrt.pdb, vengono visualizzate solo due versioni di msvcrt.pdb aggiunte al server dei simboli:

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

Tuttavia, eseguendo una directory di \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 viene mostrato che refs.ptr include diversi puntatori.

Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999  02:50p              54     file.ptr
10/05/1999  02:50p           2,039     refs.ptr

Il contenuto di \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr è il seguente:

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

Ciò mostra che lo stesso msvcrt.pdb è stato usato per più compilazioni di simboli archiviati in \\mybuilds\symsrv.

Di seguito è riportato un esempio di directory che contiene una combinazione di aggiunte di file e puntatori:

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 questo caso, refs.ptr ha il contenuto seguente:

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

Pertanto, le transazioni 43, 44 e 45 hanno aggiunto lo stesso file al server e transazioni 46 e 47 puntatori aggiunti. Se le transazioni 43, 44 e 45 vengono eliminate, il file dbghelp.dbg verrà eliminato dalla directory. La directory avrà quindi il contenuto seguente:

Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999  05:01p                   49 file.ptr
10/13/1999  05:01p                 130 refs.ptr

File.ptr contiene ora "\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg" e refs.ptr contiene

0000000046,ptr,\\sampledir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\sampledir2\bin\symbols\retail\dll\dbghelp.dbg

Ogni volta che la voce finale in refs.ptr è un puntatore, il file.ptr esisterà e conterrà il percorso del file associato. Ogni volta che la voce finale in refs.ptr è un file, non esisterà alcun file.ptr in questa directory. Pertanto, qualsiasi operazione di eliminazione che rimuove la voce finale in refs.ptr può comportare la creazione, l'eliminazione o la modifica di file.ptr.