我正在使用symEnumSymbol
库中的dbghelp
函数来获取有关可执行文件中任何malloc
符号的详细信息。我需要传递的参数之一是带有以下签名的回调functoin:
BOOL CALLBACK EnumSymProc(
PSYMBOL_INFO pSymInfo,
ULONG SymbolSize,
PVOID UserContext);
我想从这些参数中提取所有数据。
Windows Dev Center提供的关于第二个内容的描述不足:
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
结果无关。感谢您的帮助!