DbgHelp - 获取完整的符号签名(函数名称+参数类型)

时间:2015-08-27 14:08:31

标签: c++ symbols signature dbghelp

我正在使用SymEnumSymbols将所有匹配的符号添加到给定的掩码中,并使用CALLBACK函数将它们推送到向量中。问题是,符号名称(在PSYMBOL_INFO结构内)只是函数的名称,而不是整个签名。例如,我有这个函数:

TestMe!GetImageProcAddress (struct HINSTANCE__ *hi, int num)

当我使用掩码"TestMe!GetImageProcAddress"调用SymEnumSymbols并打印匹配符号的名称时,我得到:

printf("%s\n", pSymInfo->Name); // Prints: GetImageProcAddress

但是我想要打印其中一个:

TestMe!GetImageProcAddress (struct HINSTANCE__ *, int)
GetImageProcAddress (struct HINSTANCE__ *, int)

所以我的问题 - 有没有办法获得完整的符号签名(函数名称+参数类型)?我能够使用SymSetContext迭代参数,然后SymEnumSymbols并使用标记SYMFLAG_PARAMETER进行过滤 - 但我不知道如何获取参数的类型..

谢谢!

1 个答案:

答案 0 :(得分:1)

经过长时间的搜索 - 我找到了解决方案。 获取函数的索引后,需要通过使用SymSetContext将上下文设置为特定函数地址来枚举它的参数,然后调用SymEnumSymbols(并将其设置为使用上下文) :

SymEnumSymbols(GetCurrentProcess(), 0, NULL, ...)

然后,通过使用标志SYMFLAG_PARAMETER,您只能选择函数参数。现在,使用参数TypeIndex,您可以通过调用(很多次)SymGetTypeInfo来搜索参数类型。这并不简单,并且有很多基本情况......

这里可以找到一个非常好的解释: HOW TO USE DBGHELP TO ACCESS TYPE INFORMATION

可以在这里找到一个例子: TYPEINFODUMP

祝你好运!