Coredump是一种调试技巧,可以将崩溃时内存信息dump下来,之后可以通过LLDB进行线下调试。
常规的稳定性监控工具,只会捕获堆栈、寄存器、内存等等信息,能够解决大部分问题,但会丢失大部分现场信息,而Coredump可以将程序的所有信息dump下来,提供海量数据进行问题排查。
理论上,可以解决所有的Singal和Mach异常。
- 配置coredump采样率可以控制只对线上部分用户开启功能,默认采样率为0。
步骤一:新建工作空间
假定文件夹路径为~/Desktop/CoredumpCase。
由于coredump的使用需要借助本地LLDB,因此需要将相关物料下载到本地,从而构建LLDB所需的环境。
下图为LLDB所需要的所有资料。下边会逐个介绍它们的获取方法。
以下是按照Products产物的方式进行演示的,如果您使用的是Archive或使用打包机,请根据您的情况自行获取。
- 在工程中,找到Products,右键单击产物 > Show in Finder。
-
- 将.app程序和符号表这两个文件拷贝到工作空间。
-
- .app程序UUID获取方法:dwarfdump --uuid ${appFilePath}/${appName}。
- 因此,获取APMInsight_iOS app的UUID方法为:
-
- 符号表UUID获取方法:dwarfdump --uuid ${appFilePath}。
- 因此,获取APMInsight_iOS符号表的UUID方法为:
-
Crash文件
-
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
注意
- 需要配置jq命令:brew install jq。
- 在崩溃详情页 > 文件下载,找到Coredump文件。
-
- 将下载后的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 Type和OS Version字段对应的值。
- 如果Code Type为arm64,则${OS Version}为系统符号表。
- 如果Code Type为arm64e,则${OS Version}${Code Type}为系统符号表。
- 以上,请忽略${OS Version}的iOS字段。
- 综上,打开15.5 (19F77),将Symbols拷贝到工作空间。
-
注意
- 请确保只拷贝对应系统符号表下的Symbols文件夹。
- 请不要修改Symbols中的结构,防止Coredump解析失败。
请根据Python版本,下载对应的Coredump脚本。加载后,请移动到工作空间。
查看Python的方法:Python3 --version。
完成以上操作后,工作空间如下图所示。
完成上述操作后,您可以执行以下步骤,开启lldb调试。
-
注意
当执行command script import spliceMemory,spliceMemory不要带.so。
调解演示图: