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

一、什么是符号表?xcode

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

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

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

 $ dwarfdump --uuid XX.app.dSYM函数

 $ dwarfdump --uuid XX.app/XXui

二、符号表的做用:若是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导出

若是开发者使用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 

相关文章
相关标签/搜索