美文网首页
clang 插桩

clang 插桩

作者: tom__zhu | 来源:发表于2022-01-17 23:45 被阅读0次

    背景

    在编译阶段,做到全局方法hook,从汇编层实现,更高效

    方法

    Tracing PCs

    1. 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_init
    x表示读取指针内容#,stop指针是无符号int类型,占4直接大小,减去4就是读最后一个int内容。所以看到的是7,表示工程有7个函数。

    相关文章

      网友评论

          本文标题:clang 插桩

          本文链接:https://www.haomeiwen.com/subject/uskqhrtx.html