You need to enable JavaScript to run this app.
导航

Coredump

最近更新时间2023.07.19 17:36:24

首次发布时间2023.03.01 12:01:31

Coredump是一种调试技巧,可以将崩溃时内存信息dump下来,之后可以通过LLDB进行线下调试。
常规的稳定性监控工具,只会捕获堆栈、寄存器、内存等等信息,能够解决大部分问题,但会丢失大部分现场信息,而Coredump可以将程序的所有信息dump下来,提供海量数据进行问题排查。
理论上,可以解决所有的Singal和Mach异常。

前提条件

  • 已接入Coredump模块。详情请参见iOS SDK接入
  • 已配置coredump采样率。详情请参见SDK上报配置
    配置coredump采样率可以控制只对线上部分用户开启功能,默认采样率为0。

步骤一:新建工作空间

假定文件夹路径为~/Desktop/CoredumpCase

步骤二:下载物料

由于coredump的使用需要借助本地LLDB,因此需要将相关物料下载到本地,从而构建LLDB所需的环境。
下图为LLDB所需要的所有资料。下边会逐个介绍它们的获取方法。
图片

.app程序与符号表

以下是按照Products产物的方式进行演示的,如果您使用的是Archive或使用打包机,请根据您的情况自行获取。

  1. 在工程中,找到Products,右键单击产物 > Show in Finder。
    图片
  2. 将.app程序和符号表这两个文件拷贝到工作空间。
    图片

    注意

    • 请不要修改.app程序和符号表的名称。
    • 请确保.app程序和符号表是匹配的。
  • .app程序UUID获取方法:dwarfdump --uuid ${appFilePath}/${appName}
    因此,获取APMInsight_iOS app的UUID方法为:
    图片
  • 符号表UUID获取方法:dwarfdump --uuid ${appFilePath}
    因此,获取APMInsight_iOS符号表的UUID方法为:
    图片

Crash文件

  1. 在崩溃详情页,下载崩溃日志。
    图片

  2. 执行以下命令, 对崩溃文件做二次处理。

    cat ${crash_path} | jq -r '.data' | awk '{gsub(/\\n/,"\n")}1' > ${output_crash_path}/crash.txt
    

    假设从平台上下载后的文件路径为 ~/Downloads/20230228210309.txt 。那么二次处理Crash文件的方法为:

    cat ~/Downloads/20230228210309.txt | jq -r '.data' | awk '{gsub(/\\n/,"\n")}1' > ~/Desktop/CoredumpCase/crash.txt
    

    注意

    • 请保证二次处理后的文件名为crash.txt
    • 需要安装homebrew包管理工具,详情请参见homebrew官网
    • 需要配置jq命令:brew install jq

Coredump文件

  1. 在崩溃详情页 > 文件下载,找到Coredump文件。
    图片
  2. 将下载后的Coredump文件解压缩并命名为memorydump
  3. 将Coredump文件拷贝到工作空间。

    注意

    • 请确保文件名为memorydump。
    • Coredump默认是不开启的,如需采集Coredump文件,请根据需要修改采样率。

如何确定哪个文件是我们所需的?

打开生成的crash.txt文件,找到Incident Identifier字段对应的值。
图片
在文件下载中,找到cd-${Incident Identifier's value}.zip,即为所需要的Coredump文件。

系统符号表

获取系统符号表的方式有很多,这里介绍一下如何从Xcode获取系统符号表。
当通过Xcode真机调试时,Xcode会从手机中下载系统符号表。存在路径为:~/Library/Developer/Xcode/iOS\ DeviceSupport,打开后为:
图片

注意

如果在本地找不到对应符号表,您可通过ipsw获取对应版本的系统符号表。

如何确定哪个文件是我们所需要的?

打开刚才生成的crash.txt文件,找到Code TypeOS Version字段对应的值。
图片

  • 如果Code Type为arm64,则${OS Version}为系统符号表。
  • 如果Code Type为arm64e,则${OS Version}${Code Type}为系统符号表。
    以上,请忽略${OS Version}的iOS字段。
    综上,打开15.5 (19F77),将Symbols拷贝到工作空间。
    图片

注意

  • 请确保只拷贝对应系统符号表下的Symbols文件夹。
  • 请不要修改Symbols中的结构,防止Coredump解析失败。

Coredump脚本

请根据Python版本,下载对应的Coredump脚本。加载后,请移动到工作空间。
查看Python的方法:Python3 --version

Python版本

Coredump脚本

3.9.6

spliceMemory.so
未知大小

产物列表

完成以上操作后,工作空间如下图所示。
图片

步骤三:消费数据

通过LLDB运行Coredump

完成上述操作后,您可以执行以下步骤,开启lldb调试。

  1. cd到工作空间。
  2. 启动LLDB。
  3. 在LLDB状态下,加载Coredump脚本。
    图片

    注意

    当执行command script import spliceMemoryspliceMemory不要.so

调试技巧

开启Coredump后,可以使用LLDB指令来进行操作。

注意

调试技巧和在Xcode中执行命令一致。

调解演示图:
图片