Usando PDBCopy
O PDBCopy é uma ferramenta de linha de comando que cria um arquivo de símbolo removido de um arquivo de símbolo completo. Em outras palavras, ele usa um arquivo de símbolo que contém dados de símbolo privado e uma tabela de símbolos públicos e cria uma cópia desse arquivo que contém apenas a tabela de símbolos públicos. Dependendo de quais opções PDBCopy são usadas, o arquivo de símbolo removido contém toda a tabela de símbolos públicos ou um subconjunto especificado da tabela de símbolos públicos.
Para obter o local do PDBCopy no WDK, consulte Diretório de instalação em Ferramentas Incluídas em Ferramentas de Depuração para Windows.
O PDBCopy funciona com qualquer arquivo de símbolo de formato PDB (com extensão de nome de arquivo .pdb), mas não com os arquivos de símbolo de formato mais antigo (.dbg).
Para obter uma descrição de tabelas de símbolos públicos e dados de símbolos privados, consulte Símbolos públicos e privados.
Removendo símbolos privados
Se você quiser criar um arquivo de símbolo despojado que contenha todos os símbolos públicos e nenhum dos símbolos privados, use PDBCopy com três parâmetros: o caminho e o nome do arquivo de símbolo original, o caminho e o nome do novo arquivo de símbolo e a opção -p.
Por exemplo, o comando a seguir cria um novo arquivo, chamado publicsymbols.pdb, que contém a mesma tabela de símbolos públicos que mysymbols.pdb, mas não contém nenhum dos dados de símbolo privado:
pdbcopy mysymbols.pdb publicsymbols.pdb -p
Se mysymbols.pdb já for um arquivo de símbolo removido, o conteúdo simbólico do novo arquivo e do arquivo antigo será idêntico.
Depois de emitir esse comando, você deve mover o novo arquivo para um novo local e renomeá-lo para o nome original do arquivo de símbolo (neste exemplo, mysymbols.pdb), pois a maioria dos programas de depuração e programas de extração de símbolos procura símbolos com base em um nome de arquivo específico. Como alternativa, você pode usar o mesmo nome de arquivo para o arquivo de entrada e o arquivo de saída na linha de comando PDBCopy, desde que diretórios diferentes sejam especificados:
pdbcopy c:\dir1\mysymbols.pdb c:\dir2\mysymbols.pdb -p
Nota O arquivo de destino não deve existir antes da execução do PDBCopy. Se existir um arquivo com esse nome, vários erros poderão ocorrer.
Removendo símbolos privados e símbolos públicos selecionados
Se você quiser não apenas remover os dados de símbolo privado, mas também reduzir a quantidade de informações na tabela de símbolos públicos, poderá usar a opção -f para especificar uma lista de símbolos públicos que devem ser removidos.
O exemplo a seguir ilustra este procedimento:
Determine os nomes completos, incluindo decorações, dos símbolos que você deseja remover. Se você não tiver certeza dos nomes de símbolo decorados, poderá usar a ferramenta DBH para determine-los. Consulte Determinando as decorações de um símbolo específico para obter detalhes. Neste exemplo, vamos supor que os nomes decorados dos símbolos que você deseja remover são _myGlobal1 e _myGlobal2.
Crie um arquivo de texto contendo uma lista dos símbolos a serem removidos. Cada linha nesse arquivo deve incluir o nome de um símbolo, incluindo decorações, mas não incluindo nomes de módulo. Neste exemplo, o arquivo conteria as duas linhas a seguir:
_myGlobal1 _myGlobal2
O arquivo pode receber qualquer nome que você escolher. Vamos supor que você nomeie esse arquivo listfile.txt e coloque-o no diretório C:\Temp.
Use a seguinte linha de comando PDBCopy:
pdbcopy OldPDB NewPDB -p -f:@TextFile
em que OldPDB e NewPDB são o arquivo de símbolo original e o novo arquivo de símbolo, e TextFile é o arquivo criado na etapa dois. A opção -f indica que determinados símbolos públicos devem ser removidos e o e comercial ( @ ) indica que esses símbolos estão listados no arquivo de texto especificado.
No exemplo atual, o comando teria esta aparência:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:@c:\temp\listfile.txt
Isso cria um novo arquivo de símbolo, C:\dir3\mysymbols.pdb, que não contém nenhum símbolo privado e não contém as duas variáveis globais listadas em listfile.txt.
Conforme mostrado neste exemplo, a opção -f do PDBCopy remove uma lista específica de símbolos públicos. O e comercial ( @ ) indica que esses símbolos estão listados em um arquivo de texto. Um método alternativo é listar todos os símbolos na linha de comando, usando a opção -f sem um e comercial. Portanto, a linha de comando a seguir é equivalente ao exemplo no procedimento acima:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -f:_myGlobal1 -f:_myGlobal2
A menos que você deseje remover apenas um ou dois símbolos, é mais simples usar um arquivo de texto do que listá-los na linha de comando.
Se você quiser remover a maioria dos símbolos públicos do arquivo .pdb, a opção -F será o método mais fácil. Embora a opção -f exija que você liste os símbolos públicos que deseja remover, a opção -F exige que você liste os símbolos públicos que você não deseja remover. Todos os outros símbolos públicos (bem como todos os símbolos privados) serão removidos. A opção -F dá suporte às mesmas duas opções de sintaxe que a opção -f: -F: seguido pelo nome de um símbolo a ser retido ou -F:@ seguido pelo nome de um arquivo de texto que contém uma lista dos símbolos a serem retidos. Em ambos os casos, nomes de símbolo decorados devem ser usados.
Por exemplo, o comando a seguir remove todos os símbolos privados e quase todos os símbolos públicos, deixando apenas os símbolos _myFunction5 e _myGlobal7:
pdbcopy c:\dir1\mysymbols.pdb c:\dir3\mysymbols.pdb -p -F:_myFunction5 -F:_myGlobal7
Se você combinar várias instâncias da opção -f em uma linha, todos os símbolos especificados serão removidos. Se você combinar várias instâncias da opção -F em uma linha, todos os símbolos especificados serão retidos e todos os outros símbolos serão removidos. Não é possível combinar -f com -F.
As opções -f e -F não podem ser usadas sem a opção -p, que remove todos os dados de símbolo privado. Mesmo que o arquivo original não contenha símbolos privados, você ainda deverá incluir a opção -p (embora não tenha efeito nesse caso).
A opção -F não pode ser usada para impedir que os dados de símbolo privado sejam removidos. Se você usar essa opção com um símbolo que não está incluído na tabela de símbolos públicos, PDBCopy a ignorará.
O arquivo mspdb*.dll
O PDBCopy deve acessar o arquivo Mspdb80.dll ou o arquivo Mspdb60.dll para ser executado. Por padrão, o PDBCopy usa Mspdb80.dll, que é a versão usada pelo Visual Studio .NET 2002 e versões posteriores do Visual Studio. Se os símbolos foram criados usando o Visual Studio 6.0 ou uma versão anterior, você pode especificar a opção de linha de comando -vc6 para que o PDBCopy use Mspdb60.dll, embora isso não seja necessário. O PDBCopy procura o arquivo apropriado mesmo que a opção -vc6 não seja usada. Você pode encontrar esses arquivos em sua instalação do Visual Studio, do SDK da Plataforma ou do WDK (Kit de Driver do Windows).
Antes de executar o PDBCopy, verifique se a versão correta do arquivo mspdb*.dll está acessível ao computador e verifique se o local faz parte do caminho do comando. Se não estiver, você deverá usar o comando path para adicionar esse local ao caminho do comando.
A assinatura do arquivo e o índice SymSrv
Cada arquivo de símbolo tem uma assinatura fixa que o identifica exclusivamente. O SymSrv usa a assinatura para gerar um "valor de índice" exclusivo para o arquivo. Se dois arquivos tiverem conteúdo diferente ou tempos de criação diferentes, eles também terão assinaturas distintas e valores de índice SymSrv distintos.
Os arquivos criados com PDBCopy são uma exceção à regra de valores de índice exclusivos. Quando o PDBCopy cria um novo arquivo de símbolo, ele tem a mesma assinatura e o mesmo valor de índice SymSrv que o arquivo antigo. Esse recurso permite que um arquivo seja substituído pelo outro sem alterar o comportamento das ferramentas relacionadas a símbolos.
Se você quiser que o novo arquivo tenha uma assinatura distinta e um índice SymSrv, use a opção -s. Na maioria dos casos, você não desejará usar essa opção, pois o uso mais comum do PDBCopy é criar um arquivo de símbolo alterado que possa substituir o arquivo antigo sem causar uma incompatibilidade. Uma nova assinatura pode fazer com que o SymSrv atribua um valor de índice diferente ao novo arquivo do que ao arquivo antigo, impedindo que o novo arquivo substitua corretamente o antigo.
Para obter a sintaxe de linha de comando completa, consulte Opções de Command-Line PDBCopy.