Compartilhar via


Carregamento de símbolo

O manipulador de símbolos carregará símbolos quando você chamar a função SymInitialize com o parâmetro fInvadeProcess definido como TRUE ou quando você chamar a função SymLoadModuleEx para especificar um módulo. Nos dois casos, o manipulador de símbolos carrega os símbolos ou adia o carregamento deles até que sejam solicitados, dependendo das opções definidas pela função SymSetOptions.

O manipulador de símbolos pode ser usado para recuperar informações simbólicas para qualquer módulo. Ele não precisa ser associado a um processo especificado na chamada SymInitialize. Para usar um módulo arbitrário, especifique o caminho completo para a imagem do módulo no parâmetro ImageName. Você pode usar um caminho para todo módulo executável que tenha informações de depuração (.exe, .dll, .drv, .sys, .scr, .cpl ou .com). Use o parâmetro BaseOfDll para especificar um endereço de carga e, em seguida, os endereços de símbolo serão baseados nesse endereço.

Talvez não seja necessário manter um módulo de símbolo carregado durante a duração de um aplicativo. Para liberar o módulo de símbolo da lista de módulos do manipulador de símbolos, use a função SymUnloadModule64. Essa função libera a memória alocada para o módulo de símbolo. Para usar símbolos para esse módulo novamente, você deve chamar a função SymLoadModuleEx mesmo se a opção de carregamento adiado de símbolo estiver definida.

Diagnosticar problemas de carregamento de símbolos

Para exibir todas as tentativas de carregar símbolos, chame SymSetOptions com SYMOPT_DEBUG. Isso faz com que dbgHelp chame a função OutputDebugString com informações detalhadas sobre pesquisas de símbolos, como os diretórios que está pesquisando e mensagens de erro. Se o código usar SymRegisterCallback64, DbgHelp chamará sua função de retorno de chamada em vez de chamar OutputDebugString. O parâmetro ActionCode é definido como CBA_DEBUG_INFO e o parâmetro CallbackData é uma cadeia de caracteres que pode ser exibida.

Para permitir que essa saída de depuração seja exibida no console sem alterar o código-fonte, defina a variável de ambiente DBGHELP_DBGOUT como um valor não NULL antes de chamar a função SymInitialize. Para registrar as informações em um arquivo, defina a variável de ambiente DBGHELP_LOG como o nome do arquivo de log a ser usado.

Observe que esses recursos devem ser usados somente quando necessário. Eles podem desacelerar o carregamento de símbolos de módulos que contêm muitos símbolos.