背景
在編譯階段,做到全局方法hook摧找,從匯編層實現(xiàn)核行,更高效
方法
- Bulding Setting -> Other C flag -> -fsanitize-coverage=func,trace-pc-guard
2.在工程任意一個類中實現(xiàn)下面的函數(shù)
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
會輸出方法個數(shù),start
指針是一個無符號整型蹬耘,表示方法個數(shù)的起始地址stop
表示方法格式的結(jié)束地址芝雪,為了查明方法個數(shù),可以通過LLDBx stop-4
獲取方法個數(shù)综苔。
4.每次調(diào)用方法前惩系,都會首先執(zhí)行__sanitizer_cov_trace_pc_guard
方法,__builtin_return_address(0)
返回的就是調(diào)用棧的上一個指針地址休里。
舉個例子
x表示讀取指針內(nèi)容#蛆挫,stop指針是無符號int類型,占4直接大小妙黍,減去4就是讀最后一個int內(nèi)容悴侵。所以看到的是7,表示工程有7個函數(shù)拭嫁。