生成debug版程序
方法一:
使用ndk-build編譯時,加上如下參數NDK_DEBUG=1,之后生成so文件之外,還會生成gdbobserver,gdb.setup調式文件
方法二:
修改AndroidManifest.xml文件,增加debuggable屬性為true
<application android:debuggable="true" ...
Eclipse報錯則在錯誤信息上點右鍵 Quickly fix 忽略掉錯誤即可
編譯之后會生成和調試相關的文件如下:
libs目錄下的gdbserver需要拷貝到虛擬機
gdb.setup是設置和符號相關的路徑
obj下面的Hello是符號相關的路徑
方法三:
在application.mk中加入
APP_OPTIM := debug
NDK_DEBUG = 1
只會生成調試的符號文件,對應版本的gdbsever還需要自己從ndk中拿出來
啟動調試
我們以x86的模擬器作為調試目標,首先編譯x86版本的可執行文件
在工程目錄下新建一個makefile文件
編寫調試腳本如下:
MODALE_NAME := Hello
# x86 path
X86_TOOLS_PATH :=E:\Android\android-ndk-r10b\toolchains\x86-4.6\prebuilt\windows-x86_64\bin
X86_GDB_PATH := $(X86_TOOLS_PATH)\i686-linux-android-gdb.exe
X86_GDB_SERVER := E:\Android\android-ndk-r10b\prebuilt\android-x86\gdbserver\gdbserver
run_x86:
adb push .\libs\x86\$(MODALE_NAME) /data/local/tmp
adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)
adb shell /data/local/tmp/$(MODALE_NAME)
debug_x86:
adb forward tcp:12345 tcp:12345
adb push $(X86_GDB_SERVER) /data/local/tmp
adb shell chmod 777 /data/local/tmp/gdbserver
adb push .\obj\local\x86\$(MODALE_NAME) /data/local/tmp
adb shell chmod 777 /data/local/tmp/$(MODALE_NAME)
adb shell /data/local/tmp/gdbserver :12345 /data/local/tmp/$(MODALE_NAME)
client_x86:
$(X86_GDB_PATH) .\obj\local\x86\$(MODALE_NAME)
# 1. target remote localhost:12345
# 2. gdb.setup
debug子過程:
大致的流程就是把gdbserver和debug版本程序拷貝到手機或者模擬器里面
給予可執行權限,然后用手機里面的gdbserver啟動程序 等待PC上的gdb連接
client子過程:
就是連接手機中的gdb開始調試
然后執行make debug 服務端即開始等待客戶端調試器的連接
出現Listen就對了
在換一個shell 輸入make client
進入gdb界面后輸入target remote localhost:12345
報錯:找不到動態鏈接庫,這是沒有設置gdb.setup的原因
解決方案:
將libs/x86目錄下的gdb.setup中的2行命令放到gdb(client)中執行就好
如下圖設置就好:
然后就可以開始調試了
注意:
1.如果模擬器是基於x86架構的 那么gdbserver也必須使用x86的
2.如果你的工程的ABI是armeabi-v7a, 那么libs目錄下的gdbserver也是armeabi-v7a的
GDB簡易使用
gdb命令比較多,簡單的介紹幾個常用的命令:
list(l) 用來查看代碼
break line_num(b) 用於對指定的代碼行下斷點
info breakpoint 用於查看斷點信息
run命令用於執行程序
next (n) 單步步過
step (s) 單步步入
continue (c) 執行到下一個斷點
print 查看變量的值
backtrace 函數棧信息
clear 刪除暫停處的斷點
delete 刪除一個斷點
info func 顯示函數信息
info local 顯示當前函數的局部變量信息
q命令退出調試