记线上闪退排查方式
一、可在友盟等三方查看闪退日志的情况下:
1、登录三方网站;
2、获取日志;
3、获取符号表:
.ipad的获取:
XCode -> Window -> Organizer -> 选择所需的Archive -> 右键选择 Show in Finder
找到对应的. xcarchive 文件 -> 右键选择“显示包内容” -> 进入dSYMs 文件夹即可看到.dSYM文件
.framework的获取:
xxx.project > Products > xxx.framework > Show in Finder > Release-iphoneos >xxx.dSYM
PS:先确认UUID
终端切换到当前dSYMs目录下执行:xcrun dwarfdump --uuid <dSYM文件> //确定是否UUID匹配。
二、设备上获取闪退日志的情况下:
.ips
一般来说,Mac无法直接打开.ips文件,所以获取到.ips文件时,将后缀改为.crash,然后就可以直接浏览了,通过设备上的设置-隐私-分析数据中查到对应的时间的日志即可获取。
.crash文件 Xcode>Window>Devices and Simulators>选择已连接的真机>View Device Logs>xxxApp>右键导出.crash文件
1、获取symbolicatecrash工具
路径:/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
2、获取.dSYM文件
参照上文
3、准备解析
把.crash文件
,.dSYM文件
,symbolicatecrash 工具
放在一个目录下
然后在终端输入:
./symbolicatecrash xxx.crash xxx.dSYM > crash.log
如遇报错:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
在终端输入:
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
后执行上个步骤的命令即可。
4、分析.crash
文件
-
Exception Type
: EXC_RESOURCE //这种一般是设备性能太差(内存、CPU),被系统给终结的 -
Exception Subtype
: WAKEUPS // 系统奔溃分类 -
Exception Message
: (Limit 150/sec) Observed 346/sec over 300 secs // 异常信息,相当于系统redline -
Exception Note
: NON-FATAL CONDITION (this is NOT a crash) // 异常备注,this is NOT a crash,区别于常见的内存操作错误造成的崩溃,这是系统主动terminate的 -
Triggered by Thread
: 34 // 触发异常/崩溃的线程,很关键,拿到Thread号,然后去找对应thread的堆栈信息,就能很快定位到奔溃原因。
5、注意事项
-
.dSYM
的UUID
要和.crash
的对应上,否则会报错No symbolic information found
- 查看
.dSYM
的UUID
:dwarfdump --uuid xxx.dSYM
- 查看
.crash
的UUID
:
- 指定Xcode环境变量:
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
,然后echo $DEVELOPER_DIR
看一下是否已经设置成功了。 - 注意
export DEVELOPER_DIR
这种方式是临时的,也就是关闭Terminal
后再打开并解析.crash
文件时,要重新执行这条命令。
要想“一劳永逸”,就在~/根目录下新建.bash_profile
,然后把上面这条命令加进去,然后执行source .bash_profile
,重启Terminal
,再echo $DEVELOPER_DIR
看看是否成功。 - 重要事情说三遍:每次打包后,一定要备份.dSYM,最好是有命名规范app_version_buid.dSYM,例如:
WCRLiveCore_1.1.33_18.dSYM
- 自动导出.dSYM文件:
cp -r "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework.dSYM" "${HOME}/Desktop/${PROJECT_NAME}_$(date +"%Y%m%d_%H%M%S").framework.dSYM"
三、根据 .crash 崩溃 报告的内存地址定位到代码位置:
1、取得对应.dSYM
文件,方法如上所述。
2、.dSYM
文件右键,显示包内容,然后是Contents
文件夹,进入有Resources
文件夹,打开后有DWARF
,然后打开终端cd
到DWARF
文件夹。
3、然后输入
atos -arch <#CPU Type#> -o <#App Name#> -l <#base address#> <#target address#>//对应自己的情况填充即可