Recupero delle informazioni sui simboli in base all'indirizzo

Il codice seguente illustra come chiamare la funzione SymFromAddr. Questa funzione riempie una struttura SYMBOL_INFO. Poiché il nome è di lunghezza variabile, è necessario specificare un buffer di dimensioni sufficienti per contenere il nome archiviato alla fine della struttura SYMBOL_INFO . Inoltre, il membro MaxNameLen deve essere impostato sul numero di byte riservati per il nome. In questo esempio dwAddress è l'indirizzo di cui eseguire il mapping a un simbolo. La funzione SymFromAddr archivierà un offset all'inizio del simbolo all'indirizzo in dwDisplacement. Nell'esempio si presuppone che il gestore dei simboli sia stato inizializzato usando il codice in Inizializzazione del gestore simboli.

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

Per recuperare il numero di riga del codice sorgente per un indirizzo specificato, un'applicazione può usare SymGetLineFromAddr64. Questa funzione richiede un puntatore a una struttura IMAGEHLP_LINE64 per ricevere il nome del file di origine e il numero di riga corrispondenti a un indirizzo di codice specificato. Si noti che il gestore dei simboli può recuperare le informazioni sul numero di riga solo quando SYMOPT_LOAD_LINES è impostato usando la funzione SymSetOptions. Questa opzione deve essere impostata prima di caricare il modulo. Il parametro dwAddress contiene l'indirizzo di codice per il quale si trovano il nome del file di origine e il numero di riga.

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