我有一个第三方源代码,我必须对其进行调查。我想查看函数的调用顺序,但我不想浪费时间输入:
printf("Entered into %s", __FUNCTION__)
and
printf("Exited from %s", __FUNCTION__)
对于每个函数,我也不想触及任何源文件。
你有什么建议吗?是否有一个编译器标志可以自动为我执行此操作?
对评论的澄清:
- 我将交叉编译源代码以在 ARM 上运行它。
- 我将用 gcc 编译它。
- 我不想分析静态代码。我想跟踪运行时。所以 doxygen 不会让我的生活变得更轻松。
- 我有源码,可以编译。
- 我不想使用面向方面的编程。
编辑:
我发现 gdb 提示符中的“frame”命令会打印该时间点的当前帧(或者,您可以说,函数名称)。也许,每次调用函数时都可以(使用 gdb 脚本)调用“frame”命令。你怎么认为?
除了通常的调试器和面向方面的编程技术之外,您还可以使用 gcc 注入自己的检测函数-finstrument-functions http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-finstrument_002dfunctions-2112命令行选项。你必须实施你自己的__cyg_profile_func_enter()
and __cyg_profile_func_exit()
函数(将它们声明为extern "C"
在 C++ 中)。
它们提供了一种方法来跟踪从哪里调用了什么函数。但是,该接口使用起来有点困难,因为传递的是被调用函数的地址及其调用点,而不是函数名称。您可以记录地址,然后使用类似的方法从符号表中提取相应的名称objdump --syms http://linux.die.net/man/1/objdump or nm http://linux.die.net/man/1/nm,当然假设这些符号没有从相关的二进制文件中删除。
它可能只是更容易使用gdb
。 YMMV。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)