SuperMan-Lfj / blog

Apache License 2.0
1 stars 0 forks source link

iOS crash 符号化 工具与方法 #8

Open SuperMan-Lfj opened 3 years ago

SuperMan-Lfj commented 3 years ago

符号化的准备

当程序崩溃的时候,我们可以获得到崩溃的错误堆栈,但是这个错误堆栈都是0x开头的16进制地址,需要我们使用Xcode自带的symbolicatecrash工具来将.Crash和.dSYM文件进行符号化,就可以得到详细崩溃的信息。

获取crash文件

如果是我们自己直接使用手机连接崩溃或者崩溃之后连接手机,选择Window -> Devices and Simulators-> 选择自己的手机 -> view device logs 就可以查看我们的崩溃信息了。

issue8_device_log

右击文件,Export log, 就可以导出crash文件了。

issue8_export_log

方式一:直接使用xcode工程

如果我们有编译的xcode工程,里面包含了dSYM的话,那么直接使用xcode工程也是可以直接符号化的。

右击打开方式使用xcode打开crash文件,然后会弹出project的选择对话框: issue8_project

选择对应的project工程,xcode将会自动帮助我们符号化crash文件,相对来说,比使用命令行简单一些。

方式二:使用symbolicatecrash命令

首先找到symbolicatecrash所在的位置,命令行运行

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

会列出四种系统所对应的路径。我们这里定位手机崩溃,所以使用iphoneSumilator路径下的文件。

issue8_symbolicatecrash

运行命令,将crash符号化:

xx/symbolicatecrash ./xxx.crash ./xxxx.dSYM

其中:

运行之后,符号化的结果就得到了:

issu8_symbolized

方式三:atos

比如 错误堆栈信息:

myapp 0x00000001002acd13 0x00000001000b4000 + 2023
myapp 0x00000001002abc74 0x00000001000b4000 + 2063476

1、找到对应的应用打包生成 的appName.dYSM 文件,在终端中使用cd命令进入该目录 2、用atos命令来符号化某个特定的模块加载地址:

xcrun atos --arch arm64 -o myapp.app.dSYM/Contents/Resources/DWARF/myapp -l 0x00000001000b4000 0x00000001002abc74 0x00000001002acd13

arm64 armv7 是两个不同的CPU架构。


部分图片来自网络

I-m-SuperMan commented 3 years ago

补充: Error: "DEVELOPER_DIR" is not defined at /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash line 69.

需要export一下: export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"