fmute &hang_detect 与ARM 镜像

目录

pthread 经典 和Mutex

Hang_detect 检测到卡死

Kernel 堆栈转换

Native 堆栈转换

内核空间转换到用户空间

Kernel 堆栈转换

ARM之镜像文件/可执行文件/ELF文件/对象文件

进程线程关系


pthread 经典 和Mutex

POSIX 线程详解(经典必看) - sunminmin2011 - 博客园

Mutex类使用Futex实现同步_u013234805的专栏-CSDN博客___futex_wait_ex

Linux Futex浅析_MiTuShuTong11的博客-CSDN博客

Linux Futex浅析_阿里云基础设施_新浪博客

Hang_detect 检测到卡死

[232:hang_detect][Hang_Detect] hang_detect thread counts down -1:10, status 1. 

SYS_HANG_DETECT_RAW

对应的

RenderThread    S 302904.355312 4874 108958 163325 0x40404040 0x4000800 1299 94614554307938

<ffffff900808eb4c> __switch_to+0x32c/0x3c4

<ffffff900af42dbc> __schedule+0x1178/0x1bd8

<ffffff900af43944> schedule+0x128/0x19c

<ffffff90082cde20> futex_wait_queue_me+0x35c/0x530

<ffffff90082c7124> futex_wait+0x304/0x768

<ffffff90082c322c> do_futex+0x238/0x3e2c

<ffffff90082cb434> __arm64_sys_futex+0x32c/0x3cc

<ffffff90080cff88> oppo_invoke_syscall+0xe0/0x2ec

<ffffff90080b3b20> el0_svc_common+0xfc/0x224

<ffffff90080b39c0> el0_svc_handler+0xec/0x150

<ffffff9008085388> el0_svc+0x8/0xc

<ffffffffffffffff> 0xffffffffffffffff

RenderThread sysTid=4874, pid=1299

#0 pc 76960bc150

#1 pc 7696122088

#2 pc 76961216a8

#3 pc 7696095b54

#4 pc 76960b4f38

#5 pc 76960b4d54

#6 pc 76960a7b58

#7 pc 769608abb8

#8 pc 73f01ea764

#9 pc 73f01ed864

#10 pc 73f01ed944

#11 pc 73f01c8610

#12 pc 73f01e1020

#13 pc 73f01ccd90

#14 pc 73f01c99d0

#15 pc 73f01c5858

Kernel 堆栈转换

source/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line   -f -C -e  hang_detect/AEE_SYSTEM_HANG/vmlinux   ffffff900808eb4c  ffffff900af42dbc  .......

Native 堆栈转换

source/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line   -f -C -e     apex/com.android.runtime/lib64/bionic/libc.so   976A8   98088   32150

RenderThread sysTid=4874, pid=1299

#0 pc 76960bc150 32150

#1 pc 7696122088   98088  

#2 pc 76961216a8   976A8

#3 pc 7696095b54    BB54

#4 pc 76960b4f38   2AF38

#5 pc 76960b4d54   2AD54

#6 pc 76960a7b58    1DB58

#7 pc 769608abb8    BB8

769608a000-7696127000 r-xp    /apex/com.android.runtime/lib64/bionic/libc.so

#8 pc 73f01ea764   26764  

#9 pc 73f01ed864   29864   

#10 pc 73f01ed944    29944

#11 pc 73f01c8610   4610  

#12 pc 73f01e1020   1D020

#13 pc 73f01ccd90   8D90  

#14 pc 73f01c99d0   59D0

#15 pc 73f01c5858   0x1858

73f01c4000-73f01f0000 r-xp    /system/lib64/libfdtrack.so

ELF(so库)

读取so 库程序头(Program Headers)

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-readelf  apex/com.android.runtime/lib64/bionic/libc.so  -l -W

Flg R E第一个LOAD VirtAddr 地址为0x9a000计算相对地址

相对地址 = pc - (maps 起始地址 - so加载地址)

库加载LOAD VirtAddr  0x9a000

Libc.so maps 起始地址:769608a000

769608a000-7696127000 r-xp    /apex/com.android.runtime/lib64/bionic/libc.so

#7 pc 769608abb8    

以这个pc 为例子,相对地址 = 769608abb8 - (769608a000 - 0x9a000)=9aBB8

source/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line   -f -C -e  apex/com.android.runtime/lib64/bionic/libc.so  9aBB8 ....

gdb 加载NE coredump

set solib-search-path /var:/home

(gdb) set solib-absolute-prefix /        
(gdb) set sysroot /                    # sysroot是solib-absolute-prefix的别名

info sharedlibrary

prebuilts/gdb/linux-x86/bin/gdb    out/target/product/symbols/system/bin/init   ../../../../db.00.NE.dbg.DEC/PROCESS_COREDUMP

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-gnu-6.3.1/bin/aarch64-linux-gnu-gdb     out/target/product/symbols/system/bin/init    db.00.NE.dbg.DEC/PROCESS_COREDUMP

--gdb 命令下设置库加载路径:

set solib-absolute-prefix  /work/android/out_/target/product/symbols/

--gdb 命令下指定源码路径:

directory /work/source/

--gdb 命令下指定运行coredump

target core  /work/db.00.NE.dbg.DEC/PROCESS_COREDUMP 

内核空间转换到用户空间



Lauterbach TRACE32使用技巧记录 - DF11G - 博客园

1、查看KE 进程地址
task.dtask         ---命令列出进程列表,找到对应KE 进程地址
2、查看地址结构体
B::Var.View %Open %String (struct task_struct *)(NSD:0x0:0xFFFFFFC246703700) 
3、查看地址进程帧
B::Frame /Locals /Caller /Task 0xFFFFFFC246703700 /MODule 
4、从进程结构体mm 中找到pgb
5、mmu.info 0xFFFFFFC25FA47000   将pdg 从逻辑地址转换为物理地址
0x000000011FA47000
6、设置TTBR0
mmu 重启
7、mmu.off
     mmu.reset
     mmu.scan
     mmu.on
8、根据KE 进程符号表和堆栈地址找到对应的so 
task.dtask 0xFFFFFFC246703700

libc.so              7DA9CC5000
9、加载对应so
Data.LOAD.elf mobile_log_d    0x5E906E7000
Data.LOAD.elf  libc.so  0x7DA9CC5000
10、v.f 查看堆栈


 

Kernel 堆栈转换

从kernel 层堆栈来看RenderThread和ReferenceQueueD 形成互锁,从而卡在system_server发生hang_detect

具体java/native 层的锁,需要Native 堆栈转换来查看

系统调用syscall(__NR_futex

进程线程关系

Android进程系列第一篇---进程基础 - 简书

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值