iOS app 崩溃日志符号化及代码定位

1、什么是符号表?

符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。.dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debugsymbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件。

一般地,Xcode项目每次编译后,都会生成一个新的.dSYM文件。因此,App的每一个发布版本,都需要备份一个对应的.dSYM文件,以便后续调试定位问题。

注意:
项目每一次编译后,.app.dSYM成对出现,并且二者有相同的UUID值,以标识是同一次编译的产物。
UUID值可以使用dwarfdump —uuid来检查:

 $ dwarfdump --uuid XX.app.dSYM

 $ dwarfdump --uuid XX.app/XX

2、符号表的作用:如果App发布上线,开发者不可能进行调试,只能通过分析系统记录的崩溃日志来定位问题,在这份崩溃日志文件中,会指出App出错的函数内存地址,而这些函数地址是可以在.dSYM文件中找到具体的文件名、函数名和行号信息的,这正是符号表的重要作用所在。

3、如何生成符号表:

1、使用xcodebuild编译打包

Xcode中编译项目后,会在工程目录下的build/ConfigurationName-iphoneos目录下生成.app.app.dSYM文件。

如果使用xcodebuild命令进行编译打包,则可以指定编译结果的存储路径,同样会有.app.app.dSYM生成。

一般地,我们推荐打包发布时,使用xcodebuild编译打包,方便.app.app.dSYM的匹配存储,避免.app.dSYM文件丢失的情况。

2、使用Xcode的Archive导出

如果开发者使用XcodeArchive导出功能打包,可以切换到OrganizerProjects视图,查看对应项目的Derived Data路径,在其中可以找到当前导出过程产生的.app.app.dSYM文件。

4:如何使用终端进行.dSYM分析

$ xcrun atos -o(.dSYM 文件路径) -arch (崩溃架构) -l loadAddress
  address ...

说明:

loadAddress 表示函数的动态加载地址,对应崩溃地址堆栈中 + 号前面的地址,即0x000ef000

address 表示运行时地址、对应崩溃地址堆栈中第一个地址,即0x0010143b

实际上,崩溃地址堆栈中+号前后的地址相加即是运行时地址,即0x000ef000 + 74808 = 0x0010143b

例如:

xcrun atos -o /Users/user/Desktop/JDMobile\ 15-5-28\ 下午6.38.xcarchive/dSYMs/JDMobile.app.dSYM/Contents/Resources/DWARF/JDMobile -arch arm64 -l 0x1000e4000 0x000000010020e118 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。