Recuperando informações de símbolo por nome

O código a seguir demonstra como chamar a função SymFromName. 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, szSymbolName é um buffer que armazena o nome do símbolo solicitado. O exemplo pressupõe que você tenha inicializado o manipulador de símbolos usando o código em Inicializando o manipulador de símbolos.

TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
    MAX_SYM_NAME * sizeof(TCHAR) +
    sizeof(ULONG64) - 1) /
    sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;

_tcscpy_s(szSymbolName, MAX_SYM_NAME, TEXT("WinMain"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;

if (SymFromName(hProcess, szSymbolName, pSymbol))
{
    // SymFromName returned success
}
else
{
    // SymFromName failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymFromName returned error : %d\n"), error);
}

Se um aplicativo tiver um nome de arquivo de origem ou módulo, bem como informações de número de linha, ele poderá usar SymGetLineFromName64 para recuperar um endereço de código virtual. Essa função requer um ponteiro para uma estrutura IMAGEHLP_LINE64 para receber o endereço de código virtual. Observe que o manipulador de símbolos pode recuperar informações de número de linha somente quando SYMOPT_LOAD_LINES opção é definida usando a função SymSetOptions. Esta opção deve ser definida antes de carregar o módulo. O parâmetro szModuleName contém o nome do módulo de origem; é opcional e pode ser NULL. O parâmetro szFileName deve conter o nome do arquivo de origem e o parâmetro dwLineNumber deve conter o número da linha para a qual o endereço virtual será recuperado.

TCHAR  szModuleName[MAX_PATH];
TCHAR  szFileName[MAX_PATH];
DWORD  dwLineNumber;
LONG   lDisplacement;
IMAGEHLP_LINE64 line;

SymSetOptions(SYMOPT_LOAD_LINES);

line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
_tcscpy_s(szModuleName, MAX_PATH, TEXT("MyApp"));
_tcscpy_s(szFileName, MAX_PATH, TEXT("main.c"));
dwLineNumber = 248;

if (SymGetLineFromName64(hProcess, szModuleName, szFileName,
    dwLineNumber, &lDisplacement, &line))
{
    // SymGetLineFromName64 returned success
}
else
{
    // SymGetLineFromName64 failed
    DWORD error = GetLastError();
    _tprintf(TEXT("SymGetLineFromName64 returned error : %d\n"), error);
}