工具準(zhǔn)備
- 下載ndk
- 將gdbserver push到手機(jī),如果目標(biāo)進(jìn)程是64位的則push 64位的gdbserver
adb push android-ndk-r14b/prebuilt/android-arm/gdbserver/gdbserver /data/local/tmp/
編寫目標(biāo)程序
創(chuàng)建 assembler工程

assembler工程
// Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -Wall -Wno-error -O -fPIE -pie
LOCAL_LDFLAGS += -pie -fPIE
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES:= test.cpp
LOCAL_MODULE:= test
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
include $(BUILD_EXECUTABLE)
// Application.mk
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-10
// test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#define LOG_TAG "TEST"
#define debug(fmt, args...) do {__android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args);} while(0)
int function(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
printf("a %d\n", a);
debug("%d\n", b);
return a+b+c+d+e+f+g+h+i+j;
// return i+j;
}
int main(int argc, char *argv[]) {
int r = function(1,2,3,4,5,6,7,8,9,10);
printf("%d\n", r);
return 0;
}
然后編譯生成test可執(zhí)行文件
~/work/android-ndk-r14b/ndk-build -C .

編譯
- 將目標(biāo)可執(zhí)行程序拷貝到手機(jī)
adb push test /data/local/tmp/
開始GDB
- gdbserver啟動(dòng)目標(biāo)進(jìn)程并監(jiān)聽端口
adb1 shell gdbserver :23946 /data/local/tmp/test

開始監(jiān)聽
如果是進(jìn)程已經(jīng)存在,再去 attach則
adb shell gdbserver :23946 –attach [PID]
可以看到進(jìn)程test啟動(dòng)了,pid位19879
- 在host機(jī)上運(yùn)行g(shù)db
android-ndk-r14b/prebuilt/linux-x86_64/bin/gdb
- 鏈接上目標(biāo)端口
(gdb) target remote 127.0.0.1:23946
- 設(shè)置gdb屬性
(gdb) set disassemble-next on(顯示匯編代碼)
(gdb) set step-mode on(打開單步調(diào)試)
-找到需要打斷點(diǎn)的地方
先找到目標(biāo)進(jìn)程test(23946)的段基址
adb shell cat /proc/19879/maps
獲取段基址
段基址為0xaaaaa000,還要找到關(guān)心地址偏移,可以用ida反編譯打開看
獲取偏移地址
最后斷點(diǎn)的地址 = 段基址 + 偏移 = 0xaaaaa000 + 0x0000065C
(gdb) b *0xaaaaa65c
(gdb) c
然后就可以看到斷點(diǎn)斷在了0xaaaaa65c,繼續(xù)n,下一步調(diào)試
斷點(diǎn)調(diào)試
可以通過 layout reg打開寄存器窗口
寄存器窗口