iOS之crash分析篇--符号化

什么是符号化

长话短说就是将运行时信息转换成源码信息,符号化是一种机制,将我们在设备运行时App的内存地址和关联的指令信息转换成源码文件中具体的文件名、方法名、行数等。

可以理解将运行时机器如何“读”App,转换成开发者如何“读”App。如果缺少这层转换,哪怕几行代码的App,bug定位也变得难以进行。

获取dSYM文件

Xcode编译项目后,会生成一个同名的dSYM文件。dSYM是保存16进制函数地址映射信息的文件,每次编译项目的时候会生成一个新的dSYM文件。iOS设备中会有日志文件保存每个应用出错的函数内存地址,通过Xcode的Organizer可以将iOS设备中的DeviceLog导出成crash文件,可以通过出错的函数地址去查询dSYM文件中程序对应的函数名和文件名。

方式一

如果你的app是在自己的Xcode上编译出来的话,恭喜你,直接通过Xcode获得到崩溃日志,选择Xcode->Window->Devices and Simulators。选择设备,点击View Device Logs,就能看到解析后的崩溃日志啦!

cke_154.png

方式二

如果我们要解析的崩溃log对应的app不是通过自己的机器编译出来的,那该怎么解析呢?这里首先给大家介绍第一种方法atos命令工具。

用法:

atos -arch cpu指令集种类 -o dSYM文件 -l 堆栈地址

参数含义:

-arch:cpu指令集种类:可以为armv6 armv7 armv7s arm64

dSYM文件:.dSYM文件的路径,找到打包的.xcarchive文件,右键“显示包内容”,就可以找到.dSYM文件了。

cke_155.png

堆栈地址:我们在崩溃日志种看到的16进制地址,如:0x3838760c

我们在命令行中输入atos的这串命令后,就能在终端中看到堆栈地址对应的符号化信息。

方式三

大家可以看到,通过atos这个工具已经能够将16进制的内存地址转换为崩溃栈了,这种方法适用于我们想要对崩溃日志的某行或者某个内存地址进行解析。如果想要解析一个完整的崩溃日志文件,效率就太低了。更高效的,我们可以通过Mac自带的命令行工具symbolicatecrash解析Crash文件

1、symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的丁文崩溃所在的位置,将0x开头的地址替换为响应代码和具体行数。

获取symbolicatecrash工具,打开终端输入以下命令:

find /Applications/Xcode.app -name symbolicatecrash -type f

cke_156.png

根据路径前往文件夹找到symbolicatecrash,将其复制到指定文件夹。

2、获打包时产生的dSYM文件。

3、崩溃时产生的Crash文件,xxx.crash。

这里给大家推荐第三种方法,也就是symbolicatecrash这个工具,我们只需要cd到崩溃日志所在的文件夹,然后在终端输入以下的命令。

symbolicatecrash xxxx.crash > xxxx.txt 或 symbolicatecrash -o xxxx.txt xxxx.crash

这样就会在.crash文件同目录下生成解析后的log文件.txt了。

欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4478396/blog/5549874