分析ios device crash 文件

ios 日志文件分析

iOS app的程序崩溃以后通常会留下一个.crash的日志文件,可以通过这个crash文件迅速查找到哪里崩溃了,但是这个文件中没有平时调试时候那样可以看到的函数名和函数具体调用行数,这些信息都被apple转换成了16进制的地址,即使别人拿到你程序的crash日志文件也不知道哪个函数crash。

获取原始的未解析的log文件:

  • 连上iTunes
  • 打开Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/

A:有device 有log

如果有crash的device,则可以很容易的通过工具查看crash函数:连上崩溃过的机器,Xcode -> Window -> Devices(如果是Xcode6以下,则是Window -> Organizer -> Devices),选择你自己的机器,然后点击View Device Logs,这时候会打开一个小窗口,这就是你机器上至目前为止存的所有app的崩溃信息了。如果是好久没看过这个信息,打开后还要读取好久才能完全读完,总之,找到你的app最后一次崩溃记录,右键导出。

B:没有device,有crash的完整文件

 就会麻烦一些,但只要有xxx.app 和xxx.app.DSYM就能查看详细的crash 的function:
 1. dwarfdump -u xxx.app/xxxdwarfdump -u xxx.app.dSYM 检查两者的uuid是否一致,如果不一致则这两个文件和crash的app不是同一个版本
 2. 查找symbolicatecrash工具,xcode6以后,symbolicatecrash放在:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash,也可用:find /Applications/Xcode6.1.app -name symbolicatecrash -type f
3. sudo cp /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /usr/local/bin/
4. 若提示"DEVELOPER_DIR" is not defined 则: export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
5. 执行 symbolicatecrash xxx.crash xxx.app.dSYM > app.log
打开app.log就可以看到和有device一样的log了

C:没有device,有crash片段

情况一

如果从crash log得到的对于的信息如下:
7 xxx 0x000896e2 0x19000 + 460514
8 xxx 0x000e5934 0x19000 + 837940
9 xxx 0x000e585e 0x19000 + 837726
使用-load address相对偏移进行解析:
xcrun atos -arch armv7s -o xxx.app/xxx -l 0x19000 0x000896e2

情况二

如果从report crash log得到的信息如下:
0 xxx 0x001b27d7 xxx + 1394647
1 xxx 0x001b2f05 xxx + 1396485
此时就需要计算-load address了:
-load address = 0x001b27d7 - 1394647 = 0x5e000
这时候便可以得到crash log信息如下:
0 MyDJ 0x001b27d7 0x5e000 + 1394647
1 MyDJ 0x001b2f05 0x5e000 + 1396485
然后:xcrun atos -arch armv7 -o xxx.app/xxx -l 0x5e000 0x1b27d7

ps:show Mac hidden file:

  • defaults write com.apple.finder AppleShowAllFiles -bool true
  • restart Finder
posted @ 2015-03-10 18:57  Lcnoctave  阅读(554)  评论(0编辑  收藏  举报