一.调试工具:
gdb + gdbserver 远程调试
文件形式:
ELF 可执行文件
JNI .so
二.gdbserver
ELF可执行文件:
gdbserver :1111 ./test
1111 为监听的端口号
test 为可执行文件名
JNI .so
gdbserver :1111 --attach PID
1111 为监听的端口号
PID 为进程号
三.gdb
target remote 192.168.105.76:1111
192.168.105.76为Android机器的ip
1111 Android机器gdbserver监听的端口号
四.准备工作(1):
1、Linux系统环境,比如ubuntu 18.04。
2、下载NDK,并将下载的NDK解压到Linux系统下。下载链接:https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip?hl=zh_cn
注意:
一定要是r10e这个版本的NDK,因为官网上能下载到的NDK,只有这个版本还有aarch64-linux-android-gdb/ arm-linux-androideabi-gdb
aarch64-linux-android-gdb 用于调试Android aarch64平台代码,位于android-ndk-r10e-linux-x86_64/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin目录下
arm-linux-androideabi-gdb 用于调试Android armv7平台代码,位于android-ndk-r10e-linux-x86_64/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin目录下
五.准备工作(2):
3、将下载的NDK中的gdbserver上传到Android设备
android-ndk-r10e-linux-x86_64/android-ndk-r10e/prebuilt/android-arm64/gdbserver (arm64)
android-ndk-r10e-linux-x86_64/android-ndk-r10e/prebuilt/android-arm/gdbserver (armv7)
4、准备带符号信息的ELF可执行文件或者JNI .so 以及相关的依赖库(比如libomp.so等)放在本地的一个文件夹下
查看是否带符号信息:readelf -S ./libfacula_sdk.so | grep debug
六.准备工作(3):
5、从Android设备提取所需要的.so文件:(用于加载符号信息)
以aarch64系统为例,新建文件夹比如 symbol/armv8等子目录,执行以下命令拉取Android系统的so文件:
adb pull /system/lib64 ~/symbol/armv8/system_lib/
adb pull /vendor/lib64 ~/symbol/armv8/vendor_lib/
adb pull /system/framework/oat ~/symbol/armv8/frame_lib/oat/
adb pull /system/framework/arm64 ~/symbol/armv8/frame_lib/arm64/
注意:
Android aarch64存在/system/lib 和/system/lib64两个目录,分别对应32和64位程序,注意别弄错了。
七.正式调试:(程序均为演示,非实际bug)
set solib-search-path ~/symbol/armv8/:~/symbol/armv8/system_lib/lib64/:~/symbol/armv8/vendor_lib/lib64/:~/symbol/armv8/frame_lib/arm64/arm64/:~/symbol/armv8/vendor_lib/lib64/egl/:~/symbol/armv8/vendor_lib/lib64/hw/:~/symbol/armv8/frame_lib/oat/arm64/:~/Desktop/facula_symbol/
橙色的为从Android系统拉取下来的so,绿色的为自己编译的带符号的so.
八.查看所有线程信息.
thread apply all bt












网友评论