如何知道某些功能是否存在并且已被调用

时间:2012-02-23 10:37:55

标签: function assembly x86 label

我最近开始使用x86汇编程序,但我找不到任何方法来知道代码中是否存在某个函数,以及是否在执行中调用它。

例如,我有一个名为“Sum”的函数的代码,我需要一个命令或任何让我知道汇编代码中是否存在“Sum”并且在执行中调用它的东西。

提前致谢 路瑟

4 个答案:

答案 0 :(得分:2)

无法知道某个函数是否已经被调用,使该函数在某处设置一些全局内存以指示其首次使用(在C中为al static)。在知道它是否存在方面,除非该函数具有EAT条目,否则这几乎是不可能的,在这种情况下,您可以使用GetProcAddress来获取地址,并检查它是否为空。

如果你想在'编译'但是,你可以通过尝试调用函数来判断某个函数是否存在,并让汇编器或链接器向你抛出一个错误,如果它没有。

说到这一切,听起来你应该重新评估你的方法,为什么你需要确定一个函数是否已被调用以及它是否存在?

答案 1 :(得分:0)

好吧,如果您只想查看代码中是否存在函数,可以在编辑器中找到它。如果你找到它,它就存在了。

至于检查它是否被调用 - 这有点棘手,因为它可以间接调用,但你可以在它的第一条指令上设置一个断点并调试代码。如果调试器停止,则调用该函数。如果调试器没有停在那里,那并不意味着它的从不被调用。

答案 2 :(得分:0)

要确定是否存在名为“Hello”的例程,可以尝试一些事项。

从* nix命令行...

在项目树的顶部,执行“grep -lrw Hello *”。这将返回包含单词“Hello”的文件列表。然后,您只需要搜索这些文件。

或者,如果您已将调试信息编译到库/目标文件中,则可以尝试“nm | grep Hello”来确定是否存在名为“Hello”的例程。

或者,您可能希望执行“objdump -d”并搜索名为“Hello”的例程/标签(还假设调试信息包含在图像中)。

然而,许多IDE都内置了功能查找器。如果您使用的话,也许可以使用它。

至于确定是否已调用此例程,则需要在运行时设置和检查全局变量。

希望这有帮助。

答案 3 :(得分:0)

最后,我找到了办法。 Gcc compilator有-S选项强制他编写汇编代码,然后用grep你可以看到它。 要知道它是否已被执行,断点的事情到目前为止还能很好地发挥作用。

谢谢你们!