Récupération des informations de symbole par nom
Le code suivant montre comment appeler la fonction SymFromName . Cette fonction remplit une structure d' _ informations de symbole . Étant donné que le nom est de longueur variable, vous devez fournir une mémoire tampon suffisamment grande pour contenir le nom stocké à la fin de la structure des _ informations de symbole . En outre, le membre MaxNameLen doit être défini sur le nombre d’octets réservés pour le nom. Dans cet exemple, szSymbolName est une mémoire tampon qui stocke le nom du symbole demandé. L’exemple suppose que vous avez initialisé le gestionnaire de symboles à l’aide du code dans initialisation du gestionnaire de symboles.
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);
}
Si une application possède un nom de fichier de module ou de source, ainsi que des informations de numéro de ligne, elle peut utiliser SymGetLineFromName64 pour récupérer une adresse de code virtuel. Cette fonction requiert un pointeur vers une structure imagehlp _ LINE64 pour recevoir l’adresse de code virtuel. Notez que le gestionnaire de symboles peut récupérer des informations sur les numéros de ligne uniquement lorsque _ _ l’option SYMOPT Load Lines est définie à l’aide de la fonction SymSetOptions . Cette option doit être définie avant le chargement du module. Le paramètre szModuleName contient le nom du module source ; Il est facultatif et peut avoir la valeur null. Le paramètre szFileName doit contenir le nom du fichier source, tandis que le paramètre dwLineNumber doit contenir le numéro de ligne pour lequel l’adresse virtuelle sera récupérée.
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);
}