HCClangTrace 1.0.1

HCClangTrace 1.0.1

jay he 维护。



  • jay.he

HCClangTrace

安装

HCClangTrace 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile:

pod 'HCClangTrace', '~> 1.0.0'

使用

1. 在 Build Settings 中添加编译选项

其他 C Flags 增加 -fsanitize-coverage=func,trace-pc-guard。如果 您是 OC Swift 混编,则在 Other Swift Flags 增加 -sanitize-coverage=func-sanitize=undefined

2. 统计程序启动的函数执行情况

在您的首页的 viewDidAppear 函数中添加生成 orderFile 的函数,然后运行 app。

2.1 编写测试代码以测试c函数、pod库函数、block和swift方法

- (void)callSomeMethods {
    // call third lib method
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    // call block
    self.testCallBlock();
    // call swift method
    [[TestCallSwift new] testCallSwiftMethod];
    // call c method
    testCallCMethod();
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [HCClangTrace generateOrderFile];
}

2.2 执行并查看效果

2020-08-11 17:35:09.895881+0800 HCClangTrace_Example[47015:1422955] _main
-[HCAppDelegate window]
-[HCAppDelegate setWindow:]
-[HCAppDelegate application:didFinishLaunchingWithOptions:]
-[HCViewController viewDidLoad]
-[HCViewController setTestCallBlock:]
-[HCViewController callSomeMethods]
+[AFNetworkReachabilityManager sharedManager]
___45+[AFNetworkReachabilityManager sharedManager]_block_invoke
+[AFNetworkReachabilityManager manager]
+[AFNetworkReachabilityManager managerForAddress:]
-[AFNetworkReachabilityManager initWithReachability:]
-[AFNetworkReachabilityManager setNetworkReachabilityStatus:]
-[AFNetworkReachabilityManager startMonitoring]
-[AFNetworkReachabilityManager stopMonitoring]
-[AFNetworkReachabilityManager networkReachability]
___copy_helper_block_e8_32w
_AFNetworkReachabilityRetainCallback
___copy_helper_block_e8_32s40b
-[HCViewController testCallBlock]
___31-[HCViewController viewDidLoad]_block_invoke
_testCallCMethod
-[HCAppDelegate applicationDidBecomeActive:]
-[HCViewController viewDidAppear:]
___34-[HCViewController viewDidAppear:]_block_invoke

函数调用符号将在app沙盒的tmp目录下生成trace.order文件,可以直接提取。

3.如何统计pod库函数调用

我们通过编译选项进行插桩,它只对具有该选项的工程生效,而pod库是一个独立的工程。我们可以通过post_install来为pod库自动添加这些编译选项,只需在Podfile文件后添加以下内容,Demo的Podfile也添加了这个内容。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      macho_type = config.build_settings['MACH_O_TYPE']
      #if macho_type == 'staticlib'
        if config.name == 'Debug'
          # 将依赖的pod项目的Other C Flags加上’-fsanitize-coverage=func,trace-pc-guard‘选项
          config.build_settings['OTHER_CFLAGS'] ||= ['$(inherited)', '-fsanitize-coverage=func,trace-pc-guard']
          config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['$(inherited)', '-fsanitize-coverage=func,trace-pc-guard']
        end
      #end
    end
  end
end

4.其他

如有问题请提交issue,共同沟通解决问题,共同进步;在使用前可以先参考我写的文档iOS App启动时间优化--Clang插桩获取启动调用的函数符号