Freigeben über


Abrufen von Symbolinformationen nach Name

Der folgende Code veranschaulicht, wie die SymFromName-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 szSymbolName ein Puffer, der den Namen des angeforderten Symbols speichert. Im Beispiel wird davon ausgegangen, dass Sie den Symbolhandler mithilfe des Codes in Initialisieren des Symbolhandlers initialisiert haben.

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

Wenn eine Anwendung über einen Modul- oder Quelldateinamen sowie Zeilennummerninformationen verfügt, kann sie SymGetLineFromName64 verwenden, um eine virtuelle Codeadresse abzurufen. Diese Funktion erfordert einen Zeiger auf eine IMAGEHLP_LINE64-Struktur , um die virtuelle Codeadresse zu empfangen. Beachten Sie, dass der Symbolhandler Zeilennummerninformationen nur abrufen kann, wenn SYMOPT_LOAD_LINES Option mithilfe der SymSetOptions-Funktion festgelegt ist. Diese Option muss vor dem Laden des Moduls festgelegt werden. Der Parameter szModuleName enthält den Namen des Quellmoduls. sie ist optional und kann NULL sein. Der parameter szFileName sollte den Namen der Quelldatei enthalten, und der dwLineNumber-Parameter sollte die Zeilennummer enthalten, für die die virtuelle Adresse abgerufen wird.

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