通常客户端产品至少都会有Debug和Release两种编译配置,在编译Release版本中会进行一些优化,以减少最终产品的体积。
比如,在Release版本中会对代码执行步骤进行优化(如O1、O2等),这会导致有些代码被优化省略掉,有时无法单步调试;另外就是会去掉符号信息,这会导致断点调试时没有符号信息,所以才会有CallStack的捕获和解析内容。
由于千牛iOS端会有不同版本,分别面向内部开发者、外部ISV以及最终用户。尤其是在集成QAP项目后需要提供一个专门的开发调试版本给QAP开发者,所以新增了一个QAPDistribution Scheme,并且这个Scheme是从Debug Scheme复制过来的,所以按道理是可以进行调试、查看符号信息的。结果在使用这个Scheme进行开发调试的过程中发现符号信息缺失,控制台输出如下信息:
AppName was compiled with optimization - stepping may behave oddly; variables may not be available.
这就给我们排查问题带来不便。虽然可以切换成Debug来调试排查,但由于给ISV的版本不是Debug的,所以环境不一致,可能会导致一些遗漏。于是我再次确认了下编译配置信息:
确实和Debug是一致的,这就带来了困惑。
后来进一步发现在千牛自身代码中是有符号信息的,但是跟进到Pod依赖中就缺失了,所以怀疑是不是Pod工程的编译配置有问题:
发现果然Pods工程的编译配置是有对QAPDistribution Scheme进行优化的。那么问题来了,如果我手动修改一下,之后再进行pod update
是不是又会复原?验证了下果然如此,所以只能通过Pod本身的配置来解决问。在网上搜了下,有如下解决方案:
post_install do |installer|
installer.pods_project.build_configurations.each do |config|
if config.name.include?("QapDistribution")
config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0'
end
end
end
经验证有效。