近日在使用友盟统计的时候,一个crash的寻找其原始地址经历,做一次记录。
image.png
上图是错误日志的虚拟内存地址,对于如何通过虚拟地址找到对应错误方法,我做如下几条总结:
一、找到xcode自带工具symbolicatecrash
# 查找本地symbolicatecrash
find /Applications/Xcode.app -name symbolicatecrash -type f
# 结果如下
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/iOSSupport/Library/PrivateFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
二、复制symbolicatecrash工具到自定义文件夹 将应用到xxx.app.dSYM放入该文件夹
xxx.app.dSYM为具有调试信息的目标文件,可以通过dSYM经过解析还原错误的代码位置
三解析过程
# 错误虚拟地址
0x00000001045038a4 xxxx + 3848356
# 虚拟地址16进制转10 进制
printf %d 0x00000001045038a4
# 结果如下
4367333540
# 虚拟地址与偏移量进行相加
expr 4367333540 + 3848356
# 结果
4371181896
#将计算的十进制结果再转16进制
printf "%X\n" 4371181896
# 结果
1048AF148
# 通过atos [-arch 架构名] [-o 符号表] [-l 模块地址] [方法地址] 命令找到错误方法
xcrun atos -arch arm64 -o ./xxx.app.dSYM/Contents/Resources/DWARF/xxx -l 0x00000001045038a4 1048AF148
#得到发生错误的方法
+[IFABlurryView screenShot] (in xxx) (IFABlurryView.m:61)
#然后找到对应错误并解决问题
其中atos [-arch 架构名] [-o 符号表] [-l 模块地址] [方法地址]
命令的模块地址
是对于错误的虚拟内存地址
.crash文件解析
如果有.crash 文件
解析过程如下:
./symbolicatecrash ./crash.crash ./xxx.app.dSYM > crash_xxx.crash
如果无法解析,执行命令
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
结果如下:
+[IFABlurryView screenShot] (in xxx) (IFABlurryView.m:61)
+[IFABlurryView blurImage] (in xxx) (IFABlurryView.m:49)
-[IFABlurryView init] (in xxx) (IFABlurryView.m:33)
-[IFARootNavigationController resignActive] (in xxx) (IFARootNavigationController.m:79)
网友评论