美文网首页
macOS 应用的崩溃日志解析

macOS 应用的崩溃日志解析

作者: 慕言的世界 | 来源:发表于2024-07-07 15:57 被阅读0次

一、获取崩溃日志对应的.dSYM文件

Xcode-->Window-->Organizer 找到对应的 .xcarchive 文件 -->Show in Finder 找到对应的.dsym

二、获取Xcode 下面的symbolicatecrash工具

复制下面的路径前往获取symbolicatecrash

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

三、创建新的文件夹将.dSYMsymbolicatecrash崩溃日志文件.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行。到此解析结束

相关文章

网友评论

      本文标题:macOS 应用的崩溃日志解析

      本文链接:https://www.haomeiwen.com/subject/jlancjtx.html