美文网首页
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