1、什么是符号表?
符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。.dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件。
一般地,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导出
如果开发者使用Xcode的Archive导出功能打包,可以切换到Organizer的Projects视图,查看对应项目的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