Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В следующем коде показано, как вызвать функцию SymFromAddr. Эта функция заполняет структуру SYMBOL_INFO. Так как имя является переменной длины, необходимо указать буфер, который достаточно велик, чтобы сохранить имя, хранящееся в конце структуры SYMBOL_INFO. Кроме того, элемент maxNameLen должен иметь количество байтов, зарезервированных для имени. В этом примере dwAddress — это адрес, сопоставленный с символом. Функция SymFromAddr сохранит смещение от начала символа к адресу в dwDisplacement. В примере предполагается, что вы инициализировали обработчик символов с помощью кода в инициализация обработчика символов.
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);
}
Чтобы получить номер строки исходного кода для указанного адреса, приложение может использовать SymGetLineFromAddr64. Эта функция требует указателя на структуру IMAGEHLP_LINE64 для получения имени исходного файла и номера строки, соответствующего указанному адресу кода. Обратите внимание, что обработчик символов может получать сведения о номере строки только в том случае, если SYMOPT_LOAD_LINES задано с помощью функции SymSetOptions. Этот параметр необходимо задать перед загрузкой модуля. Параметр dwAddress содержит адрес кода, для которого будут определены название исходного файла и номер строки.
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);
}