Что такое аргумент «SymbolSize» в обратных вызовах «SymEnumSymbols» из dbghelp? - PullRequest
0 голосов
/ 27 декабря 2018

Я использую функцию 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 Результаты.Спасибо за любую помощь!

...