一、获取崩溃日志对应的.dSYM文件
Xcode-->Window-->Organizer 找到对应的 .xcarchive 文件 -->Show in Finder 找到对应的.dsym
二、获取Xcode 下面的symbolicatecrash
工具
复制下面的路径前往获取symbolicatecrash
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
三、创建新的文件夹将.dSYM
、symbolicatecrash
、崩溃日志文件.txt
三个文件放入。这里文件夹命名crash
四、使用终端命令进入到刚刚创建的crash
文件夹并执行命令行
cd /Users/peanut/Desktop/crash
./symbolicatecrash ./crashLog.txt ./M1 Controller.app.dSYM > MyAppCrash.log
symbolicatecrash
:是符号化工具
crashLog.txt
:是崩溃日志的文件名
My Controller.app.dSYM
:是dSYM 的名称。(注意:我这里的文件名是有空格的。下文会提及并解释)
MyAppCrash.log
:是符号化后导出的文件
五、执行终端命令后出现Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
那是因为没有定义文件地址.继续执行
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
-命令后 再次执行
./symbolicatecrash ./crashLog.txt ./M1 Controller.app.dSYM > MyAppCrash.log
即可 出现MyAppCrash.log文件。
⚠️⚠️ 如果解析的是iOS App的崩溃日志到这里可能没啥问题。到此解决问题!
⚠️⚠️如果解析的是macOS 应用的崩溃日志,会收到如错误提示
Unsupported crash log version: 12 at ./symbolicatecrash line 616.
peanut@huashengkedeMacBook-Pro ~ % cd /Users/peanut/Desktop/crash
peanut@huashengkedeMacBook-Pro crash % ./symbolicatecrash ./crashLog.txt ./My Controller.app.dSYM > MyAppCrash.log
Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
peanut@huashengkedeMacBook-Pro crash % export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
peanut@huashengkedeMacBook-Pro crash % ./symbolicatecrash ./crashLog.txt ./My Controller.app.dSYM > MyAppCrash.log
Unsupported crash log version: 12 at ./symbolicatecrash line 616.
翻阅资料发现xcode 还不支持导入 OSX 崩溃日志并将其符号化
,参考资料。
所以为了解析macOS崩溃日志 ,我们需要使用到atos
命令
六、继以上步骤继续往下解析macOS崩溃日志
1.获取.dYSM的UUID
执行命令xcrun dwarfdump --uuid name.app.dSYM
peanut@huashengkedeMacBook-Pro crash % xcrun dwarfdump --uuid My controller.app.dSYM
error: My: No such file or directory
可以看到我替换了name.app.dSYM
的名称My Controller.app.dSYM
后执行出错。是因为我的名称中带了空格。在这里我们可以将crash
文件夹里面的My Controller.app.dSYM
修改为MyController.app.dSYM
这里修改名称并不会对符号化有任何影响请放心~
我们再次执行
peanut@huashengkedeMacBook-Pro crash % xcrun dwarfdump --uuid MyController.app.dSYM
UUID: 28409CBF-FF6E-3035-AA0D-2C622D947194 (x86_64) MyController.app.dSYM/Contents/Resources/DWARF/My Controller
UUID: 1F606971-BC0F-385E-872D-1A159905FF03 (arm64) MyController.app.dSYM/Contents/Resources/DWARF/My Controller
在这里获取到了俩个UUID,对于这里我也没有理解其含义。有知道的小伙伴可以解释下。
2.在崩溃日志中Binary Images
二进制图像部分找到您的应用
使用第一步获取到的UUID分别在崩溃日志中查找。
我只找到arm64对应的UUID ,另一个x86_64没有找到
Binary Images:
0x1191e8000 - 0x11931ffff com.apple.audio.units.Components (1.14) <fd93a3bc-5142-33ea-88bd-c2258c5a032d> /System/Library/Components/CoreAudio.component/Contents/MacOS/CoreAudio
0x104f90000 - 0x104f9bfff com.apple.iokit.IOUSBLib (900.4.2) <351e046e-b6eb-3ee7-96b3-841918c05405> /System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/IOUSBLib.bundle/Contents/MacOS/IOUSBLib
0x1046c8000 - 0x1046d3fff libobjc-trampolines.dylib (*) <9381bd6d-84a5-3c72-b3b8-88428afa4782> /usr/lib/libobjc-trampolines.dylib
0x1048d8000 - 0x1048e7fff org.cocoapods.SnapKit (5.0.1) <fa297fb0-0071-3417-bf2c-b0cdba7dade8> /Applications/My Controller.app/Contents/Frameworks/SnapKit.framework/Versions/A/SnapKit
0x1042f0000 - 0x104397fff com.cn.******.my (1.0) <1f606971-bc0f-385e-872d-1a159905ff03> /Applications/My Controller.app/Contents/MacOS/My Controller
0x1894a0000 - 0x189978fff com.apple.CoreFoundation (6.9) <84b539d5-22c9-3f8c-84c8-903e9c7b8d29> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
0x18a5f5000 - 0x18b252fff com.apple.Foundation (6.9) <99e0292d-7873-3968-9c9c-5955638689a5> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
0x18cd42000 - 0x18e07efff com.apple.AppKit (6.9) <61f710be-9132-3cc2-883d-066365fba1ad> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
0x190531000 - 0x1905a4ff7 com.apple.AE (944) <3b96540c-5db5-3880-bc50-a759b87f6638> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE
0x193c8d000 - 0x193f50fff com.apple.HIToolbox (2.1.1) <7db6c397-563f-3756-908c-e25b019a1848> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox
0x1890b0000 - 0x189138a17 dyld (*) <37bbc384-0755-31c7-a808-0ed49e44dd8e> /usr/lib/dyld
0x0 - 0xffffffffffffffff ??? (*) <00000000-0000-0000-0000-000000000000> ???
0x199108000 - 0x199665fff libswiftCore.dylib (*) <c2fd0f69-d72c-37a5-938e-1bd710c88431> /usr/lib/swift/libswiftCore.dylib
0x189438000 - 0x189444fff libsystem_pthread.dylib (*) <386b0fc1-7873-3328-8e71-43269fd1b2c7> /usr/lib/system/libsystem_pthread.dylib
0x1893fd000 - 0x189437ffb libsystem_kernel.dylib (*) <9b8b53f9-e2b6-36df-98e9-28d8fca732f2> /usr/lib/system/libsystem_kernel.dylib
0x1939b5000 - 0x1939defff com.apple.audio.caulk (1.0) <f2da6e2e-b5a0-3ce7-97f5-7d2141a3ec32> /System/Library/PrivateFrameworks/caulk.framework/Versions/A/caulk
0x18bac2000 - 0x18c1c8fff com.apple.audio.CoreAudio (5.0) <e818958c-f2dc-37df-9896-ad6e9bcd028a> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio
查找到的我的应用信息如下
0x1042f0000 - 0x104397fff com.cn.******.my (1.0) <1f606971-bc0f-385e-872d-1a159905ff03> /Applications/My Controller.app/Contents/MacOS/My Controller
尖括号中的部分是 UUID... 验证它是否与 dwarfdump 的输出匹配。如果不匹配,则说明您查看的是错误的版本。版本号在括号中 - 这可能有助于您找到正确的版本。
注:如果你确定崩溃日志与.dSYM版本是一致的话 。可以忽略1步骤。直接在Binary Images
中查找到自己应用的bundle id 即可
3.在Binary Images部分找到您的应用加载地址。在上面的例子中,加载地址是0x1042f0000。
4.在崩溃日志中找到应用程序崩溃的位置
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000104300724
Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5
Terminating Process: exc handler [5840]
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 My Controller 0x104300724 0x1042f0000 + 67364
1 My Controller 0x1042fc9d4 0x1042f0000 + 51668
2 My Controller 0x1042fc724 0x1042f0000 + 50980
3 My Controller 0x1042fc774 0x1042f0000 + 51060
4 My Controller 0x104344a74 0x1042f0000 + 346740
5 My Controller 0x1043468fc 0x1042f0000 + 354556
6 My Controller 0x104345d5c 0x1042f0000 + 351580
7 My Controller 0x104346120 0x1042f0000 + 352544
8 CoreFoundation 0x189513144 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 148
9 CoreFoundation 0x1895a73d8 ___CFXRegistrationPost_block_invoke + 88
10 CoreFoundation 0x1895a7320 _CFXRegistrationPost + 440
可以看到0x104300724 可能就是程序崩溃的地址
5.运行 atos 以获取有关该地址的信息
1步骤中我们获取到二个UUID分别对应arm64、x86_64。这这里我们是用 arm64的那个UUID获取到应用信息的。故命令行中使用arm64
,反之则使用x86_64
atos -o MyController.app.dSYM -arch arm64 -l 0x1042f0000 0x104300724
可以看到符号化后的输出
specialized MainContainView.recoverLastBuildUI() (in My Controller) (MainContainView.swift:101)
输出表明是在MainContainView中的recoverLastBuildUI()方法出现了崩溃 具体在101行。到此解析结束