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.
- 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.
- 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:
- Se il file è stato archiviato, acpi.dbg esisterà.
- Se è stato archiviato un puntatore, esisterà un file denominato file.ptr e conterrà il percorso del file di simboli effettivo.
- 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.