函数用作变量,如何知道使用其内存地址实际调用哪个函数

时间:2017-02-27 09:55:49

标签: c visual-studio function memory

我正在使用一组功能,具有相同的签名,说

typedef int(*function_type)(int a, int b)

所有这些功能(很多功能)都存储在action_list数组中 在程序中,还会发生以下情况:

chapter->action = (function_type)action_list[i];
...
chapter->action(x, y);

我想知道的是,最后一行调用了哪个确切的函数,这很简单:我只是使用调试器,在该行上设置断点,按F11(步入)然后我就看到了。

问题:我的代码中的许多地方都存在行chapter->action(x, y);,我对这些被调用函数的完整列表感兴趣。 显然,我可以搜索具有相同签名的所有函数,并在其开头添加print([%s], __FUNCTION__),但正如我在这里谈论的数百万行源代码的计算机程序,这也不是一个选项两者都不是。

我已经尝试过了:

printf("[%s]\n", chapter->action);

但这是一个坏主意:-)。以下情况更好,但现在我被卡住了:

printf("[%p]\n", chapter->action);

现在我知道这些函数存储在内存中的哪个位置(我有完整的列表),但是如何使用这些值来知道我正在处理哪些函数? (我已经检查过,在重新运行程序时,似乎使用了相同的指针值)

1 个答案:

答案 0 :(得分:1)

鉴于您在Windows环境下并使用Visual Studio,我可以建议一个简单的方法。您可以做的是生成DLL而不是可执行文件,并导出所有函数。 然后,一个简单的包装器程序可以调用dll中的main函数。 您可以获取所有已调用地址的列表。最后,您可以使用SymFromAddr来获取函数的字符串名称。

似乎还有很长的路要走,但是现在这就是我能想到的,如果你想避免解析pdb的话。还有一些开源工具可以帮助您使用pdb文件。所以你也可以使用它们。