Recupero delle informazioni sui simboli in base al nome
Il codice seguente illustra come chiamare la funzione SymFromName. 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 szSymbolName è un buffer che archivia il nome del simbolo richiesto. Nell'esempio si presuppone che il gestore dei simboli sia stato inizializzato usando il codice in Inizializzazione del gestore simboli.
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 un'applicazione ha un modulo o un nome di file di origine e informazioni sul numero di riga, può usare SymGetLineFromName64 per recuperare un indirizzo di codice virtuale. Questa funzione richiede un puntatore a una struttura IMAGEHLP_LINE64 per ricevere l'indirizzo del codice virtuale. Si noti che il gestore dei simboli può recuperare le informazioni sul numero di riga solo quando SYMOPT_LOAD_LINES opzione è impostata usando la funzione SymSetOptions. Questa opzione deve essere impostata prima di caricare il modulo. Il parametro szModuleName contiene il nome del modulo di origine; è facoltativo e può essere NULL. Il parametro szFileName deve contenere il nome del file di origine e il parametro dwLineNumber deve contenere il numero di riga per il quale verrà recuperato l'indirizzo virtuale.
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);
}