1、符号表是什么
符号表就是指在Xcode项目编译后,在编译生成的二进制文件.app的同级目录下生成的同名的.dSYM文件。
.dSYM文件其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件。
一般地,Xcode项目每次编译后,都会生成一个新的.dSYM文件。因此,App的每一个发布版本,都需要备份一个对应的.dSYM文件,以便后续调试定位问题。
2、 符号表作用
在Xcode开发调试App时,一旦遇到崩溃问题,开发者可以直接使用Xcode的调试器定位分析。
但如果App发布上线,开发者不可能进行调试,只能通过分析系统记录的崩溃日志来定位问题,在这份崩溃日志文件中,会指出App出错的函数内存地址,而这些函数地址是可以在.dSYM文件中找到具体的文件名、函数名和行号信息的,这正是符号表的重要作用所在。
3、堆栈符号化工具
3.1 symbolicatecrash
symbolicatecrash是一个将堆栈地址符号化的脚本,输入参数是苹果官方格式的崩溃日志及本地的.dSYM文件,执行方式如下
symbolicatecrash XX.crash [XX.app.dSYM] > xx.sym.crash
使用symbolicatecrash工具的限制就在于只能分析官方格式的崩溃日志,需要从具体的设备中导出,获取和操作都不是很方便,而且,符号化的结果也是没有具体的行号信息的,也经常会出现符号化失败的情况。
实际上Xcode的Organizer内置了symbolicatecrash工具,所以开发者才可以直接看到符号化的错误日志。
3.2、atos
更普遍的情况是,开发者能获取到错误堆栈信息,而使用atos工具就是把地址对应的具体符号信息找到。atos实际是一个可以把地址转换为函数名(包括行号)的工具,它的执行方式如下:
atos -o executable -arch architecture -l loadAddress address
loadAddress 表示函数的动态加载地址,address 表示运行时地址。
4、系统crash log的获取
当你的app 在手机上crash的时候,会在手机上自动生成一个崩溃日志,也就是我们说的Crash Log。
可以参考这篇文章iOS调试之 crash log分析
这里介绍其中一种方法,通过Xcode获取到崩溃日志,方法是Xcode->Window->Devices
5、系统crash log 符号化
可以参考这篇文章 分析iOS Crash文件:符号化iOS Crash文件的3种方法
介绍其中的一种符号化方式:
有时候Xcode不能够很好的符号化crash文件。我们这里介绍如何通过symbolicatecrash来手动符号化crash log。在处理之前,请依然将“.app“, “.dSYM”和 ".crash"文件放到同一个目录下。现在打开终端(Terminal)然后输入如下的命令:
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
然后输入命令:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash appName.crash appName.app > appName.log
现在,符号化的crash log就保存在appName.log中了。
6、系统的UIKit和Foundation等符号化
系统库符号化可以参考这篇文章iOS Crash分析必备:符号化系统库方法
symbolicatecrash
可以参考这篇文章 使用symbolicatecrash解析了一个crash log,主要是因为~/Library/Developer/Xcode/iOS DeviceSupport/
没有该手机型号的符号表,连接发生crash的手机即可。
atos
atos -o UIKit -arch arm64 -l loadAddress address
UIKit的路径位置在目录下~/Library/Developer/Xcode/iOS DeviceSupport/
参考文章
1、http://www.voidcn.com/article/p-mpsboirn-kn.html
2、https://segmentfault.com/a/1190000012825286
3、https://www.ctolib.com/Tencent-OOMDetector.html
4、https://www.jianshu.com/p/cb34e41a4799
5、http://www.voidcn.com/article/p-gurewiig-xe.html
6、https://bugly.qq.com/docs/user-guide/symbol-configuration-ios/?v=1476958499475
7、https://www.jianshu.com/p/f9eeeecff8d8
8、https://www.jianshu.com/p/12a2402b29c2
9、https://www.jianshu.com/p/ea8926762121
10、https://juejin.im/post/5d5ab438f265da03af19d35b
11、http://www.manongjc.com/article/26184.html
12、http://www.sohu.com/a/166710818_163917
13、http://www.saitjr.com/ios/symbolicatecrash-3.html