iOS bug调试-xcode 符号化崩溃日志.crash 或 .ips文件

经常遇到测试给我们提一个崩溃bug(非必现),然后符一个*.ips文件,打开里面全是内存地址,这时候就需要我们把这些地址符号化才能找到问题然后解决问题。对于.crash文件解决方法和*ips一样(ps:网上大部分讨论的是解决*.crash崩溃日志,我很纳闷,后来发现他们俩是一样的)。

解决问题之前先确认环境就是解决问题的前提

1.确保自己xcode对应的sdk版本比生成崩溃日志的测试设备的sdk版本高(相同也行,这个是因为系统库模块对应的地址是由手机中的sdk生成的不然这块内存就不能映射成功,只能映射出我们app模块对应的地址信息)

2.有打包对应的*app文件和对应的*.app.dSYM文件,是否对应可以从文件对应的uuid和日志中的uuid对应

app文件的uuid可以通过命令dwarfdump --uuid YourApp.app/YourApp生成

日志中的uuid可以从Binary Images:

0x100014000 - 0x101ccffff XXXX arm64  <28cead2455f83336b0be74c651bdd3d8>对应的这段内容找出 尖括号中

接着就是展现奇迹的时刻了。(方法一 xcode7.3symbolicatecrash路径改为

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

先执行

export DEVELOPER_DIR=`xcode-select --print-path`

定义了一个变量指向xcode的目录可能下面的命令会用到它,然后执行

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash -v xxxxxxxxxxxxxxx.ips.txt 2>symbollicate.log >sybcontent.log

对应好自己的symbolicatecrash位置,-v是啰嗦模式会把执行命令的日志放到symbollicate.log 中里面可能有错误啥的映射失败的话可以看看分析。符号化后的日志就存在sybcontent.log中这里面就能看到函数地址对应的函数名

以上方式都是我从stackOverFlower中爬楼总结的。

现在可以简单地操作了(方法二)

打开xcode->Device 选中一个设备例如你的iPhone,点击右侧面板view device log ,然后吧*.ips更改为*.crash 然后拖进去,选中你的crash文件右键->ReSymbolicatecrash,如果你的电脑就是打包的电脑那应该就行了,如果不是打包的电脑你需要执行下mdimport  YOURFolder 确保你的app 和dSYM文件在这个文件夹中,对于这个问题我的理解是,xcode查找自动映射崩溃日志只会搜索自己打包的app,二方法一中的symbolicatecrash命令会全盘搜索你的磁盘,从生成的symbollicate.log文件中就可以看出来

既然有了简单粗暴的方法二,方法一还有用吗,当然有用方法二是apple加了对方法一的封装,但是symbolicatecrash工具目前是有bug的比如说你装了多个xcode,命名了xcode 2那你用这个xcode就映射不出来(xcode6.0.1,新版不知道会不会修复这个bug)这时候方法一就起作用了,映射不出来可以看日志找问题。

还有直接用atos 命令直接根据地址映射出来函数,但是这个没有检查库与日志里的库是否对应也就是说可能给你一个莫名其妙的方法名,方法一方法二最终也会用这个命令解析内存地址,但是前提是库对上的,对不上的它们不会做映射

到这里应该没问题了,但是bug不一定能解决。。。。

方法一详细讲解可以参考https://possiblemobile.com/2015/03/symbolicating-your-ios-crash-reports/

你可能感兴趣的:(iOS bug调试-xcode 符号化崩溃日志.crash 或 .ips文件)