一、什么是符号表?xcode
符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。.dSYM文件实际上是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,全部Debug的symbols都在这个文件中(包括文件名、函数名、行号等),因此也称之为调试符号信息文件。架构
通常地,Xcode项目每次编译后,都会生成一个新的.dSYM文件。所以,App的每个发布版本,都须要备份一个对应的.dSYM文件,以便后续调试定位问题。app
注意:
项目每一次编译后,.app和.dSYM成对出现,而且两者有相同的UUID值,以标识是同一次编译的产物。
UUID值可使用dwarfdump —uuid来检查:iphone
$ dwarfdump --uuid XX.app.dSYM
函数
$ dwarfdump --uuid XX.app/XX
ui
二、符号表的做用:若是App发布上线,开发者不可能进行调试,只能经过分析系统记录的崩溃日志来定位问题,在这份崩溃日志文件中,会指出App出错的函数内存地址,而这些函数地址是能够在.dSYM文件中找到具体的文件名、函数名和行号信息的,这正是符号表的重要做用所在。调试
三、如何生成符号表:日志
一、使用xcodebuild编译打包code
在Xcode中编译项目后,会在工程目录下的build/ConfigurationName-iphoneos目录下生成.app和.app.dSYM文件。ip
若是使用xcodebuild命令进行编译打包,则能够指定编译结果的存储路径,一样会有.app和.app.dSYM生成。
通常地,咱们推荐打包发布时,使用xcodebuild编译打包,方便.app和.app.dSYM的匹配存储,避免.app.dSYM文件丢失的状况。
二、使用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