簡介
gdb 強大的動態調試工具, 是一款命令行形式的界面展示,一切的運行皆需要通過指令敲入。
環境配置
vm-ubuntu2004 虛擬機
Android ndk (r22) 下載地址
gdb
gdb插件gef github地址
Android root 真機
GDB調試
ndk中找到gdbserver (android-ndk-r22/prebuilt/架構/)
我這邊選擇arm架構
將gdbserver 傳入手機中
adb push gdbserver data/local/tmp
賦予root權限
chmod 777 gdbserver
運行gdbserver 和需要調試的文件
./gdbserver :11254 ./arm (arm是我自己編寫的調試文件,后面會說到)
端口轉發 adb forward tcp:11254 tcp:11254
這邊在控制臺,輸入gdb, 然后輸入遠程連接指令target remote localhost:11254
報錯了
經過排查,是架構有點不匹配的問題,解決方案,使用gdb-multiarch來調試, 按q退出當前的輸入環境
輸入gdb-multiarch
遠程連接上
圖中r0-cpsr是寄存器,:后面是 他們存放的值的地址
下面0xffffefa90--0xffffefaac 存放的一些數據地址
帶箭頭的->0xf772eda4 是當前運行到的位置
輸入ni 執行下一步
通過觀察各個寄存器的地址的變化,來分析我們的所需
輸入 b +地址,可以設置斷點,
對于一些指令后續再補
arm文件編寫
首選配置下clang
下載的ndk中有clang 目錄android-ndk-r22/toolchains/llvm/prebuilt/linux-x86_64/bin/clang
把clang的地址加到環境變量中, export PATH="/home/user/myfile/android-ndk-r22/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH"
我這邊系統是64位的
編寫arm,c文件
#include <stdio.h>
#define ARM "armv7a*"
int main(int argc, char const *argv[]){
printf("hello %s\n", ARM);
return 0;
}
用clang把它編譯成可執行文件
- 預編譯 clang -target arm-linux-android22 -E arm.c -o arm.i
- 編譯 clang -target arm-linux-android22 -S arm.i -o arm.s
- 匯編 clang -target arm-linux-android22 -c arm.s -o arm.o
- 鏈接 clang -target arm-linux-android22 arm.o -o arm
這時候arm文件就生成了
把arm文件導入Android時,需要賦予執行權限 chmod +x arm