Что такое аргумент "SymbolSize" в обратных вызовах "SymEnumSymbols" из dbghelp?
Я использую symEnumSymbol
функция от dbghelp
библиотека, чтобы получить подробную информацию о любом malloc
символы в исполняемом файле. Один из аргументов, который мне нужно передать, - это функция обратного вызова со следующей подписью:
BOOL CALLBACK EnumSymProc(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext);
И я хочу извлечь все данные из этих параметров.
Центр разработки Windows предоставляет это недостаточное описание о втором:
SymbolSize: размер символа в байтах. Размер рассчитывается и на самом деле является предположение. В некоторых случаях это значение может быть нулевым.
Я реализовал обратный вызов следующим образом:
BOOL CALLBACK EnumSymCallback(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext)
{
UNREFERENCED_PARAMETER(UserContext);
printf("Hello from symEnumSymbols!\n");
printf("%08X %4u %s\n", (unsigned int)pSymInfo->Address, SymbolSize, pSymInfo->Name);
return TRUE;
}
и я звоню SymEnumSymbols
с этими аргументами:
if (!SymEnumSymbols(
GetCurrentProcess(), // handler to the process.
0,
"*!malloc", // combination of the last two lines means: Enumerate every 'malloc' symbol in every loaded module - we might change this...
EnumSymCallback,
NULL // argument for the callback.
))
{
printf("SymEnumSymbols failed :-(\n");
DWORD error = GetLastError();
printf("SymEnumSymbols returned error : %d\n", error);
return FALSE;
}
printf("SymEnumSymbols succeeded :-)\n");
и я получил этот вывод: [РЕДАКТИРОВАТЬ: я просто добавил перечисление для free
]
Hello from symEnumSymbols!
766300D0 16 malloc
Hello from symEnumSymbols!
0F9BE340 32 malloc
Hello from symEnumSymbols!
7662E0F0 48 free
Hello from symEnumSymbols!
0F9BDFA0 80 free
SymEnumSymbols succeeded :-)
Как видите, в первый раз malloc
размер символа 16, а во втором 32. Я не уверен, как я получил два malloc
во-первых, поскольку мой исполняемый файл должен иметь только один (я написал исходный код), но при условии, что другой исходит от компилятора или чего-то еще - что это за размеры? а почему они разные?!
Я могу предположить, что это указывает 32-битную команду или 16-ю команду, но я действительно не имею понятия, и это не имеет смысла с free
Результаты. Спасибо за любую помощь!
1 ответ
Взято из документов.
[in]Размер символа
Размер символа в байтах. Размер рассчитан и фактически является предположением. В некоторых случаях это значение может быть равно нулю.
Это описание выглядит запутанным. Я лично не использую SymbolSize, но специально запрашиваю длину символа при запросе.
Существуют различные типы символов, такие как символы функций и символы UDT (описывающие макет структуры или класса). SymbolSize имеет смысл для символа UDT, но для функционального символа я понятия не имею, что может означать SymbolSize. Размер кода самой функции? Тот факт, что он говорит «на самом деле является догадкой», я бы решил, что это не так уж полезно.