addr2line分析native、kernel异常命令

2022-02-04  本文已影响0人  锄禾豆

简介

在抓取调堆栈时Java层的堆栈本身就是显示函数名与行数,而对于native和kernel层的则是函数地址,需要借助addr2line来进行转换,因为addr2line可以将函数地址解析为函数名。

查看系统32位或64位方法

adb shell getprop ro.product.cpu.abi

32位
armeabi-v7a

64位
arm64-v8a

Native地址转换
从系统对应源码中找到对应的addr2line及so

64位:

cd prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
./aarch64-linux-android-addr2line -f -C -e libxxx.so  <addr1> <addr2> ...

32w位:

cd /prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
./arm-linux-androideabi-addr2line -f -C -e libxxx.so  <addr1> <addr2> ...

Kernel地址转换
注:
一定要找对应的系统可执行文件和vmlinux

1)获取函数名的符号地址,以el1_da为例

64位:
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-gnu-6.3.1/bin/aarch64-linux-gnu-nm out/target/product/tb8788p1_64_wifi/obj/KERNEL_OBJ/vmlinux | grep el1_da

结果:
ffffff80080832ac t el1_da

32位:
prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-nm  out/target/product/iot_1_item/obj/KERNEL_OBJ/vmlinux | grep el1_da

2)计算地址。
例如:[<ffffff9d17e832d0>] el1_da+0x24/0x3c
则计算后的地址ffffff80080832ac + 24 = 目标地址

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -Cfe out/target/product/tb8788p1_64_wifi/obj/KERNEL_OBJ/vmlinux FFFFFF80080832D0

结果:
el1_ia
kernel-4.14/arch/arm64/kernel/entry.S:606

参考学习

https://www.jianshu.com/p/c2e2b8f8ea0d
http://gityuan.com/2017/09/02/addr2line/
上一篇下一篇

猜你喜欢

热点阅读