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