gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:18 25 4
gpt4 key购买 nike

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

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);

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

最佳答案

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

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

关于c - 函数作为变量使用,如何使用其内存地址知道实际调用了哪个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com