ndk學習6: 使用gdb調試ndk程序一



生成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.如果你的工程的ABIarmeabi-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命令退出調試

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM