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

一般情况下,在我们 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崩溃日志)