欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS App精确定位crash位置

程序员文章站 2022-04-09 10:30:08
...

背景:前几天项目的生产版本在现场出现崩溃,出现崩溃后我们需要完成四个步骤:复现、定位、修复、测试。但是开发复现不了崩溃,幸好每次打包都会将与该版本ipa对应的dSYM文件保存,提供给现场后,准确定位到了哪个文件,哪一行代码,从而及时修复了bug。

这篇文章的重点是定位,所以,我故意写了一个崩溃点,测试是否可以准确定位到,构成如下:

iOS App精确定位crash位置

iOS App精确定位crash位置

iOS App精确定位crash位置

iOS App精确定位crash位置

       我在LSTest工程下,建立了一个名为TestSwiftViewController的swift文件,声明一个名为array的空数组,然后在方法中取数组下标为1的值,这显然会引起App崩溃。

  1. 开发者模式:

 必备条件:源代码、Xcode、调试手机

开发过程中使用Xcode调试可直接找到崩溃点,在Xcode里面可明确定位到崩溃点。我使用Debug模式进行调试,崩溃提示如下:

iOS App精确定位crash位置

iOS App精确定位crash位置

       第一张图可以准确看到是TestSwiftViewController下面的test方法出现问题,第二张图可看到是僵尸错误 EXC_BREAKPOINT,在代码的第59行。找到崩溃的地方然后我们就可以进行修复了。

  1. 非开发者模式:

必备条件:Xcode、.ipa文件、.app文件、. app.dSYM文件、symbolicatecrash、崩溃产生的.crash文件。

       为了达到非开发者模式的要求,我将项目工程使用Xocde中的Archive进行打包,当进行到下面的步骤时,

iOS App精确定位crash位置

 

在红框处点击右键--》Show in Finder—》显示包内容,可以看到我们需要的. app.dSYM文件。

iOS App精确定位crash位置

在这里面同样可以找到.app文件,如下图,你可能发现它不像,一开始我也这样认为。在网上搜索了很久才找到一个模糊的描述,我推测它就是,最后证明了这真的是我需要的。

iOS App精确定位crash位置

最后Archive导出得到了LSTest.ipa文件,我们将.ipa文件使用PP助手安装到手机。安装到手机后打开Xcode,点击Window-->Devices and Simulators,然后打开刚刚装好的App,进行崩溃复现。继续点击界面的View Device Logs,可以看到产生了.crash崩溃日志文件。

iOS App精确定位crash位置

右键导出崩溃日志,我们可以看到红色箭头处指明了崩溃导致的异常类型、异常位置,但是这都是未符号化的二进制码,我们看不懂。

iOS App精确定位crash位置

最后定位到崩溃处我们需要验证一下得到.crash文件、.app文件、. app.dSYM文件是不是相同的,通过检验他们的UUID进行验证,将他们放到同一个文件夹下,查看 .app 文件的 UUID,terminal 中输入命令:

xcrun dwarfdump --uuid LSTest.app/LSTest

iOS App精确定位crash位置

查看.dDYM文件的UUID,terminal 中输入命令:

dwarfdump --uuid LSTest.app.dSYM

iOS App精确定位crash位置

查看.crash文件的UUID,terminal 中输入命令:

grep --after-context=2 "Binary Images:" Example.crash

iOS App精确定位crash位置

可以看到得到这三个文件的UUID都是相同的,可用。最后需要使用Xcode自带的symbolicatecrash工具来符号化 .crash 文件,Xcode使用应用程序的二进制在源代码中的源位置的回溯替换每个地址相关联的dsym文件,会产生符号化的崩溃日志。

找到symbolicatecrash ,terminal 中输入命令 :

find /Applications/Xcode.app -name symbolicatecrash -type f

iOS App精确定位crash位置

 

一段时间后可以得到在你文件夹中的位置,就是上图中红框内的路径。将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 App精确定位crash位置