什么是UUID
每一个可执行程序都有一个build UUID来唯一标识。Crash日志包含发生crash的这个应用(app)的 build UUID以及crash发生的时候,应用加载的所有库文件的[build UUID]。
1.那如何知道crash文件的UUID呢?
grep --after-context=2 "Binary Images:" *crash
得到如下结果:
xxPhone_9_7.crash:Binary Images:
xxPhone_9_7.crash-0x1008fc000 - 0x1040bbfff xxPhone arm64 <06c163900895325fb0cc2218e52bc570> /var/containers/Bundle/Application/0424DF52-AC71-4E4B-BBA2-446C3E224FFB/xxiPhone.app/xxiPhone
xxPhone_9_7.crash-0x105138000 - 0x105143fff calib arm64 <68fea1fb54ea2td4b885e1049e71e4cf> /var/containers/Bundle/Application/0424DF52-AC71-4E4B-BBA2-446C3E224FFB/JD4iPhone.app/Frameworks/calib.framework/calib
(请注意这里的0x1008fc000,是模块的加载地址,后面用atos的时候会用到)
2.如何找到app的UUID
xcrun dwarfdump --uuid appName.app/appName
xcrun dwarfdump --uuid xxPhone.app.dSYM
UUID: C59D97AE-B887-3922-BE2A-E3441A6E1173 (armv7) xxPhone.app.dSYM/Contents/Resources/DWARF/xxPhone
UUID: 06C16221-8895-325F-B0CC-3318E52BC570 (arm64) xxPhone.app.dSYM/Contents/Resources/DWARF/xxPhone
3.用atos命令来符号化某个特定模块加载地址
atos [-o AppName.app/AppName] [-l loadAddress] [-arch architecture]
xcrun atos -o xxPhone.app.dSYM/Contents/Resources/DWARF/xxPhone -l 0x1008fc000 -arch arm64
crash文件中有如下两行:
11 xxPhone 0x0000000103929838 0x1008fc000 + 50518072
12 xxPhone 0x000000010393ebc0 0x1008fc000 + 50604992
在执行完xcrun atos -o xxPhone.app.dSYM/Contents/Resources/DWARF/xxPhone -l 0x1008fc000 -arch arm64命令后,接着输入0x0000000103929838 0x000000010393ebc0
就可以看到
-[xxWebViewDelegate webView:decidePolicyForNavigationAction:decisionHandler:] (in xxPhone) (xxWebViewDelegate.m:371)
-[WKWebViewJavascriptBridge webView:decidePolicyForNavigationAction:decisionHandler:] (in xxPhone) (WKWebViewJavascriptBridge.m:163)
这样就找到了应用种到底是哪个模块导致的crash问题。
网友评论