iOS App精确定位crash位置
背景:前几天项目的生产版本在现场出现崩溃,出现崩溃后我们需要完成四个步骤:复现、定位、修复、测试。但是开发复现不了崩溃,幸好每次打包都会将与该版本ipa对应的dSYM文件保存,提供给现场后,准确定位到了哪个文件,哪一行代码,从而及时修复了bug。
这篇文章的重点是定位,所以,我故意写了一个崩溃点,测试是否可以准确定位到,构成如下:
我在LSTest工程下,建立了一个名为TestSwiftViewController的swift文件,声明一个名为array的空数组,然后在方法中取数组下标为1的值,这显然会引起App崩溃。
- 开发者模式:
必备条件:源代码、Xcode、调试手机
开发过程中使用Xcode调试可直接找到崩溃点,在Xcode里面可明确定位到崩溃点。我使用Debug模式进行调试,崩溃提示如下:
第一张图可以准确看到是TestSwiftViewController下面的test方法出现问题,第二张图可看到是僵尸错误 EXC_BREAKPOINT,在代码的第59行。找到崩溃的地方然后我们就可以进行修复了。
- 非开发者模式:
必备条件:Xcode、.ipa文件、.app文件、. app.dSYM文件、symbolicatecrash、崩溃产生的.crash文件。
为了达到非开发者模式的要求,我将项目工程使用Xocde中的Archive进行打包,当进行到下面的步骤时,
在红框处点击右键--》Show in Finder—》显示包内容,可以看到我们需要的. app.dSYM文件。
在这里面同样可以找到.app文件,如下图,你可能发现它不像,一开始我也这样认为。在网上搜索了很久才找到一个模糊的描述,我推测它就是,最后证明了这真的是我需要的。
最后Archive导出得到了LSTest.ipa文件,我们将.ipa文件使用PP助手安装到手机。安装到手机后打开Xcode,点击Window-->Devices and Simulators,然后打开刚刚装好的App,进行崩溃复现。继续点击界面的View Device Logs,可以看到产生了.crash崩溃日志文件。
右键导出崩溃日志,我们可以看到红色箭头处指明了崩溃导致的异常类型、异常位置,但是这都是未符号化的二进制码,我们看不懂。
最后定位到崩溃处我们需要验证一下得到.crash文件、.app文件、. app.dSYM文件是不是相同的,通过检验他们的UUID进行验证,将他们放到同一个文件夹下,查看 .app 文件的 UUID,terminal 中输入命令:
xcrun dwarfdump --uuid LSTest.app/LSTest
查看.dDYM文件的UUID,terminal 中输入命令:
dwarfdump --uuid LSTest.app.dSYM
查看.crash文件的UUID,terminal 中输入命令:
grep --after-context=2 "Binary Images:" Example.crash
可以看到得到这三个文件的UUID都是相同的,可用。最后需要使用Xcode自带的symbolicatecrash工具来符号化 .crash 文件,Xcode使用应用程序的二进制在源代码中的源位置的回溯替换每个地址相关联的dsym文件,会产生符号化的崩溃日志。
找到symbolicatecrash ,terminal 中输入命令 :
find /Applications/Xcode.app -name symbolicatecrash -type f
一段时间后可以得到在你文件夹中的位置,就是上图中红框内的路径。将symbolicatecrash复制出来并跟crash文件放到同一个文件夹下,在terminal 中输入命令:
./symbolicatecrash /Users/lihu/Desktop/LSTest\ 2018-07-31\ 14-17-22/LSTest.crash /Users/lihu/Desktop/LSTest\ 2018-07-31\ 14-17-22/LSTest.app.dSYM > final.crash
你会发现文件夹下多了一个final.crash文件,打开后,就是正常可看懂的崩溃日志文件,并且精确定位到了崩溃处,TestSwiftViewController下面的test方法的第59行。
推荐阅读
-
iOS渐变字体、动态条纹、获取特定位置cell、笔记App、购物车界面等源码
-
iOS中定位当前位置坐标及转换为火星坐标的方法
-
iOS 13频繁弹窗提醒App定位 苹果:保护用户隐私
-
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
-
ios中给view添加圆角并指定位置
-
iOS开发笔记 -- 实时上传用户的位置(APP被杀死的情况下也要能上传)
-
IOS入门笔记之地理位置定位系统
-
Android NDK 开发Jni 遇到Fatal 崩溃错误后,怎么定位crash的位置
-
iOS获取指定位置图像
-
iOS14 隐私适配:【定位授权新增了精确和模糊定位 可根据不同的需求设置不同的定位精确度】1、向用户申请临时开启一次精确位置权限的方案(不同场景可定义不同purposeKey)2、高德定位SDK适配