Récupération des informations sur les symboles par adresse
Le code suivant montre comment appeler la fonction SymFromAddr . Cette fonction remplit une structure SYMBOL_INFO . É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 SYMBOL_INFO . En outre, le membre MaxNameLen doit être défini sur le nombre d’octets réservés pour le nom. Dans cet exemple, dwAddress est l’adresse à mapper à un symbole. La fonction SymFromAddr stocke un décalage au début du symbole pour l’adresse dans dwDisplacement. L’exemple suppose que vous avez initialisé le gestionnaire de symboles à l’aide du code dans Initialisation du gestionnaire de symboles.
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);
}
Pour récupérer le numéro de ligne du code source pour une adresse spécifiée, une application peut utiliser SymGetLineFromAddr64. Cette fonction nécessite un pointeur vers une structure IMAGEHLP_LINE64 pour recevoir le nom de fichier source et le numéro de ligne correspondant à une adresse de code spécifiée. Notez que le gestionnaire de symboles peut récupérer des informations de numéro de ligne uniquement lorsque SYMOPT_LOAD_LINES est défini à l’aide de la fonction SymSetOptions . Cette option doit être définie avant le chargement du module. Le paramètre dwAddress contient l’adresse de code pour laquelle le nom du fichier source et le numéro de ligne seront localisés.
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);
}