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);
}