跳到主要内容

符号表工具使用说明


1 介绍

什么是符号表? 符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:

    <起始地址> <结束地址> <函数> [<文件名:行号>]

为什么要配置符号表?

为了能快速并准确地定位用户APP发生Crash的代码位置,CrashSight使用符号表对APP发生Crash的程序堆栈进行解析和还原。 举一个例子:

还原前堆栈还原后堆栈
#00 pc 0021cdf4 /lib/libgame.so#00 pc 0021cdf4 _ZNK14CAnimationNode13getCurEquipldEv(CAnimationNode.h:51)
#01 pc 002abe36 /lib/libgame.so#01 pc 002abe36 _ZNSt6vectorl15NDKCallbackNodeSalS0_EE5beginEv(NDKHelper.cpp:312)
#02 pc 003aebee /lib/libgame.so#02 pc 003aebee _ZNK6b2Vec26LengthEv(b2Math.h:121)

而符号表工具,正是CrashSight提供给开发者提取符号表文件(.symbol)的工具。 如果项目工程中没有Native代码,但使用了代码混淆proguard,那么只需要上传Proguard生成的Mapping文件。该符号表也支持Mapping文件的上传,具体方法请参看下文。

1.1 环境要求

符号表工具的运行需要64位Java运行环境(Java SE Runtime Envrionment),JRE或者JDK版本需要>=1.6。Windows符号表必须在Windows平台上进行上传。

1.2 符号表提取要求

提取符号表需要符号表工具和带符号表的库文件(详见各平台符号表文件格式,及在unity、unreal引擎中的生成方法)。

1.3上传功能

CrashSight符号表工具支持上传功能。 使用上传功能时,需要指定以下信息: App ID App版本 上报地址

1.4 如何获取App ID

2 如何使用符号表工具

符号表工具支持Windows、Linux、Mac三个平台,提供了JAR包crashSightSymbolTool.jar
在项目左侧导航栏的“接入指南”中,可以下载符号表工具:

使用方法及参数如下:

    jar -jar <JAR> [-选项 <参数>]

建议直接在“接入指南”中复制自动生成的命令,以免遗漏参数。

选项说明
-i指定文件路径,可指定目录(Windows符号表只可以指定目录)
-p指定符号表平台类型:aos/ios/win,分别对应Android,iOS和Windows平台
-o指定输出的符号表zip文件的路径,必须是zip文件(Windows符号表在系统临时文件目录,不支持指定)
-d调试模式开关(默认关闭)
-s指定配置文件(默认读取Jar目录下的setting.txt文件)
-u上传开关
-url上传URL
-idApp ID
-keyApp Key
-packageApp包名
-versionApp版本
-channelApp渠道(可选)
-mappingMapping文件(可选)
-symbol生成Symbol文件(可选)
-m生成模式,填 win 或者 ori(默认为win, 仅支持windows符号表使用)

注意该版本的符号表工具默认不生成Symbol文件,如果需要指定"-symbol"参数运行符号表工具。

上报URL:默认新加坡

3 常见问题

  1. 符号表工具的具体输入文件是什么?

    安卓需要输入的文件是带调试信息的.so文件,iOS的输入是dsym文件

  2. 符号表的 UUID 是什么?

    UUID是so/dsym内置的属性,同一份文件,该值不会改变;

  3. 符号表的上传更新是增量更新还是覆盖更新?

    相同UUID会覆盖,不同UUID会保留.

  4. 使用符号表上传工具,上传完成之后怎么自动确认(校验)上传是成功了的。

    一般来说符号表工具成功执行完成,就是成功了。也可以在页面检查对应版本的符号表是否上传。

  5. 上传工具需要更新的话,是如何进行通知以及更新的? 非必要更新,是会放到本文档中。如果存在必须要更新才能使用的情况,会通过接入时的沟通渠道进行联系。

4 iOS系统符号表获取

由于iOS崩溃会出现在系统库内,为了还原这部分崩溃,需要使用系统库的符号表。iOS系统符号表的获取方式如下:

  1. 准备对应系统版本/机型的设备一台。这里尽可能的使用崩溃相同机型,因为iOS同一版本系统,不同机型,有可能是不同的符号表。

  2. 安装Xcode的MAC一台。最好是安装最新Xcode的MAC,否则可能不支持最新的iOS系统。具体支持列表,可以查看MAC机器目录 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 下,是否有需要上传符号表的系统版本号。

  3. USB连接MAC,打开Xcode的设备管理,等待同步完成,通常需要10到30分钟以上。

  4. 查看MAC机器 "~/Library/Developer/Xcode/iOS DeviceSupport" 目录下是有对应的版本号的文件夹。

  5. 将对应版本的系统文件夹压缩并发送给CrashSight管理人员。

5 各平台符号表文件格式,及在unity、unreal引擎中的生成方法

1.Android--debug版的.so文件。
Unity中在build settings里【Create symbols.zip】选择Debugging。
Unreal中 项目设置-高级编译 勾选上【固定保存带符号libUnreal.so的副本】。
2.iOS--dSYM文件。
Unity需要在导出的xcode项目中配置GENERATE_DEBUG_SYMBOLS(True)和 DEBUG_INFORMATION_FORMAT(dwarf-with-dsym)。
Unreal在Project Settings-Platforms-iOS-Build中勾选Generate dSYM file for code debugging and profiling和Generate dSYM bundle for third party crash tools。
3.Windows--PDB文件,以及对应的EXE或DLL文件。
Unity在build settings里勾选上【Copy PDB files】。
Unreal 文件-打包项目-打包设置 勾选【包括调试文件】。
4.MacOS--dSYM文件。
Unity可以在构建产物的XXX_BackUpThisFolder_ButDontShipItWithYourGame目录中找到dSYM文件。
Unreal在Project Settings-Project-Packaging-Project中勾选For Distribution和Include Debug Files in Shipping Builds,打包生成的xcarchive文件中会包含dSYM。