Freigeben über


Abrufen von Symbolinformationen nach Adresse

Der folgende Code veranschaulicht, wie die SymFromAddr-Funktion aufgerufen wird. Diese Funktion füllt eine SYMBOL_INFO-Struktur aus. Da der Name eine variable Länge aufweist, müssen Sie einen Puffer angeben, der groß genug ist, um den Namen zu speichern, der am Ende der SYMBOL_INFO-Struktur gespeichert ist. Außerdem muss das MaxNameLen-Element auf die Anzahl von Bytes festgelegt werden, die für den Namen reserviert sind. In diesem Beispiel ist dwAddress die Adresse, die einem Symbol zugeordnet werden soll. Die SymFromAddr-Funktion speichert einen Offset zum Anfang des Symbols zur Adresse in dwDisplacement. Im Beispiel wird davon ausgegangen, dass Sie den Symbolhandler mithilfe des Codes in Initialisieren des Symbolhandlers initialisiert haben.

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

Um die Quellcodezeilennummer für eine angegebene Adresse abzurufen, kann eine Anwendung SymGetLineFromAddr64 verwenden. Diese Funktion erfordert einen Zeiger auf eine IMAGEHLP_LINE64-Struktur , um den Namen der Quelldatei und die Zeilennummer zu erhalten, die einer angegebenen Codeadresse entsprechen. Beachten Sie, dass der Symbolhandler Zeilennummerninformationen nur abrufen kann, wenn SYMOPT_LOAD_LINES mithilfe der SymSetOptions-Funktion festgelegt ist. Diese Option muss vor dem Laden des Moduls festgelegt werden. Der dwAddress-Parameter enthält die Codeadresse, für die sich der Quelldateiname und die Zeilennummer befinden.

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