Что такое аргумент "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. Размер кода самой функции? Тот факт, что он говорит «на самом деле является догадкой», я бы решил, что это не так уж полезно.

Другие вопросы по тегам