Usando o SymChk
A sintaxe básica do SymChk é a seguinte:
symchk [/r] FileNames /s SymbolPath
FileNames especifica um ou mais arquivos de programa cujos símbolos são necessários. Se FileNames for um diretório e o sinalizador /r for usado, esse diretório será explorado recursivamente e o SymChk tentará encontrar símbolos para todos os arquivos de programa nesta árvore de diretório. SymbolPath especifica onde symChk deve pesquisar símbolos.
Há muito mais opções de linha de comando. Para obter uma listagem completa, consulte Opções de Command-Line do SymChk.
Obtendo symchk
O Symchk, como outras ferramentas de depuração, é fornecido como parte do depurador. Para obter mais informações, consulte Ferramentas de depuração para Windows.
Depois que as ferramentas de depuração forem instaladas, o symchk estará disponível neste diretório para Windows de 64 bits.
C:\Arquivos de Programas (x86)\Kits do Windows\10\Depuradores\x64
Exemplo de uso
O caminho do símbolo especificado pode incluir qualquer número de diretórios locais, diretórios UNC ou servidores de símbolos. Diretórios locais e diretórios UNC não são pesquisados recursivamente. Somente o diretório especificado e um subdiretório com base na extensão do executável são pesquisados. Por exemplo, a consulta
symchk thisdriver.sys /s G:\symbols
pesquisará G:\mysymbols e G:\mysymbols\sys.
Você pode especificar um servidor de símbolos usando uma das seguintes sintaxes como parte do caminho do símbolo:
srv*DownstreamStore*\\Server\Share
srv*\\Server\Share
Isso é muito semelhante ao uso de um servidor de símbolos no caminho do símbolo do depurador. Para obter detalhes sobre isso, consulte Usando servidores de símbolos e repositórios de símbolos.
Se um repositório downstream for especificado, o SymChk fará cópias de todos os arquivos de símbolo válidos encontrados pelo servidor de símbolos e os colocará no repositório downstream. Somente os arquivos de símbolo que são correspondências completas são copiados downstream.
O SymChk sempre pesquisa o repositório downstream antes de consultar o servidor de símbolos. Portanto, você deve ter cuidado ao usar um repositório downstream quando outra pessoa estiver mantendo o repositório de símbolos. Se você executar o SymChk uma vez e encontrar arquivos de símbolo, ele os copiará para o repositório downstream. Se você executar o SymChk novamente depois que esses arquivos tiverem sido alterados ou excluídos no repositório de símbolos, o SymChk não observará esse fato, pois ele encontrará o que está procurando no repositório downstream e não procurará mais.
Nota O SymChk sempre usa o SymSrv (Symsrv.dll) como sua DLL do servidor de símbolos. Por outro lado, os depuradores podem escolher uma DLL de servidor de símbolo diferente de SymSrv se houver uma disponível. (SymSrv é o servidor de símbolos incluído no pacote Ferramentas de Depuração para Windows.)
Usando o SymChk para determinar se os símbolos são privados ou públicos
Para determinar se um arquivo de símbolo é privado ou público, use o parâmetro /v para que SymChk exiba uma saída detalhada. Suponha que MyApp.exe e MyApp.pdb estejam na pasta c:\sym. Insira este comando.
symchk /v C:\sym\MyApp.exe /s C:\sym**
Se MyApp.pdb contiver símbolos privados, a saída de SymChk terá esta aparência.
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - private symbols & lines
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Se MyApp.pdb contiver apenas símbolos públicos, a saída de SymChk terá esta aparência.
[SYMCHK] Searching for symbols to c:\sym\MyApp.exe in path c:\sym
...
DBGHELP: MyApp - public symbols
c:\sym\MyApp.pdb
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
Para limitar sua pesquisa para que ela encontre apenas arquivos de símbolo públicos, use a opção s com o parâmetro /s (/ss). O comando a seguir localiza uma correspondência se MyApp.pdb contiver apenas símbolos públicos. Ele não encontrará uma correspondência se MyApp.pdb contiver símbolos privados.
symchk /v C:\sym\MyApp.exe /s C:\sym
Para obter mais informações, consulte Símbolos públicos e privados.
Exemplos
Aqui estão alguns exemplos. O comando a seguir pesquisa símbolos para o programa Myapp.exe:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\applications
SYMCHK: Myapp.exe FAILED - Myapp.pdb is missing
SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0
Você pode tentar novamente com um caminho de símbolo diferente:
E:\debuggers> symchk F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
A pesquisa foi bem-sucedida desta vez. Se a opção detalhada não for usada, o SymChk listará apenas os arquivos para os quais não encontrou símbolos. Portanto, neste exemplo, nenhum arquivo foi listado. Você pode dizer que a pesquisa foi bem-sucedida porque agora há um arquivo listado na categoria "passado" e nenhum na categoria "com falha".
Um arquivo de programa será ignorado se não contiver código executável. Muitos arquivos de recurso são desse tipo.
Se você preferir ver os nomes de arquivo de todos os arquivos de programa, poderá usar a opção /v para gerar uma saída detalhada:
E:\debuggers> symchk /v F:\myapp.exe /s F:\symbols\newdirectory
SYMCHK: MyApp.exe PASSED
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
O comando a seguir pesquisa um grande número de símbolos do Windows em um servidor de símbolos. Há uma grande variedade de mensagens de erro possíveis:
E:\debuggers> symchk /r C:\windows\system32 /s srv*\\manysymbols\windows
SYMCHK: msisam11.dll FAILED - MSISAM11.pdb is missing
SYMCHK: msuni11.dll FAILED - msuni11link.pdb is missing
SYMCHK: msdxm.ocx FAILED - Image is split correctly, but msdxm.dbg i
s missing
SYMCHK: expsrv.dll FAILED - Checksum doesn't match with expsrv.DBG
SYMCHK: imeshare.dll FAILED - imeshare.opt.pdb is missing
SYMCHK: ir32_32.dll FAILED - Built with no debugging information
SYMCHK: author.dll FAILED - rpctest.pdb is missing
SYMCHK: msvcrt40.dll FAILED - Built with no debugging information
......
SYMCHK: FAILED files = 211
SYMCHK: PASSED + IGNORED files = 4809