1>c++ oc都是编译语言。js是直译语言。编译器CLang +LLvm
2>不管是OC还是Swift,都是采用Clang作为编译器前端,LLVM(Low level vritual machine)作为编译器后端。所以简单的编译过程如图
编译器前端的任务是进行:语法分析,语义分析,生成中间代码(intermediate representation )。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。
3>编译器后端:
编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。iOS的编译过程,后端的处理如下
LVVM优化器会进行BitCode的生成,链接期优化等等
LVM机器码生成器会针对不同的架构,比如arm64等生成不同的机器码
<二>执行一次XCode build的流程
<三>IPA包的内容
例如,我们通过iTunes Store下载微信,然后获得ipa安装包,然后实际看看其安装包的内容。
右键ipa,重命名为.zip
双击zip文件,解压缩后会得到一个文件夹。所以,ipa包就是一个普通的压缩包。
右键图中的WeChat,选择显示包内容,然后就能够看到实际的ipa包内容了。
<四>二进制文件的内容
通过XCode的Link Map File,我们可以窥探二进制文件中布局。在XCode -> Build Settings -> 搜索map -> 开启Write Link Map File 开启后,在编译,我们可以在对应的Debug/Release目录下看到对应的link map的text文件。默认的目录在
~/Library/Developer/Xcode/DerivedData/-对应ID/Build/Intermediates/
<五>dSYM文件
我们每次Archive一个包之后,都会随之生成一个dSYM文件。每次发布一个版本,我们都需要备份这个文件,以方便以后的调试。进行崩溃信息符号化的时候,必须使用当前应用打包的电脑所生成的dSYM文件,其他电脑生成的文件可能会导致分析不准确的问题。
参考:http://blog.csdn.net/hello_hwc/article/details/50036323
第一部分:看看UUID;
第二部分:使用命令查看dsym文件的uuid Dsym调试 huangwenchen$ dwarfdump --uuid uau1.3.0.app.dSYM/
第三部分:看到log 定位到代码片段。