美文网首页iOS点点滴滴
没有dSYM文件 解析iOS崩溃日志

没有dSYM文件 解析iOS崩溃日志

作者: chenyu1520 | 来源:发表于2017-11-13 19:17 被阅读554次

    一般情况下,在我们 Archive 完项目后需要保存对应的 dSYM 文件,这样有线上崩溃时,崩溃统计工具并没有明确提供崩溃类和方法时,我们拿着地址去 dSYM 文件中对比,找到对应的符号,也就是类和方法名字。但是,有时候我们弄丢了 dSYM 文件,就没法定位了,这时候就需要恢复符号表了。

    下载一个 demo,调整为 debug 模式。我在 release 模式下,在设备中获取到的 Device Logs 直接显示了崩溃的类和方法名字,暂时不知道为什么,所以先用 debug 模式吧。

    1. 在真机上运行 APP,我的手机是 iPhone6 plus,程序运行起来,点击按钮 Crash on Func。通过 Xcode 的 Window -> Devices and Simulators -> View Device Logs 找到CrashTest 的崩溃信息,注意一下 Code Type:,后面需要用到。崩溃信息大致如下:
    此处删除了部分内容
    Code Type:           ARM-64 (Native)  注意这里!!!
    Role:                Foreground
    Parent Process:      launchd [1]
    Coalition:           com.gomemyc.mylc.ios.enterprise.CrashTest [651]
    
    
    Date/Time:           2017-11-13 18:20:06.3615 +0800
    Launch Time:         2017-11-13 18:20:04.7860 +0800
    OS Version:          iPhone OS 11.0.3 (15A432)
    Baseband Version:    6.17.00
    Report Version:      104
    
    Exception Type:  EXC_CRASH (SIGABRT)
    Exception Codes: 0x0000000000000000, 0x0000000000000000
    Exception Note:  EXC_CORPSE_NOTIFY
    Triggered by Thread:  0
    
    Application Specific Information:
    abort() called
    
    Filtered syslog:
    None found
    
    Last Exception Backtrace:
    0   CoreFoundation                  0x183c2bd38 __exceptionPreprocess + 124
    1   libobjc.A.dylib                 0x183140528 objc_exception_throw + 55
    2   CoreFoundation                  0x183bc4c44 _CFThrowFormattedException + 111
    3   CoreFoundation                  0x183c738cc -[__NSArrayI objectAtIndexedSubscript:] + 131
    4   CrashTest                       0x100537b28 0x100530000 + 31528
    5   CrashTest                       0x100537a60 0x100530000 + 31328
    6   UIKit                           0x18d07020c -[UIApplication sendAction:to:from:forEvent:] + 95
    7   UIKit                           0x18d07018c -[UIControl sendAction:to:forEvent:] + 79
    8   UIKit                           0x18d05af4c -[UIControl _sendActionsForEvents:withEvent:] + 439
    
    此处删除了部分内容
    

    可以看到 Last Exception Backtrace: 下面有我们 APP 崩溃的两条信息。0x100530000 是基址,0x100537b28 和 0x100537a60 是调用堆栈的地址,后面会用到。

    此时需要在 Xcode 中的 Products 下,右击 CrashTest.app -> Show in Finder,拷贝 CrashTest 到桌面,留着后面用。

    1. 安装工具(最好克隆在桌面上)
    1. git clone --recursive https://github.com/tobefuturer/restore-symbol.git
    2. cd restore-symbol && make
    

    将第一步中拷贝到桌面上的 CrashTest 右击 -> 显示包内容,拷贝 CrashTest 到 restore-symbol 文件夹下,你看样的文件目录应该是这样的:


    restore-symbol.png
    1. 终端进入到 restore-symbol 文件夹下,执行:./restore-symbol -o CrashTest-symbol CrashTest 命令,通过ls可以查看目录下是否多了 CrashTest-symbol 文件。

    2. 通过 atos 命令查看崩溃的具体类和函数,命令是:atos -arch arm64 -o CrashTest-symbol -l 0x100530000 0x100537b28 0x100537a60(此处要注意你的机型是否是arm64,要写你自己的机型),此时你需要注意的是 0x100530000 是你的基址,0x100537b28 和 0x100537a60 是在第一步中看到的崩溃类和函数的调用堆栈,这里要替换成自己的。然后你就可以看到正确的打印出了崩溃的类名和方法名字,大致如下:

    -[ViewController getChild:] (in CrashTest-symbol) (ViewController.m:66)
    -[ViewController crashOnFunc:] (in CrashTest-symbol) (ViewController.m:57)
    

    最后操作的命令大致如下截图:


    终端截图.png

    在这期间,参考了两篇博客,但是如果完全按照这个博客做的话,我没有做出来,或许是有些细节没有注意到。参考如下:
    详解没有dSYM文件 如何解析iOS崩溃日志
    杨君的小黑屋

    相关文章

      网友评论

        本文标题:没有dSYM文件 解析iOS崩溃日志

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