1. 程式人生 > >Ubuntu下使用gdb遠端除錯android native程式筆記

Ubuntu下使用gdb遠端除錯android native程式筆記

使用gdb遠端除錯android native程式

1.準備工作:

android native程式:demo

android 上執行的除錯工具:gdbserver,該程式位於ndk目錄/prebuilt/android-arm/gdbserver/gdbserver

pc上的除錯工具:gdb,該程式位於ndk目錄/prebuilt/linux-x86_64/bin/gdb

2.編譯native程式

新增編譯選項-g 

去掉編譯選項strip

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -g -O3 -fvisibility=hidden

LOCAL_MODULE := hello

LOCAL_SRC_FILES := main.c \

       kernelMsgParser.c \

       socketserver.c\

       utils.c \

       recvkernel.c

#cmd-strip = $(TOOLCHAIN_PREFIX)strip $1

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lz -llog

#include $(BUILD_SHARED_LIBRARY)

include $(BUILD_EXECUTABLE)

3.在裝置上部署gdbserver

將android ndk下的gdbserver拷貝到裝置上,可以通過如下命令

adb push gdbserver /data/local/tmp

4.在裝置上部署你的Native程式

把你編譯出的程式和相關so庫部署到裝置上,注意,如果有自定義so庫,so庫要放在/system/lib下,/system路徑預設是隻讀的,可以通過adb remount來重置。

adb push ./hello /data/local/tmp

adb push ./libmylib.so /system/lib

5.把裝置上的相關除錯環境拷貝到本地

因為遠端除錯需要一些目標機的庫,把如下檔案拷貝到本地資料夾

adb pull /system/lib ./debugging/lib

adb pull /system/bin/linker ./debugging/lib

6.在裝置上通過gdbserver執行你的程式

adb shell

gdbserver IP:12345 /data/hello

7.在本地把本地TCP埠forward到裝置的TCP埠

adb forward tcp:12345 tcp:12345

8.在本地執行Android ndk路徑下的gdb程式

注意,這裡的gdb-test的位置非常重要,因為你可以看到在libs與obj都有hello,為了保證符號表

能成功進行載入,這裡必須使用在obj下的hello,因為libs中生成的始終是去掉符號表的,只有objs中的才是真正可除錯的。

9.啟動gdb後在gdb下設定solib搜尋路徑

就是讓gdb執行時能夠找到除錯相關的那些lib,也就是那些第三步中從裝置上拉下來的檔案。

(gdb) set solib-search-path ./debugging/lib

10.在gdb下設定你希望除錯的Native程式

(gdb) file ./demo

11.連線到裝置的gdbserver

(gdb) target remote IP:12345

12.開始除錯

通過continue或c執行程式。注意不是用run,因為程式在目標機上其實已經啟動了,只是break在程式入口。

設定幾個斷點,然後單步執行【3】。

常用斷點設定方法如下:

break 函式名

break 行號

break 檔名:行號

break 檔名:函式名

break +偏移量

break -偏移量

break  *地址

info b斷點資訊

注:出現readchar:Got EOF錯誤,說明gdbserver與arm-xx-gdb版本不匹配,嘗試不同版本的gdbserver即可。

13.最後效果如圖:

Android端:

PC端:

參考