一般情况下,在我们 Archive 完项目后需要保存对应的 dSYM 文件,这样有线上崩溃时,崩溃统计工具并没有明确提供崩溃类和方法时,我们拿着地址去 dSYM 文件中对比,找到对应的符号,也就是类和方法名字。但是,有时候我们弄丢了 dSYM 文件,就没法定位了,这时候就需要恢复符号表了。
下载一个 demo,调整为 debug 模式。我在 release 模式下,在设备中获取到的 Device Logs 直接显示了崩溃的类和方法名字,暂时不知道为什么,所以先用 debug 模式吧。
- 在真机上运行 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. git clone --recursive https://github.com/tobefuturer/restore-symbol.git
2. cd restore-symbol && make
将第一步中拷贝到桌面上的 CrashTest 右击 -> 显示包内容,拷贝 CrashTest 到 restore-symbol 文件夹下,你看样的文件目录应该是这样的:
restore-symbol.png
-
终端进入到 restore-symbol 文件夹下,执行:
./restore-symbol -o CrashTest-symbol CrashTest
命令,通过ls
可以查看目录下是否多了 CrashTest-symbol 文件。 -
通过 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崩溃日志
杨君的小黑屋
网友评论