ios crash文件分析

1、ios应用crash的四种类型
  • 程序崩溃: 可能是最常见的,经常发生于内存访问出错,异常,或者其他的程序错误

  • 内存不足: 系统因为没有足够的内存满足程序需求从而杀死程序出现这种日志.它不同于其他日志的是它没有程序各线程的堆栈信息. Rather than be concerned about what part of your code was executing at the time of termination, you should investigate your memory usage patterns and your responses to low memory warnings. Memory usage of each process is reported in terms of number of memory pages, which as of this writing are 4KB each.

  • 强制退出:异常代码 0xdeadfa11. 这出现在用户在程序界面按下关机键知道出现"移动滑块关机",然后长按Home键.用户之所以这么做,很可能因为你的程序无响应,当然也不一定.

  • 响应超时: 异常代码 0x8badf00d

  • ios应用crash的四种类型

2、如何获取crash log
      iPhone真机上Crash文件的存储路径为:/var/mobile/Library/Logs/CrashReporter
      我们走xcode的organizer的device log中获取相应应用的crash信息文件
      选中我们关注的应用app,找到关心的异常时间的crash记录,点击右键,选择"Reveal Log in Finder"保存到dSYM文件目录下。
3、如何分析
     如果您的应用程序就是由你的xcode生成,那么自动在crash log中会对信息进行翻译,得到有效的crash信息。
     如果不是这样,按下面方面处理
     a、将crash log文件拷贝到应用程序目录下,比如:test目录下有yourapp.app、yourapp.app.dSYM文件(记住此dSYM与产生此crash log的应用版本是一致的)。
     b、执行命令:symbolicatecrash ***.crash ***.app.dSYM | less,在命令行中可以看到解释后的log信息。
    
    symbolicatecrash 命令工具的位置:
    在ios3.0及以后版本, /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources
    在ios3.0以前版本,/Developer/Platforms/iPhoneOS.platform/Developer /Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/
4、crash log分析原理
      如果程序崩溃,错误信息会发送到Apple的服务器中,软件的开发者们可以很方便在后台获得自己程序的crash log,供自己调试。但随之而来的问题是,我们收到的程序崩溃调试信息多半是汇编语言一样的堆栈代码,同时这些信息并不是在我们debug的时候产生,所以看到这一串 crash log的天书,常常无可奈何。Xcode很好的解决了这一问题,它所提供的Orgainzer分析器加上symbolicatecrash?,可以分析二 进制文件以及源代码和crashlog之间的连接,直接找出源程序中出错的代码行。
5、使用其他方法分析crash
     如果使用symbolicatecrash?无法定位到出错的代码行的话,怎么整呢?有一个办法,如下:

     首先查看crash log中的崩溃线程,假如是这样的:

     Thread 0 Crashed:
     0   libobjc.A.dylib               0x00003ec0 objc_msgSend + 24
     1   MyApp               0x000036d2 0×1000 + 9938?

     我们得到了用户发生崩溃情况的内存地址:0x000036d2?

     然后回到我们应用程序的build目录,目录下一定要包含MyApp.app 和MyApp.app.dSYM两个文件。

     在控制台使用dwarfdump命令,解析出内存地址,如: 

     dwarfdump –lookup 0x000036d2 –arch armv6 MyApp.app.dSYM

你可能感兴趣的:(ios)