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 shellgdbserver 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端: