网上我就搜到这一篇文章介绍使用 LLVM Pass 的方式,来实现函数插桩。
但是按照他文章的一步步坐下来,发现各种报错,要不就是 pass 无法被 xcode 加载,反正遇到了不少的问题。
而且该作者很多核心的部分都没有写出来,不知道是因为太简单,还是不想让别人知道 ~
经历了两周多左右的研究,以 LLVM 小白的身份,终于跑起来了 ~ 不容易 ~
注意:如下内容,最好需要你已经有 LLVM 环境!!!
02. C 函数 手动插桩
long _ly_fun_b()
{
struct timeval star;
gettimeofday(&star, NULL);
long b = star.tv_sec * 1000000 + star.tv_usec;
return b;
}
void _ly_fun_e(char *name, long b)
{
struct timeval end;
gettimeofday(&end, NULL);
long e = end.tv_sec * 1000000 + end.tv_usec;
long t = e - b;
printf("%s %ld us\n",name, t);
}
int main()
{
long b = _ly_fun_b();
printf("hello world!");
_ly_fun_e("main", b);
return 0;
}
手动插桩实际上就是将预先写好的开始和结束两个函数的调用,手动写入到 main() 执行前 和 执行后。
那么自动插桩了?
就是不需要手动在 main() 中进行修改,而是在编译的过程中,自动将上面2个函数,插入到 main() 执行前 和 执行后。
那么如何在编译的时候,在 main() 插入其他的 函数调用 了?
03. 通过 LLVM Pass 自动插桩的过程