0

我正在使用库中的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结果没有意义。谢谢你的帮助!

4

0 回答 0