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插桩获取启动调用的函数符号