Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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);
}