Condividi tramite


Uso avanzato di SymSrv

SymSrv può recapitare file di simboli da un archivio simboli centralizzato. Questo archivio può contenere un numero qualsiasi di file di simboli, corrispondente a un numero qualsiasi di programmi o sistemi operativi. L'archivio può anche contenere file binari (questo è utile quando si esegue il debug di minidump).

L'archivio può contenere i file di simboli e binari effettivi oppure può contenere semplicemente puntatori ai file di simboli. Se l'archivio contiene puntatori, SymSrv recupererà i file effettivi direttamente dalle origini.

SymSrv può essere usato anche per separare un archivio simboli di grandi dimensioni in un subset più piccolo appropriato per un'attività di debug specializzata.

Infine, SymSrv può ottenere i file di simboli da un'origine HTTP o HTTPS usando le informazioni di accesso fornite dal sistema operativo. SymSrv supporta siti HTTPS protetti da smart card, certificati e normali account di accesso e password. Per altre informazioni, vedere Archivi simboli HTTP.

Impostazione del percorso del simbolo

Per utilizzare questo server di simboli, symsrv.dll deve essere installato nella stessa directory del debugger. Il percorso del simbolo può essere impostato come illustrato nel codice seguente:

set _NT_SYMBOL_PATH = symsrv*ServerDLL*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = symsrv*ServerDLL*\\Server\Share

set _NT_SYMBOL_PATH = srv*DownstreamStore*\\Server\Share

set _NT_SYMBOL_PATH = srv*\\Server\Share

Le parti di questa sintassi sono illustrate come segue:

symsrv
Questa parola chiave deve essere sempre visualizzata per prima. Indica al debugger che questo elemento è un server di simboli, non solo una normale directory dei simboli.

ServerDLL
Specifica il nome della DLL del server di simboli. Se si usa il server dei simboli SymSrv, questo sarà sempre symsrv.dll.

srv
Si tratta di una sintassi abbreviata per symsrv*symsrv.dll.

DownstreamStore
Specifica l'archivio downstream. Si tratta di una directory locale o di una condivisione di rete che verrà usata per memorizzare nella cache singoli file di simboli.

È possibile specificare più archivi downstream, separati da asterischi. Più archivi downstream sono illustrati in Cascading Downstream Stores più avanti in questa pagina.

Se si includono due asterischi in una riga in cui viene normalmente specificato un archivio downstream, viene usato l'archivio downstream predefinito. Questo archivio si troverà nella sottodirectory sym della home directory. Per impostazione predefinita, la home directory è la directory di installazione del debugger; questo può essere modificato usando l'estensione !homedir o impostando la variabile di ambiente DBGHELP_HOMEDIR.

Se DownstreamStore specifica una directory che non esiste, SymStore tenterà di crearla.

Se il parametro DownstreamStore viene omesso e non viene incluso alcun asterisco aggiuntivo, in altre parole, se si usa srv con esattamente un asterisco o symsrv con esattamente due asterischi, non verrà creato alcun archivio downstream. Il debugger caricherà tutti i file di simboli direttamente dal server, senza memorizzarli nella cache in locale.

Nota Se si accede ai simboli da un sito HTTP o HTTPS o se l'archivio simboli usa file compressi, viene sempre usato un archivio downstream. Se non viene specificato alcun archivio downstream, ne verrà creato uno nella sottodirectory sym della home directory.

\\Server\Share
Specifica il server e la condivisione dell'archivio simboli remoto.

Se viene usato un archivio downstream, il debugger cercherà prima di tutto un file di simboli in questo archivio. Se il file di simboli non viene trovato, il debugger individua il file di simboli dal server e dalla condivisione specificati e quindi memorizza nella cache una copia di questo file nell'archivio downstream. Il file verrà copiato in una sottodirectory nell'albero in DownstreamStore che corrisponde alla posizione nell'albero in \\Server\Share.

Il server dei simboli non deve essere l'unica voce nel percorso del simbolo. Se il percorso del simbolo è costituito da più voci, il debugger controlla ogni voce per i file di simboli necessari, in ordine (da sinistra a destra), indipendentemente dal fatto che sia denominato un server di simboli o una directory effettiva.

Di seguito sono riportati alcuni esempi. Per usare SymSrv come server di simboli con un archivio simboli in \\mybuilds\mysymbols, impostare il percorso del simbolo seguente:

set _NT_SYMBOL_PATH= symsrv*symsrv.dll*\\mybuilds\mysymbols

Per impostare il percorso del simbolo in modo che il debugger copia i file di simboli da un archivio simboli in \\mybuilds\mysymbols nella directory locale c:\localsymbols, usare:

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*c:\localsymbols*\\mybuilds\mysymbols

Per impostare il percorso del simbolo in modo che il debugger copia i file di simboli dal sito https://www.company.com/manysymbols HTTPS a una directory di rete locale \\localserver\myshare\mycache, usare:

set _NT_SYMBOL_PATH=symsrv*symsrv.dll*\\localserver\myshare\mycache*https://www.company.com/manysymbols

Questo ultimo esempio può anche essere abbreviato come segue:

set _NT_SYMBOL_PATH=srv*\\localserver\myshare\mycache*https://www.company.com/manysymbols

Inoltre, il percorso del simbolo può contenere diverse directory o server di simboli, separati da punto e virgola. In questo modo è possibile individuare i simboli da più posizioni (o anche più server di simboli). Se un file binario contiene un file di simboli non corrispondente, il debugger non può individuarlo usando il server dei simboli perché controlla solo i parametri esatti. Tuttavia, il debugger potrebbe trovare un file di simboli non corrispondente con il nome corretto, usando il percorso del simbolo tradizionale e caricarlo correttamente. Anche se il file tecnicamente non è il file di simboli corretto, potrebbe fornire informazioni utili.

Eliminazione della cache

Se si usa un DownstreamStore come cache, è possibile eliminare questa directory in qualsiasi momento per risparmiare spazio su disco.

È possibile avere un vasto archivio simboli che include file di simboli per molti programmi diversi o versioni di Windows. Se si aggiorna la versione di Windows usata nel computer di destinazione, tutti i file di simboli memorizzati nella cache corrispondono alla versione precedente. Questi file memorizzati nella cache non saranno di ulteriore utilizzo e pertanto questo potrebbe essere un buon momento per eliminare la cache.

Archivi downstream a catena

È possibile specificare qualsiasi numero di archivi downstream, separati da asterischi. Questi archivi sono noti come archivi di simboli a cascata.

Dopo l'inizializzazione srv* o symsrv*ServerDLL*, ogni token successivo rappresenta una posizione del simbolo. Il token più a sinistra viene controllato per primo. Un token vuoto, indicato da due asterischi in una riga o da un asterisco alla fine della stringa, rappresenta l'archivio downstream predefinito.

Di seguito è riportato un esempio di percorso simbolo che usa due archivi downstream per contenere informazioni dall'archivio dei simboli principale a cui si accede. È possibile chiamare l'archivio master, l'archivio di livello intermedio e la cache locale:

srv*c:\localcache*\\interim\store*https://msdl.microsoft.com/download/symbols

In questo scenario SymSrv cercherà innanzitutto c:\localcache per un file di simboli. Se viene trovato, verrà restituito un percorso. Se non viene trovato, verrà visualizzato in \\interim\store. Se il file di simboli è presente, SymSrv lo copierà in c:\localcache e restituirà il percorso. Se non viene trovato, SymSrv cercherà nell'archivio dei simboli pubblici Microsoft all'indirizzo https://msdl.microsoft.com/download/symbols. Se il file è presente, SymSrv lo copierà sia in \\interim\store che in c:\localcache.

Un comportamento simile viene ottenuto usando il percorso seguente:

srv**\\interim\store*https://internetsite

In questo caso, la cache locale è l'archivio downstream predefinito e l'archivio master è un sito Internet. È stato specificato un archivio di livello intermedio di \\interim\store per l'uso tra gli altri due.

Quando SymSrv elabora un percorso che contiene archivi a catena, ignora qualsiasi archivio in cui non può leggere o scrivere. Pertanto, se una condivisione diventa inattiva, copierà il file nell'archivio downstream dall'archivio mancante senza errori. Un buon effetto collaterale di questo errore è che l'utente può specificare più di un archivio master che genera un singolo flusso di archivi downstream purché gli archivi master non siano scrivibili.

Quando un file di simboli compresso viene recuperato dall'archivio master, verrà archiviato in formato compresso in qualsiasi archivio di livello intermedio. Il file verrà decompresso nell'archivio più in basso nel percorso.

Utilizzo dei percorsi del server di simboli HTTP e SMB

Come illustrato in precedenza, il concatenamento (o la propagazione) fa riferimento alla copia che si verifica tra ogni separatore "*" nel percorso del simbolo. I simboli vengono cercati in un ordine da sinistra a destra. In ogni caso, viene eseguita una query sul server dei simboli successivo (upstream), fino a quando non viene trovato il file.

Se trovato, il file viene copiato dal server dei simboli (upstream) al server di simboli precedente (downstream). Questa operazione viene ripetuta per ogni server di simboli (downstream). In questo modo, i server di simboli downstream (condivisi) vengono popolati con gli sforzi collettivi di tutti i client che usano i server di simboli.

Anche se i percorsi UNC concatenati possono essere usati senza il prefisso SRV*, è consigliabile specificare SRV* in modo che venga usata la gestione avanzata degli errori di symsrv.dll.

Quando si include un server di simboli HTTP nel percorso, è possibile specificare solo uno (per catena) e deve trovarsi alla fine del percorso (perché non può essere scritto come cache). Se un archivio di simboli basato su HTTP si trova al centro o a sinistra dell'elenco dei negozi, non sarebbe possibile copiare i file trovati in esso e la catena verrebbe interrotta. Inoltre, poiché il gestore dei simboli non può aprire un file da un sito Web, un archivio basato su HTTP non deve essere l'archivio più a sinistra o solo l'archivio nell'elenco. Se SymSrv viene mai visualizzato con questo percorso di simbolo, tenterà di eseguire il ripristino copiando il file nell'archivio downstream predefinito e aprirlo da questa posizione, indipendentemente dal fatto che l'archivio downstream predefinito sia indicato nel percorso del simbolo.

HTTP è supportato solo quando si usa il prefisso SRV* (implementato dal gestore di simboli symsrv.dll).

Esempi di scenari del server di simboli di condivisione HTTP e SMB

Una distribuzione comune solo UNC comporta un ufficio centrale che ospita tutti i file (\\MainOffice\Symbols), le succursali memorizzano nella cache un subset (\\BranchOfficeA\Symbols) e i desktop (C:\Symbols) memorizzano nella cache i file a cui fanno riferimento.

srv*C:\Symbols*\\BranchOfficeA\Symbols*\\MainOffice\Symbols

Quando la condivisione SMB è l'archivio dei simboli primario (upstream), read è obbligatorio.

srv*C:\Symbols*\\MachineName\Symbols

Quando la condivisione SMB è un archivio simboli intermedio (downstream), è necessario leggere/modificare. Il client copia il file dall'archivio dei simboli primario alla condivisione SMB e quindi dalla condivisione SMB alla cartella locale.

srv*C:\Symbols*\\MachineName\Symbols*https://msdl.microsoft.com/download/symbols
srv*C:\Symbols*\\MachineName\Symbols*\\MainOffice\Symbols

Quando la condivisione SMB è un archivio simboli intermedio (downstream) in una distribuzione SymProxy, è necessaria solo lettura. Il filtro ISAPI SymProxy eseguirà le scritture, non il client.

srv*C:\Symbols*\\MachineName\Symbols*https://SymProxyName/Symbols

Più scenari di cache del server di simboli di condivisione HTTP e SMB

È possibile specificare più catene di server di simboli e posizioni della cache, separati da un punto e virgola ";". Se i simboli si trovano nella prima catena, la seconda catena non viene attraversata. Se i simboli non si trovano nella prima catena, la seconda catena verrà attraversata e, se i simboli si trovano nella seconda catena, verranno memorizzati nella cache nella posizione specificata. Questo approccio consentirà l'uso di un server di simboli primario, con un server secondario utilizzato solo se i simboli non sono disponibili nel server dei simboli primario specificato nella prima catena.

srv*C:\Symbols*\\Machine1\Symbols*https://SymProxyName/Symbols;srv*C:\WebSymbols*https://msdl.microsoft.com/download/symbols

cache*localsymbolcache

Un altro modo per creare una cache locale di simboli consiste nell'usare la cache*localsymbolcache stringa nel percorso del simbolo. Non fa parte dell'elemento server simbolo, ma un elemento separato nel percorso del simbolo. Il debugger userà la directory specificata localsymbolcache per archiviare tutti i simboli caricati da qualsiasi elemento visualizzato nel percorso del simbolo a destra di questa stringa. In questo modo è possibile usare una cache locale per i simboli scaricati da qualsiasi posizione, non solo quelli scaricati da un server di simboli.

Ad esempio, il percorso del simbolo seguente non memorizza nella cache i simboli tratti da \\someshare. Userà c:\mysymbols per memorizzare nella cache i simboli tratti da \\anothershare, perché l'elemento che inizia con \\anothershare appare a destra dell'elemento cache*c:\mysymbols . Userà anche c:\mysymbols per memorizzare nella cache i simboli tratti dall'archivio dei simboli pubblici microsoft, a causa della sintassi consueta usata dal server dei simboli (srv con due o più asterischi). Inoltre, se successivamente si usa il comando .sympath+ per aggiungere altre posizioni a questo percorso, questi nuovi elementi verranno memorizzati nella cache, poiché verranno aggiunti al lato destro del percorso.

_NT_SYMBOL_PATH=\\someshare\that\cachestar\ignores;srv*c:\mysymbols*https://msdl.microsoft.com/download/symbols;cache*c:\mysymbols;\\anothershare\that\gets\cached

Come SymSrv individua i file

SymSrv crea un percorso UNC completo al file di simboli desiderato. Questo percorso inizia con il percorso dell'archivio simboli registrato nella variabile di ambiente _NT_SYMBOL_PATH. La routine SymbolServer viene quindi utilizzata per identificare il nome del file desiderato. Questo nome viene aggiunto al percorso come nome di directory. Viene quindi aggiunto un altro nome di directory, costituito dalla concatenazione dell'ID, due e tre parametri passati a SymbolServer. Se uno di questi valori è zero, vengono omessi.

La directory risultante viene cercata nel file di simboli o in un file di puntatore dell'archivio simboli.

Se la ricerca ha esito positivo, SymbolServer passa il percorso al chiamante e restituisce TRUE. Se il file non viene trovato, SymbolServer restituisce FALSE.

Uso di AgeStore per ridurre le dimensioni della cache

Lo strumento AgeStore può essere usato per eliminare i file memorizzati nella cache precedenti a una data specificata o per ridurre il contenuto della cache al di sotto di una dimensione specificata. Questo può essere utile se l'archivio downstream è troppo grande. Per informazioni dettagliate, vedere AgeStore.