美文网首页ToolsiOS Developer
iOS崩溃日志之手动解析与自动解析

iOS崩溃日志之手动解析与自动解析

作者: Janyau | 来源:发表于2017-04-23 21:13 被阅读131次

    前言

    在日常开发中难免遇到程序崩溃的时候,若在Dev环境下通过编译器便能很容易定位到崩溃代码处,但是若版本发布在正式环境里(包括Adhoc和distrubute),我们便无法直接定位到崩溃代码处了。此刻app里的统计平台反馈给我们的是一段没有可读性的日志。那么如何高效、快速、准确地解析日志以便我们快速定位到问题代码?

    talkingData平台上的崩溃日志

    一、所需文件

    • 崩溃日志文件
      我们公司使用的是talkingData统计分析平台,故在网站平台可以看到详细的日志记录,平台上还能看到具体是哪一个版本的APP崩溃。从网站平台下载下来的日志文件为csv格式。


    • 符号表文件

    • 依次点击 Xcode-->Window-->Organizer-->Archives,选中你的项目,右击,点击 “Show in Finder” 便可找到对应的xcarchive文件。


    • 选中上面找到的xcarchive文件,右击点击“Show Package Contents”,进入dSYMs便可以看到dSYM文件。


    二、解析方式

    • 手动解析

    • 新建文件夹crash,将dSYM文件拷贝至crash文件中,打开"Terminal",cd进入crash目录,输入atos -o YourAPP.app.dSYM/Contents/Resources/DWARF/YourAPP -arch arm64 -l 0x100008000 0x000000010007cf10
      0x100008000 :start adress
      0x000000010007cf10 : Offset address

    • 输出结果:


    • 自动解析
      自动解析其实就是将上述手动解析步骤用脚本来执行,可以看到其结果是一样的。


    • 脚本

    自己新建一个.sh文件,将脚本文件拷贝到其中,.sh文件中用#注释语句,因为#Markdown语法中有特殊含义,故.sh文件中需要将//换成#

    // 使用须知
    // 1.自己新建一个文件夹,将.xcarchive文件和talkingData上的日志文件(.csv格式)下载并保存到该目录
    // 2.cd进入该目录, 运行脚本crash.sh, 脚本可带参数, 不传参数时默认是YourAPP, 带参数时,参数表示其它功能名称。例如./crash.sh hrloo
    
    if [ ! -n "$1" ] ;then
    xcarchiveName="YourAPP" 
    else
    xcarchiveName="$1"
    fi
    dirs=$(pwd)
    
    //-----------------------------------------------//
    mkdir -p file $dirs/file
    
    cd $dirs
    cp -r ./*.xcarchive $xcarchiveName.xcarchive
    
    cd $dirs/"$xcarchiveName".xcarchive/dSYMs
    cp -r ./$xcarchiveName.app.dSYM $dirs/file
    
    cd $dirs
    
    cp -r ./*.csv ./file/""$xcarchiveName"log".txt
    rm -r ./"$xcarchiveName".xcarchive
    
    //-------------------deal txt-------------------//
    
    cd file
    grep -e "reason" "$xcarchiveName"log.txt
    adress=`grep -e "Start Address" "$xcarchiveName"log.txt`
    for adr in $adress
    do
    {
    if [[ $adr =~ '0x' ]];
    then
    adress=$adr
    fi
    }
    done
    
    echo '---------------------------crash begin function-------------------------------\n'
    result=`grep -e "$xcarchiveName +" "$xcarchiveName"log.txt`
    while read line
    do
    {
    for var in $line
    do
    if [[ $var =~ '0x' ]];
    then
    atos -o $xcarchiveName.app.dSYM/Contents/Resources/DWARF/$xcarchiveName -arch arm64 -l $adress $var
    fi
    done
    }
    done <<EOF
    $result
    EOF
    echo '----------------------------crash end function---------------------------------\n'
    
    cd ../
    rm -r file
    

    本文系作者原创,转载请注明出处。

    相关文章

      网友评论

      • Hanfank:这个的作用是什么?
        Janyau:APP发布发布到线上后总有bug吧, 统计平台上的日志文件是以地址的形式展示的, 本文便是将这种难以看懂的地址快速转换为我们熟悉的函数名, 快速, 方便定位到崩溃的函数位置!

      本文标题:iOS崩溃日志之手动解析与自动解析

      本文链接:https://www.haomeiwen.com/subject/wyesattx.html