再谈IOS堆栈和还原

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值