作家
登录

浅谈iOS Crash(一)

作者: 来源: 2017-07-21 17:29:36 阅读 我要评论

  • 线上App的Crash日记经由Crash日记收集办事获得(重要来源)。
  • 也可以大年夜真机上获取Crash日记文件。点击Window -> Devices,选择你本身的机械,然后点击View Device Logs,右键可以导出Crash文件。
  • 获取的┞封些日记文件都须要符号化处理。

4)将symbolicatecrash、.dSYM、.app、crash.crash拷贝到桌面下同一个文件夹下

5)检查 xx.app 和 xx.app.dSYM 文件以及crash 文件这三种的 UUID是否一致。

查看 xx.app 文件的 UUID,terminal 中输入敕令 :

1、数组操作

  • 场景1:取数据索引越界。一般产生在UITableView的应用中,因为cellForRowAtIndexPath代劳办法是异步履行的,UITableView对象的dataSource一旦在加载数据过程中产生变更,极有可能产生数组越界的异常。在多线程场景下,列表界面的数据有可能经常变更,很可能产生;当列表界面数据不怎么变更的时刻,几乎感知不到这种异常的存在。解决办法:大年夜数组中取数据前,校验索引是否精确。
  1. dwarfdump --uuid xx.app/xx (xx代表你的项目名) 

查看 xx.app.dSYM 文件的 UUID ,在 terminal 中输入敕令:

  1. dwarfdump --uuid xx.app.dSYM 

查看crash 日记中的Incident Identifier (crash 文件的 UUID)

6)应用敕令,生成“可定位问题的crash文件”

  1. //symbolreportXXX.crash就是符号化后的文件 
  2.  
  3. ./symbolicatecrash crashXXX.crash appName.app.dSYM > symbolreportXXX.crash  

7) 根据符号化后的线程回溯信息,可以赞助定位出问题的代码行。

解释:如不雅履行symbolicatecrash敕令出现 Error: “DEVELOPER_DIR” is not defined at ./symbolicatecrash…如许的缺点,可以在履行敕令前,输入export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”

3、atos敕令

1)将.dSYM、.app、crash.crash放到同一个文件夹下。

2) 知道crash文件的UUID:履行grep “AppName arm” *crash,获得结不雅

  1. crash1.crash:0x100040000 - 0x100e23fff +AppName arm64  /var/containers/Bundle/Application/55A4D641-847F-4D24-86E1-129B28461858/AppName.app/AppName 
  2.  
  3. crash2.crash:0x100060000 - 0x100e43fff +AppName arm64  /var/containers/Bundle/Application/3229ED68-8D19-406D-A3F5-EC0310C9DB7C/QAppName.app/AppName 
  4.  
  5. crash3.crash:    0x5000 -   0xce8fff +AppName armv7  /var/containers/Bundle/Application/C6BE271D-2EAC-42C0-8E72-4523F88C76B2/AppName.app/AppName  

个中0x100040000、0x100060000、0x5000是加载地址(loadingAddress), 而arm64、armv7 是 architecture 的值(architectureValue),这两个值后面都要用。

3)然后履行atos敕令,输入成功,进入待输入状况

  1. xcrun atos -o appName.app.dSYM/Contents/Resources/DWARF/appName -l loadingAddress -arch architectureValue 

4) 此时输入App对应的Crash地址,获得产生crash的信息。

解释1:线程回溯部分并不是我们习惯应用办法名和行数,而是十六进制地址。所以我们在分析Crash前须要将这些十六进制地址转化成办法名称和行数,悛改程被称为符号化。

实例1:

  1. grep "AppName arm" *crash 
  2.  
  3. xcrun atos -o AppName.app.dSYM/Contents/Resources/DWARF/AppName -l 0x100040000 -arch arm64  

实例2:

五、常见的Crash

三、异常信息解读

有一些Crash比较常见,下面列举出5种常见的Crash。

  1. @implementation NSMutableArray (Safe) 
  2.  
  3.   
  4.  
  5. - (id)safeObjectAtIndex:(NSUInteger)index
  6.  
  7.   
  8.  
  9.      if (index < self.count){ 
  10.  
  11.          return

      推荐阅读

      如何在Linux中恢复仍在活动进程中的已删除文件

    cp 13 /home/m/Downloads/Compressed 因为我们已经知道文件名包含 .zip 扩大名,是以我们可以应用 .zip 扩大名进行搜刮。它将限制输出结不雅并显示所需的过程。很多情况下,删除的文件都可以恢复,比>>>详细阅读


    本文标题:浅谈iOS Crash(一)

    地址:http://www.17bianji.com/lsqh/36347.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)