近日在使用友盟統(tǒng)計的時候袜硫,一個crash的尋找其原始地址經(jīng)歷挤安,做一次記錄。
image.png
上圖是錯誤日志的虛擬內(nèi)存地址戈鲁,對于如何通過虛擬地址找到對應錯誤方法仇参,我做如下幾條總結:
一、找到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經(jīng)過解析還原錯誤的代碼位置
三解析過程
# 錯誤虛擬地址
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
#得到發(fā)生錯誤的方法
+[IFABlurryView screenShot] (in xxx) (IFABlurryView.m:61)
#然后找到對應錯誤并解決問題
其中atos [-arch 架構名] [-o 符號表] [-l 模塊地址] [方法地址]
命令的模塊地址
是對于錯誤的虛擬內(nèi)存地址
.crash文件解析
如果有.crash 文件
解析過程如下:
./symbolicatecrash ./crash.crash ./xxx.app.dSYM > crash_xxx.crash
如果無法解析,執(zhí)行命令
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)