Récupération des informations de symbole par nom
Le code suivant montre comment appeler la fonction SymFromName . Cette fonction remplit une structure SYMBOL_INFO . Étant donné que le nom est variable en longueur, vous devez fournir une mémoire tampon suffisamment grande pour contenir le nom stocké à la fin de la structure SYMBOL_INFO . En outre, le membre MaxNameLen doit être défini sur le nombre d’octets réservés au 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 source ou un module ainsi que des informations de numéro de ligne, elle peut utiliser SymGetLineFromName64 pour récupérer une adresse de code virtuel. Cette fonction nécessite un pointeur vers une structure IMAGEHLP_LINE64 pour recevoir l’adresse de code virtuel. Notez que le gestionnaire de symboles peut récupérer les informations de numéro de ligne uniquement lorsque SYMOPT_LOAD_LINES option est définie à l’aide de la fonction SymSetOptions . Cette option doit être définie avant de charger le module. Le paramètre szModuleName contient le nom du module source ; il est facultatif et peut être NULL. Le paramètre szFileName doit contenir le nom du fichier source et 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);
}