使用symbolicatecrash手工还原crash日志

其实iOS的crash日志的翻译方法有很多,也可以使用第三方的CrashlyticsFlurry.今天主要和大家分享的是用symbolicatecrash手工还原crash日志。

  • 首先我们要从xcode中找出symbolicatecrash所在路径,方法如下(打开终端,输入如下命令):
find /Applications/Xcode.app -name symbolicatecrash -type f

例如可能是如下路径

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/./symbolicatecrash

  • 找到该路径后,我们可以把它拷贝到例如桌面的任何位置。举例:我们可以在桌面创建一个句叫crash的文件夹,然后把symbolicatecrash拷贝到该文件夹下面。
cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /Users/username/Desktop/crash

  • 然后把我们的QQ.crash文件和QQ.dSYM文件与QQ.app也拷贝到crash目录下(假设我们的程序是QQ)


  • 打开终端,cd到crash目录


  • 输入如下命令

export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

  • 再次输入如下命令(QQ.crash文件和QQ.dSYM文件的名称和版本要保持一致,否则无法还原crash日志)
./symbolicatecrash QQ.crash QQ.app.dSYM QQ.app > output.crash

这样我们就可以得到一个叫output的文件了,里面的内容也会随之翻译了。


识别版本一致?

通过输入如下命令

dwarfdump --uuid QQ.app.dSYM
dwarfdump --uuid QQ.app/QQ

如下图
Image
Image


后续小记:

通常我们遇到的crash问题会比这个复杂的多。可能需要用到逆向工程、内存快照、活动追踪等手段来定位。后续我会陆续完善这篇文章。

2015-06-06 18:05193
  • June2016-02-18 15:14

    hi,博主,
    “通常我们遇到的crash问题会比这个复杂的多。可能需要用到逆向工程、内存快照、活动追踪等手段来定位。后续我会陆续完善这篇文章。”
    这些内容你什么时候会讲一下,非常想看看,了解。
    谢谢。

  • yz5459989912016-03-14 17:03

    @June,这三块内容,其实原理也比较简单,内存块照是指在疑似会导致crash的地方把一些关键信息记录下来,如索引值,当crash发生时,把这些关键信息一并上报到crash日志里面(只上报crash发生时的关键信息),或者服务器的其它地方。当你看到crash日志的时候,就可以对这些内存数据进行分析了。

    活动追踪,这个是和这个有点类似,你可以在http://objccn.io中找到。

    逆向工程的话,其实是一个套数据量采样的过程,hook住init与dealloc方法,记录内存中创建出来的对象的内存地址与class name,一般存储一万个样本(自己按情况调节)。当crash发生时,如果是野指针的话,会有野指针的地址,这时去采池里一比较,就知道是哪个类出现了crash.这样就很容易定位问题了。

  • yz5459989912016-03-14 17:04

    采池,打错了,是指那一万个样本。