栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

NE 和 KE 堆栈脚本解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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"


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号