「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战」。
当遇到crash的时候,一般可能会根据复现流程来抓,而有时候又不具备这样的条件。 ps:集成了第三方工具就不用管了。
下面就来看几种当只有crash文件和dSYM文件的时候的解析方式
1. symbolicatecrash解析
-
拿到
crash文件- 如果是自己公司测试机,通过
Xcode -> Window -> Devices and Simulators -> View Device Logs拿 - 如果无法拿到手机,只能死皮赖脸让发生crash的人,从
手机隐私->分析与改进/分析->分析数据里到处ips文件给你了,改后缀为.crash
- 如果是自己公司测试机,通过
-
通过
symbolicatecrash来解析,symbolicatecrash路径:Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -
建一个文件夹将
.crash,.dSYM,symbolicatecrash放在一个文件夹 -
./symbolicatecrash qdt.crash qdt.dSYM/Contents/Resources/DWARF/xxx > xxx.txt通过这个指令导出一个xxx.txt文件 -
如果出现
Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69., 先使用指令export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer,再导出xxx.txt,结果如下:
atos命令解析
采用atos命令, symbolicatecrash 也是 apple 基于 atos 方便开发者进行的封装
通过指令atos -o qdt.dSYM/Contents/Resources/DWARF/xxx -arch arm64 -l 0x104c1b140 0x1045fc000
lldb 解析
首先准备我们可能需要的东西
Stack Address:0x104c1b140Load Address:0x1045fc000_PAGEZERO:0x100000000 (arm64)File Offset: 6418752 = Stack Address - Load Address
这里需要了解一点知识
_PAGEZERO
arm64 0x100000000
非arm64 0x4000
ASLR: 让mach-o载入内存时内存开始位置 发生变化,ASLR 随机产生偏移
代码段开始位置 = ASLR offset + _PAGEZERO
函数的内存地址(VM Address) = ASLR Offset + _PAGEZERO Size + File Offset
hopper,ida中的地址都是未使用ASLR的 VM Address
-
可以通过
dsym来看看otool -l qdt.dSYM/Contents/Resources/DWARF/xxx > qdt.txt\
-
那么实际我们要找的地址就是
_PAGEZERO Size + File Offset, 也就是0x100000000+6418752 -
首先
mac终端进入lldb\
- 输入指令
target create --arch arm64 qdt.dSYM/Contents/Resources/DWARF/xxx\
-
image lookup -a 0x000000010061f140查找地址 即可\
Dwarfdump 解析
- 通过指令
dwarfdump --lookup 0x000000010061f140 --arch arm64 qdt.dSYM/Contents/Resources/DWARF/xxx