当遇到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
文件 -
如果出现
解析前.pngError: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
, 先使用指令export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
,再导出xxx.txt
,结果如下:
解析后.png
atos命令解析
采用atos
命令, symbolicatecrash
也是 apple 基于 atos
方便开发者进行的封装
通过指令atos -o qdt.dSYM/Contents/Resources/DWARF/xxx -arch arm64 -l 0x104c1b140 0x1045fc000
lldb 解析
首先准备我们可能需要的东西
-
Stack Address
:0x104c1b140 -
Load 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
image.png - 那么实际我们要找的地址就是
_PAGEZERO Size + File Offset
, 也就是0x100000000+6418752
- 首先
mac
终端进入lldb
image.png - 输入指令
target create --arch arm64 qdt.dSYM/Contents/Resources/DWARF/xxx
image.png -
image lookup -a 0x000000010061f140
查找地址 即可
image.png
Dwarfdump 解析
- 通过指令
dwarfdump --lookup 0x000000010061f140 --arch arm64 qdt.dSYM/Contents/Resources/DWARF/xxx
image.png
网友评论