美文网首页
调试Android平台C++代码

调试Android平台C++代码

作者: 沪漂意哥哥 | 来源:发表于2022-02-25 19:11 被阅读0次

一.调试工具:

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

相关文章

网友评论

      本文标题:调试Android平台C++代码

      本文链接:https://www.haomeiwen.com/subject/csqfrrtx.html