Udostępnij przez


Pobieranie informacji o symbolach według nazwy

Poniższy kod pokazuje, jak wywołać funkcję SymFromName. Ta funkcja wypełnia strukturę SYMBOL_INFO. Ponieważ nazwa jest zmienna długości, należy podać bufor, który jest wystarczająco duży, aby przechowywać nazwę przechowywaną na końcu struktury SYMBOL_INFO. Ponadto składnik MaxNameLen musi być ustawiony na liczbę bajtów zarezerwowanych dla nazwy. W tym przykładzie szSymbolName to bufor, który przechowuje nazwę żądanego symbolu. W przykładzie przyjęto założenie, że zainicjowano procedurę obsługi symboli przy użyciu kodu w inicjowanie programu obsługi symboli.

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

Jeśli aplikacja ma nazwę modułu lub pliku źródłowego, a także informacje o numerze wiersza, może użyć SymGetLineFromName64, aby pobrać adres kodu wirtualnego. Ta funkcja wymaga wskaźnika do struktury IMAGEHLP_LINE64 w celu odbierania adresu kodu wirtualnego. Należy pamiętać, że program obsługi symboli może pobierać informacje o numerze wiersza tylko wtedy, gdy SYMOPT_LOAD_LINES opcja jest ustawiona przy użyciu funkcji SymSetOptions. Tę opcję należy ustawić przed załadowaniem modułu. Parametr szModuleName zawiera nazwę modułu źródłowego; jest opcjonalny i może mieć wartość null. Parametr szFileName powinien zawierać nazwę pliku źródłowego, a parametr dwLineNumber powinien zawierać numer wiersza, dla którego zostanie pobrany adres wirtualny.

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