Compartilhar via


Recuperando informações de símbolo por endereço

O código a seguir demonstra como chamar a função SymFromAddr. Esta função preenche uma estrutura SYMBOL_INFO. Como o nome é variável em comprimento, você deve fornecer um buffer que seja grande o suficiente para manter o nome armazenado no final da estrutura SYMBOL_INFO. Além disso, o membro MaxNameLen deve ser definido como o número de bytes reservados para o nome. Neste exemplo, dwAddress é o endereço a ser mapeado para um símbolo. A função SymFromAddr armazenará um deslocamento para o início do símbolo para o endereço em dwDisplacement. O exemplo pressupõe que você tenha inicializado o manipulador de símbolos usando o código em Inicializando o manipulador de símbolos.

DWORD64  dwDisplacement = 0;
DWORD64  dwAddress = SOME_ADDRESS;

char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromAddr(hProcess, dwAddress, &dwDisplacement, pSymbol))
{
    // SymFromAddr returned success
}
else
{
    // SymFromAddr failed
    DWORD error = GetLastError();
    printf("SymFromAddr returned error : %d\n", error);
}

Para recuperar o número de linha do código-fonte para um endereço especificado, um aplicativo pode usar SymGetLineFromAddr64. Essa função requer um ponteiro para uma estrutura IMAGEHLP_LINE64 para receber o nome do arquivo de origem e o número da linha correspondente a um endereço de código especificado. Observe que o manipulador de símbolos pode recuperar informações de número de linha somente quando SYMOPT_LOAD_LINES é definido usando a função SymSetOptions. Esta opção deve ser definida antes de carregar o módulo. O parâmetro dwAddress contém o endereço de código para o qual o nome do arquivo de origem e o número da linha serão localizados.

DWORD64  dwAddress;
DWORD  dwDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
dwAddress = 0x1000000; // Address you want to check on.

if (SymGetLineFromAddr64(hProcess, dwAddress, &dwDisplacement, &line))
{
    // SymGetLineFromAddr64 returned success
}
else
{
    // SymGetLineFromAddr64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromAddr64 returned error : %d\n"), error);
}