clang 插桩
2022-01-17 本文已影响0人
tom__zhu
背景
在编译阶段,做到全局方法hook,从汇编层实现,更高效
方法
- Bulding Setting -> Other C flag -> -fsanitize-coverage=func,trace-pc-guard
2.在工程任意一个类中实现下面的函数
void __sanitizer_cov_trace_pc_guard_init(uint32_t *start,
uint32_t *stop) {
static uint64_t N; // Counter for the guards.
if (start == stop || *start) return; // Initialize only once.
printf("INIT: %p %p\n", start, stop);
for (uint32_t *x = start; x < stop; x++)
*x = ++N; // Guards should start from 1.
}
void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
if (!*guard) return; // Duplicate the guard check.
void *PC = __builtin_return_address(0);
char PcDescr[1024];
printf("guard: %p %x PC %s\n", guard, *guard, PcDescr);
}
3.运行工程__sanitizer_cov_trace_pc_guard_init
会输出方法个数,start
指针是一个无符号整型,表示方法个数的起始地址stop
表示方法格式的结束地址,为了查明方法个数,可以通过LLDBx stop-4
获取方法个数。
4.每次调用方法前,都会首先执行__sanitizer_cov_trace_pc_guard
方法,__builtin_return_address(0)
返回的就是调用栈的上一个指针地址。
举个例子
__sanitizer_cov_trace_pc_guard_initx表示读取指针内容#,stop指针是无符号int类型,占4直接大小,减去4就是读最后一个int内容。所以看到的是7,表示工程有7个函数。