Coredump是一种调试技巧,可以将崩溃时内存信息dump下来,之后可以通过LLDB进行线下调试。
常规的稳定性监控工具,只会捕获堆栈、寄存器、内存等等信息,能够解决大部分问题,但会丢失大部分现场信息,而Coredump可以将程序的所有信息dump下来,提供海量数据进行问题排查。
理论上,可以解决所有的Singal和Mach异常。
假定文件夹路径为~/Desktop/CoredumpCase
。
由于coredump的使用需要借助本地LLDB,因此需要将相关物料下载到本地,从而构建LLDB所需的环境。
下图为LLDB所需要的所有资料。下边会逐个介绍它们的获取方法。
以下是按照Products产物的方式进行演示的,如果您使用的是Archive或使用打包机,请根据您的情况自行获取。
Products
,右键单击产物 > Show in Finder。注意
dwarfdump --uuid ${appFilePath}/${appName}
。dwarfdump --uuid ${appFilePath}
。在崩溃详情页,下载崩溃日志。
执行以下命令, 对崩溃文件做二次处理。
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
。brew install jq
。memorydump
。注意
打开生成的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
字段对应的值。
注意
请根据Python版本,下载对应的Coredump脚本。加载后,请移动到工作空间。
查看Python的方法:Python3 --version
。
Python版本 | Coredump脚本 |
---|---|
3.9.6 |
完成以上操作后,工作空间如下图所示。
完成上述操作后,您可以执行以下步骤,开启lldb调试。
注意
当执行command script import spliceMemory
,spliceMemory
不要带.so
。
开启Coredump后,可以使用LLDB指令来进行操作。
注意
调试技巧和在Xcode中执行命令一致。
调解演示图: