• NE 和 KE 堆栈脚本解析


    根据show_bt_by_pid:pid   分离maps 和 backtrace

    文件格式

    show_bt_by_pid: 1: init.
    Dump native maps files:
    55873af000-55874f2000 r-xp 000b2000 /system/bin/init
    7f23b3b000-7f23b74000 r-xp 00020000 /system_ext/lib64/libcota.so
    7f23bab000-7f23bd9000 r-xp 00015000 /system_ext/lib64/libopex.so
    7f2404f000-7f24059000 r-xp 00008000 /system/lib64/libziparchive.so
    7f251aa000-7f251b5000 r-xp 00007000 /system_ext/lib64/liboplusextproperty.so

    __switch_to+0x144/0x170
    __schedule+0x89c/0x9d0
    schedule+0x74/0x98
    futex_wait_queue_me+0xd8/0x134
    futex_wait+0x120/0x2d4
    do_futex+0x124/0x190c
    __arm64_sys_futex+0x150/0x1d4
    invoke_syscall+0x64/0x138
    el0_svc_common+0x84/0x12c
    el0_svc_handler+0x64/0x80
    el0_svc+0x8/0xc
    0xffffffffffffffff
    ExSys-Statistic sysTid=9149, pid=1671
    #0 pc 757be76220
    #1 pc 74e8878a70
    #2 pc 74e88780b8
    #3 pc 70eb2f50
     

    #!/system/bin/sh


    kernel_raw_file=SYS_HANG_DETECT_RAW1
    kernel_raw_file="$1"

    string_dump="show_bt_by_pid:"
    cnt=0
    pid=0
    while read line_raw
    do
    number=$(echo "$line_raw" | grep "$string_dump" | awk  -F ":" '{print $1}')


    if [ -n "$number" ];then
    echo "$line_raw"
    cnt=$((cnt + 1))
    pid=$(echo "$line_raw" | awk  -F ":" '{print $2}')
    pid=$(echo "$pid" | awk '$1=$1')

    fi

    file=$kernel_raw_file"_"$pid
    #if [ ! -e $file ];then
    find_raw_line=`echo "$line_raw" | grep -E "r-xp|r-xs|--xp"`
    if [ -n "$find_raw_line" ];then
    map_address=`echo "$find_raw_line" | awk '{print $1}'`

    begin_address=`echo "$map_address" | awk -F '-' '{print $1}'`
    end_address=`echo "$map_address" | awk -F '-' '{print $2}'`


    #echo $pc"--->"$begin_address"----"$end_address
    echo "$line_raw" >>$kernel_raw_file"_"$pid

    else

    echo "$line_raw" >>$kernel_raw_file"_"$pid"_dump"

    fi #if [ -n "$find_raw_line" ]

    #fi #if [ ! -e $file ]

    done < "$kernel_raw_file"

    根据maps 和 对应 backtrace 自动解析

    #!/system/bin/sh


    my_llvm_addr2line="prebuilts/clang/host/linux-x86/clang-r416183b/bin/llvm-addr2line"
    echo "$my_llvm_addr2line"
    my_llvm_readelf="prebuilts/clang/host/linux-x86/clang-r416183b/bin/llvm-readelf"


    vmlinux="ss_dump_0707/vmlinux"


    so_lib_pre="out/target/product/mssi_64_cn_armv82/symbols"


    kernel_dump_file=SYS_HANG_DETECT_RAW1_894_dump
    kernel_lib_file=SYS_HANG_DETECT_RAW1_894
    result_file=SYS_HANG_DETECT_RAW1_result.txt

    kernel_lib_file="$1"
    if [ ! -n "$2" ];then
    kernel_dump_file="$kernel_lib_file""_dump"
    else
    kernel_dump_file="$2"
    fi
    result_file="$kernel_dump_file""_result"


    ##get kvOffset from SYS_KERNEL_LOG
    ##<5>[289072.063672]-(1)[263:hang_detect]Kernel Offset: 0x121fe00000 from 0xffffff8008000000

    kernel_log_file=SYS_KERNEL_LOG
    find_line=`grep -rsn "Kernel Offset:" $kernel_log_file`

    kvOffset=0
    echo "$find_line"
    if [ -n "$find_line" ];then
    kvOffset=`echo "$find_line" | awk '{print $3}' `
    echo "$kvOffset"
    fi

    echo >"$result_file"

    #  vmlinux

    while read line
    do
    stack=$(echo "$line" | grep '^<[A-Za-z0-9_]' | awk '{print $1}')

    echo "$line" >>"$result_file"
    if [ -n "$stack" ];then

    pc_addr=$(echo "$stack" | sed 's///g')


    #vmlinux
    pc_addr_over=$(echo $pc_addr | sed 's/^ffff//' | sed 's/^FFFF//')
    flag=false
    echo $pc_addr--$kvOffset

    if [ "$pc_addr_over" != "$pc_addr" ];then
       flag=true
    fi

    pc_addr_over=`echo "obase=16; $((16#$pc_addr_over-kvOffset))" | bc`

    if [ "$flag" == "true" ];then
    link_addr="0xFFFF"$pc_addr_over
    fi

    "$my_llvm_addr2line" -C   -e  $vmlinux    $link_addr  >>"$result_file"

    fi #if [ -n "$stack" ]

    stack=`echo "$line" | grep -n "#.* pc"`

    if [ -n "$stack" ];then
    pc_addr=$(echo "$line" | awk '{print $3}')
    echo "so lib""$stack"
    echo "$pc_addr"
    #so

    pc_addr=$(echo "$pc_addr" | awk '$1=$1')

    while read lib_line
    do
    find_lib=`echo "$lib_line" | grep  -E "r-xp"`
    if [ -n "$find_lib" ];then
    map_address=`echo "$find_lib" | awk '{print $1}'`
    begin_address=`echo "$map_address" | awk -F '-' '{print $1}'`
    end_address=`echo "$map_address" | awk -F '-' '{print $2}'`

    lib_info=`echo "$find_lib" | awk '{print $4}'`

    if [ $((16#$begin_address)) -le $((16#$pc_addr)) ] && [ $((16#$pc_addr)) -le $((16#$end_address)) ]
    then
        
        #addr_link = pc - start_lib  + offset 
        offset=`"$my_llvm_readelf" -l -W "$so_lib_pre""$lib_info" |  grep  " R E " | awk '{print $2}'`
        #offset=$(echo $offset | sed 's/^0x//')
        #echo $pc_addr"--->"$begin_address---$end_address----$lib_info---offset$offset
        link_addr=`echo "obase=16; $((16#$pc_addr-16#$begin_address+offset))" | bc`
        echo "$my_llvm_addr2line"  -C -f  -e  "$so_lib_pre""$lib_info"    "0x"$link_addr
        "$my_llvm_addr2line"  -C -f  -e  "$so_lib_pre""$lib_info"    "0x"$link_addr >>"$result_file"
        break
    fi


    fi #if [ -n "$find_raw_line" ]
    done < "$kernel_lib_file"
    fi #if [ -n "$stack" ]


    done < "$kernel_dump_file"


     

  • 相关阅读:
    关于羊了个羊,我真的是娘了个娘。
    [黑马程序员Pandas教程]——Pandas缺失值处理
    二叉树,关于数字计算的高频考点
    angr内存模拟部分源码阅读
    Cobaltstrike常用功能
    qiankun项目搭建手册
    JeecgBoot 3.4.3-Vue2 版本发布,Vue2版前端UI专项升级
    B. AND Sequences
    3倍通气的医用外科口罩,佩戴舒适过滤不打折
    函数式编程:一等函数(First-class Function)
  • 原文地址:https://blog.csdn.net/lei7143/article/details/126053663