文件格式
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
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"
#!/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"
#
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' | 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"