iOS 根据内存地址定位crash
一、背景:
1.很多小伙伴接入友盟后,会发现里面有崩溃日志,但是不会告诉我们崩溃到哪个函数了。
2.测试同学发给我们crash文件,也不会告诉我们崩溃到哪个函数
二、解决办法:
针对友盟,发现可以上传dSYMs符号表文件,然后友盟里就会显示出具体崩溃到哪个函数了。具体操作,xcode->organizer->xcarchive->dSYMs,注意,必须找到崩溃对应的xcarchive,dSYMs整个文件夹压缩上传就可以了。
针对测试同学发给的crash文件。同样的方法找到xcode->organizer->xcarchive->dSYMs->appName.app.sSYM 和 xcode->organizer->xcarchive->Products->Applications->appName.app->appName把这两个文件放到一个文件夹中。打开crash文件,
![](https://img.haomeiwen.com/i8140200/08416db7af257398.png)
一般以app命名的地方就是崩溃的位置。0x0000000100e0c1b8为虚拟内存地址,0x100bb000为基地址。开始进行命令行操作,cd到这个文件夹下,输入命令行:atos -arch arm64 -o appName -l 0x100bb000(基地址),回车后,你会发现还会输入,然后在输入(虚拟内存地址),然后你就会神奇的发现终端会输入崩溃的方法了。
![](https://img.haomeiwen.com/i8140200/86f6443541c1597a.jpeg)
其实友盟的崩溃日志也可以这样看,但是友盟的基地址和虚拟地址注意看清楚
![](https://img.haomeiwen.com/i8140200/39400429ef381464.png)
Base Address 基地址
AppName 虚拟内存地址
还有一种情况就是,自己手中没有xcarchive文件,但是有ipa包,也是可以转换符号表的。
下载及生成restore-symbol
然后ipa文件显示包内容,找到appName,可以把appName放到桌面,打开终端,cd到桌面,执行./restore-symbol appName_arm64 -o appName,后续操作就上边从xcarchive获取到appName.app和appName的操作一样了,比如:atos -arch arm64 -o appName_arm64 -l 0x100bb0000。
ps:不喜欢终端的小伙伴可以自行去度娘一下可视化工具,也可以分析出来。
延伸一下知识
1、dSYM文件:iOS构建时产生的符号表,它是内存地址与函数名,文件名,行号的映射表;iOS应用crash时也有堆栈,release版的应用,crash时的堆栈信息,全是二进制的地址信息;iOS平台中,dSYM文件是保存符号表的目标文件,文件名通常为:xxx.dSYM(符号表dSYM概念和获得途径资料地址https://developer.umeng.com/docs/66632/detail/71519)
2、atos
The atos command converts numeric addresses to their symbolic equivalents 我们使用atos命令来完成符号化,具体命令如下:$atos -arch <Binary Architecture> -o <Path to dSYM file>/Contents/Resources/DWARF/<binary image name> -l <load address> <address to symbolicate>其中:
1.Binary Architecture:arm64、armv6、armv7armv7s 根据自己的情况来写。
2.Path to dSYM file: dSYM文件的路径。
3.binary image name: 你工程的名字。
4.load address: 基地址,如果我们的崩溃日志中没有这个信息(比如上面的Crash信息中就没有包含),就需要我们手动去计算这个load address:laod address = address to symbolicate - offset,比如:0x0000000102838119转化为十进制为4337139993,再减去偏移量265,为4337139728,在转化为十六进制0x0000000102838010
5.address to symbolicate:当前方法的内存地址。
章仅供参考,如有啥错误,请大家留言指正,谢谢!
友情链接:https://www.dazhuanlan.com/2020/01/06/5e12aaabf0437/