2013-02-13 20 views
3

我尝试将剖析器构建到某个c项目。 我希望gcc在编译时在所有的函数入口和函数出口点中植入一些汇编指令。 我尝试在网上搜索一些指南,但没有成功。 我可以在哪里学习如何做到这一点?我如何在通过gcc函数的序幕和尾声中安装汇编指令

提前致谢。

+0

使用gperf怎么样? – JosephH 2013-02-13 10:00:32

+0

我想构建分析器 - 这是我的学习项目:) – user2066340 2013-02-13 10:14:58

回答

5

显然,你可以使用-finstrument-functions标志让gcc生成仪器在函数入口和出口要求

void __cyg_profile_func_enter(void *func, void *callsite); 
void __cyg_profile_func_exit(void *func, void *callsite); 

。我从来没有使用过这个,但是快速搜索会提供信息和示例here,here,herehere

+3

还要注意'no_instrument_function'属性,它可以用于cyg_profile函数本身以防止无限递归。 – ugoren 2013-02-13 11:49:24

+0

绝对 - 我强烈建议事先处理在线文档和示例 - 正如我所说的,从来没有亲自使用它,但它确实看起来像可能存在一些隐藏的陷阱它! – Michael 2013-02-13 12:01:42

+0

谢谢,它的作品.... – user2066340 2013-02-13 12:51:20

2

除非你想修改gcc(这是不平凡的!),我会认为有两个相当明显的方法。

  1. 预处理C代码本身 - 这并不容易,但也不是很难。找到一个函数的开始和结束,并添加你的代码,然后让编译器正确地做代码的工作......市场上有很多工具可以这样或那样做,多种用途[代码流分析,剖析等]。
  2. 取出gcc的汇编程序输出并处理它以将代码添加到那里的函数。这在某些方面更容易,并且在某些方面更困难。识别函数可能并不困难,但是“不要打破”汇编代码可能会更困难,除非您插入的汇编代码完全“安全”。

显然,修改gcc的选项也有可能,但是编译器代码是相当复杂的,除非你基本上把所有的现有挂钩gprof,我不认为这是一个学校项目 - 除非你正在去博士或其他类似的途中。