Я использую функцию symEnumSymbol
из библиотеки dbghelp
, чтобы получить подробную информацию о любых символах malloc
в исполняемом файле.Одним из аргументов, которые мне нужно передать, является функция обратного вызова со следующей подписью:
BOOL CALLBACK EnumSymProc(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext);
И я хочу извлечь все данные, которые я могу, из этих параметров.
Windows DevЦентр предоставляет это недостаточное описание о втором:
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
Результаты.Спасибо за любую помощь!