Símbolos públicos, globais e locais
Os recursos de tratamento de símbolos da API DbgHelp evoluíram ao longo dos anos. Para garantir que seu código funcione em uma variedade de cenários e forneça detalhes completos sobre os símbolos, use as funções mais recentes sempre que possível. Por exemplo, SymEnumSymbols substitui SymEnumerateSymbols64, SymFromName substitui SymGetSymFromName64 e SymFromAddr substitui SymGetSymFromAddr64.
Símbolos públicos
Versões iniciais de DbgHelp.dll com suporte examinando apenas símbolos públicos. Esses símbolos são gerados para qualquer item no código que deve ser exposto entre arquivos de origem diferentes. Eles também incluem todos os itens exportados para fora do módulo.
Os símbolos são inseridos na imagem ou armazenados separadamente em um arquivo .dbg ou .pdb. As únicas informações armazenadas são o nome e o endereço do símbolo. Os nomes estão disponíveis como nomes decorados. Para exibir nomes não corrigidos, chame a função SymSetOptions com SYMOPT_UNDNAME ou use a função UnDecorateSymbolName.
Observe que a API DbgHelp não foi inicialmente projetada para dar suporte a várias instâncias do mesmo símbolo em um módulo. Isso ocorre porque os símbolos públicos são restritos a nomes exclusivos em um módulo. Portanto, SymGetSymFromName64 retorna apenas o primeiro símbolo correspondente. Para recuperar todos os símbolos correspondentes, chame SymEnumSymbols.
Símbolos globais e locais
Versões mais recentes do DbgHelp.dll dão suporte a símbolos globais e locais ao usar arquivos .pdb. Essas novas versões incluem funções estáticas, funções com escopo dentro de um arquivo de origem, parâmetros de função e variáveis locais. Quando dbgHelp procura um símbolo, ele verifica as tabelas de símbolos globais e locais antes de verificar a tabela de símbolos públicos. Isso ocorre porque há mais informações disponíveis para esses tipos de símbolos do que está disponível para símbolos públicos.
Símbolos globais e locais são armazenados com nomes não corrigidos. Portanto, o sinalizador SYMOPT_UNDNAME não tem efeito. Para obter nomes de símbolo decorados, você deve usar o sinalizador SYMOPT_PUBLICS_ONLY. Isso faz com que dbgHelp pesquise apenas os símbolos públicos.
Para exibir símbolos locais ou parâmetros de função, chame a função SymSetContext com o InstructionOffset membro da estrutura IMAGEHLP_STACK_FRAME definida como o endereço de qualquer símbolo de função. Chamadas subsequentes para SymFromName e SymEnumSymbols podem operar no contexto desse endereço. Para fazer isso, defina o parâmetro BaseOfDll para NULL e omita o especificador do módulo do parâmetro Name ou Mask. Isso força o DbgHelp a procurar símbolos correspondentes no escopo indicado por SymSetContext.
Para determinar se um símbolo é um parâmetro, verifique o Flags membro da estrutura SYMBOL_INFO. Se o símbolo for um parâmetro, o membro conterá SYMFLAG_PARAMETER. Se for um símbolo local, o membro conterá SYMFLAG_LOCAL.