Uso di PDBCopy
PDBCopy è uno strumento da riga di comando che crea un file di simboli rimosso da un file simbolo completo. In altre parole, accetta un file di simboli che contiene sia i dati dei simboli privati che una tabella dei simboli pubblici e crea una copia di tale file che contiene solo la tabella dei simboli pubblici. A seconda delle opzioni PDBCopy usate, il file di simboli rimosso contiene l'intera tabella dei simboli pubblici o un subset specificato della tabella dei simboli pubblici.
Per il percorso di PDBCopy in WDK, vedere Directory di installazione in Strumenti inclusi in Strumenti di debug per Windows.
PDBCopy funziona con qualsiasi file di simboli di formato PDB (con estensione pdb del nome file), ma non con i file di simboli di formato precedente (con estensione dbg).
Per una descrizione delle tabelle dei simboli pubblici e dei dati dei simboli privati, vedere Simboli pubblici e privati.
Rimozione di simboli privati
Se si vuole creare un file simbolo rimosso che contiene tutti i simboli pubblici e nessuno dei simboli privati, usare PDBCopy con tre parametri: il percorso e il nome del file simbolo originale, il percorso e il nome del nuovo file di simboli e l'opzione -p.
Ad esempio, il comando seguente crea un nuovo file, denominato publicsymbols.pdb, che contiene la stessa tabella dei simboli pubblici di mysymbols.pdb, ma contiene nessuno dei dati dei simboli privati:
pdbcopy mysymbols.pdb publicsymbols.pdb -pdb
Se mysymbols.pdb è già un file simbolo rimosso, il contenuto simbolico del nuovo file e il vecchio file sarà identico.
Dopo aver eseguito questo comando, è necessario spostare il nuovo file in una nuova posizione e rinominarlo nel nome originale del file di simboli (in questo esempio, mysymbols.pdb), perché la maggior parte dei programmi di debug e programmi di estrazione dei simboli cerca simboli in base a un nome di file specifico. In alternativa, è possibile usare lo stesso nome di file per il file di input e il file di output nella riga di comando PDBCopy, purché vengano specificate directory diverse:
pdbcopy c:\dir1\mysymbols.pdb c:\dir2\mysymbols.pdb -p
Nota Il file di destinazione non deve esistere prima dell'esecuzione di PDBCopy. Se esiste un file con questo nome, possono verificarsi vari errori.
Rimozione di simboli privati e simboli pubblici selezionati
Se si desidera rimuovere non solo i dati dei simboli privati, ma anche ridurre la quantità di informazioni nella tabella dei simboli pubblici, è possibile usare l'opzione -f per specificare un elenco di simboli pubblici da rimuovere.
Nell'esempio seguente viene illustrata questa procedura:
Determinare i nomi completi, incluse le decorazioni, dei simboli da rimuovere. Se non si è certi dei nomi dei simboli decorati, è possibile usare lo strumento DBH per determinarli. Per informazioni dettagliate, vedere Determinazione delle decorazioni di un simbolo specifico. In questo esempio si supponga che i nomi decorati dei simboli da rimuovere siano _myGlobal1 e _myGlobal2.
Creare un file di testo contenente un elenco dei simboli da rimuovere. Ogni riga in questo file deve includere il nome di un simbolo, incluse le decorazioni, ma non includere nomi di modulo. In questo esempio il file contiene le due righe seguenti:
_myGlobal1 _myGlobal2
Il file può essere assegnato a qualsiasi nome scelto. Si supponga di assegnare al file il nome listfile.txt e inserirlo nella directory C:\Temp.
Usare la riga di comando PDBCopy seguente:
pdbcopy OldPDB NewPDB -p -f:@TextFile
dove OldPDB e NewPDB sono il file di simboli originale e il nuovo file di simboli e TextFile è il file creato nel passaggio due. L'opzione -f indica che determinati simboli pubblici devono essere rimossi e l'amperand ( @ ) indica che questi simboli sono elencati nel file di testo specificato.
Nell'esempio corrente il comando sarà simile al seguente:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:@c:\temp\listfile.txt
In questo modo viene creato un nuovo file di simboli, C:\dir3\mysymbols.pdb, che non contiene simboli privati e non contiene le due variabili globali elencate in listfile.txt.
Come illustrato in questo esempio, l'opzione -f di PDBCopy rimuove un elenco specifico di simboli pubblici. L'amperand ( @ ) indica che questi simboli sono elencati in un file di testo. Un metodo alternativo consiste nell'elencare tutti i simboli nella riga di comando, usando l'opzione -f senza un amperand. Pertanto, la riga di comando seguente equivale all'esempio nella procedura precedente:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:_myGlobal1 -f:_myGlobal2
A meno che non si desideri rimuovere solo uno o due simboli, è più semplice usare un file di testo che elencarli nella riga di comando.
Se si desidera rimuovere la maggior parte dei simboli pubblici dal file con estensione pdb, l'opzione -F è il metodo più semplice. Anche se l'opzione -f richiede di elencare i simboli pubblici da rimuovere, l'opzione -F richiede di elencare tali simboli pubblici che non si desidera rimuovere. Tutti gli altri simboli pubblici (oltre a tutti i simboli privati) verranno rimossi. L'opzione -F supporta le stesse due opzioni di sintassi dell'opzione -f: -F: seguita dal nome di un simbolo da conservare o -F:@ seguita dal nome di un file di testo contenente un elenco dei simboli da conservare. In entrambi i casi, è necessario usare i nomi dei simboli decorati.
Ad esempio, il comando seguente rimuove tutti i simboli privati e quasi tutti i simboli pubblici, lasciando solo i simboli _myFunction5 e _myGlobal7:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -F:_myFunction5 -F:_myGlobal7
Se si combinano più istanze dell'opzione -f su una riga, vengono rimossi tutti i simboli specificati. Se si combinano più istanze dell'opzione -F su una riga, tutti i simboli specificati vengono mantenuti e tutti gli altri simboli vengono rimossi. Non è possibile combinare -f con -F.
Le opzioni -f e -F non possono essere usate senza l'opzione -p, che rimuove tutti i dati dei simboli privati. Anche se il file originale non contiene simboli privati, è comunque necessario includere l'opzione -p (anche se non ha alcun effetto in questo caso).
Impossibile usare l'opzione -F per impedire la rimozione dei dati dei simboli privati. Se si usa questa opzione con un simbolo non incluso nella tabella dei simboli pubblici, PDBCopy lo ignora.
The mspdb*.dll File
PDBCopy deve accedere al file Mspdb80.dll o al file Mspdb60.dll per l'esecuzione. Per impostazione predefinita, PDBCopy usa Mspdb80.dll, ovvero la versione usata da Visual Studio .NET 2002 e versioni successive di Visual Studio. Se i simboli sono stati compilati usando Visual Studio 6.0 o una versione precedente, è possibile specificare l'opzione della riga di comando -vc6 in modo che PDBCopy usi invece Mspdb60.dll, anche se non è necessaria. PDBCopy cerca il file appropriato anche se l'opzione -vc6 non viene usata. È possibile trovare questi file all'interno dell'installazione di Visual Studio, Platform SDK o Windows Driver Kit (WDK).
Prima di eseguire PDBCopy, assicurarsi che la versione corretta del file mspdb*.dll sia accessibile al computer e assicurarsi che il percorso sia parte del percorso del comando. In caso contrario, è consigliabile usare il comando path per aggiungere questo percorso al percorso del comando.
Firma file e indice SymSrv
Ogni file di simboli ha una firma fissa che lo identifica in modo univoco. SymSrv usa la firma per generare un "valore di indice" univoco per il file. Se due file hanno un contenuto diverso o tempi di creazione diversi, avranno anche firme distinte e valori di indice SymSrv distinti.
I file creati con PDBCopy sono un'eccezione alla regola dei valori di indice univoci. Quando PDBCopy crea un nuovo file di simboli, ha la stessa firma e il valore dell'indice SymSrv del file precedente. Questa funzionalità consente di sostituire un file con l'altro senza modificare il comportamento degli strumenti correlati ai simboli.
Se si desidera che il nuovo file abbia una firma distinta e un indice SymSrv, usare l'opzione -s. Nella maggior parte dei casi non si vuole usare questa opzione, poiché l'uso più comune di PDBCopy consiste nel creare un file di simboli modificato che può sostituire il file precedente senza causare una mancata corrispondenza. Una nuova firma può causare l'assegnazione di un valore di indice diverso al nuovo file rispetto al file precedente, impedendo la sostituzione corretta del nuovo file.
Per la sintassi della riga di comando completa, vedere Opzioni di Command-Line PDBCopy.