目录
pthread 经典 和Mutex
POSIX 线程详解(经典必看) - sunminmin2011 - 博客园
Mutex类使用Futex实现同步_u013234805的专栏-CSDN博客___futex_wait_ex
Linux Futex浅析_MiTuShuTong11的博客-CSDN博客
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