简介
在抓取调堆栈时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/
网友评论