Поделиться через


Получение сведений о символах по имени

В следующем коде показано, как вызвать функцию SymFromName. Эта функция заполняет структуру SY МБOL_INFO. Так как имя является переменной длины, необходимо указать буфер, который достаточно велик для хранения имени, хранящегося в конце структуры SY МБOL_INFO. Кроме того, для элемента MaxNameLen необходимо задать количество байтов, зарезервированных для имени. В этом примере szSymbolName — это буфер, в который хранится имя запрошенного символа. В примере предполагается, что обработчик символов инициализирован с помощью кода при инициализации обработчика символов.

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

Если у приложения есть имя модуля или исходного файла, а также сведения о номере строки, он может использовать SymGetLineFromName64 для получения адреса виртуального кода. Эта функция требует указателя на структуру IMAGEHLP_LINE64 для получения адреса виртуального кода. Обратите внимание, что обработчик символов может получать сведения о номере строки только в том случае, если параметр SYMOPT_LOAD_LINES задан с помощью функции SymSetOptions. Этот параметр необходимо задать перед загрузкой модуля. Параметр szModuleName содержит имя исходного модуля; он является необязательным и может иметь значение NULL. Параметр szFileName должен содержать имя исходного файла, а параметр dwLineNumber должен содержать номер строки, для которого будет получен виртуальный адрес.

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