在实际的开发过程中,我们的app如果出现crash情况,一般会通过bugly或者firebase等工具,上报到控制台,方便我们进行分析。但是有的时候也会存在一些crash信息没有上报,我们开发无法根据测试反馈的流程复现crash的情况。针对这种情况,只能让测试把手机打开一些功能,来方便我们定位问题。具体步骤如下:

iOS 符号库 ios 符号表_闪退


iOS 符号库 ios 符号表_ios_02


共享iphone分析开关打开,这样有crash信息就会记录下来

iOS 符号库 ios 符号表_ios_03


如果有crash信息就有记录下来,可以点击【分析数据】这一行进去查看,具体如下:

iOS 符号库 ios 符号表_闪退_04


可以选择某一个信息,进入然后分享出来。

接下来就可以进行crash信息的解析处理了。具体步骤如下:

需要准备的文件

1,导出的crash日志文件,后缀名修改为.crash

2, dSYM符号表文件

3,解析符号表的脚本Crash.sh

将这三个文件放在同一个文件夹内,并进入到这个文件夹下,然后在终端执行如下命令

sh Crash.sh aaa.crash  bbb.app.dSYM

备注:aaa.crash指自己的crash名字,不要有和这个一样,bbb也是指自己的文件名字,不要求必须一样。

执行后截图如下:

iOS 符号库 ios 符号表_符号表解析_05


可以看到生成了symbol.text文件。大家就可以进去看crash的详细信息了。注意:解析符号表时,Xcode的版本号一定要和打包时的版本号保持一致,另外这个解析符号表,也存在解析不全的情况,这个大家要有一定的心理预期。如果后续有更好的方法,会持续更新在在本文中。

Crash.sh脚本具体内容如下,大家可以直接复制使用

#!/bin/bash

export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

echo "----开始 第一个参数是crash路径 -----"

symbolToolPath="./symbolicatecrash"
crashPath=""
dSYMPath=""

if [ ! -f "$symbolToolPath" ]
then
    echo "文件为特殊文件"
    symbolToolPath="/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash"
    echo "symbolicatecrash工具的路径是为:"$symbolToolPath
    if [ -f "$symbolToolPath" ]
    then 
        echo "symbolicatecrash工具存在(文件为普通文件)"
    else
        echo "无法找到symbolicatecrash工具"
    fi
fi

function findFile(){
    crashPath=$(find . -name "*.crash")
}

if [ -n "$1" ]
then
    crashPath=$1
    echo "已传入crash文件路径:$crashPath"
else
    findFile
    echo "未传入crash文件路径,搜索同级目录下crash文件"
fi

if [ ! -f "$crashPath" ]
then
    echo "搜索失败,无法找到crash文件"
    exit
fi

dSYMPath=$(find . -name "*.dSYM" -print)
echo "找到的符号表路径:$dSYMPath"

if [ ! -d $dSYMPath ]
then
    echo "无法找到符号表dSYM文件"
    exit
fi

# ./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
$symbolToolPath $crashPath $dSYMPath > symbol.text