程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 使用GDB調試Android NDK native(C/C++)程序

使用GDB調試Android NDK native(C/C++)程序

編輯:C++入門知識

先說明下,這裡所謂的ndk native程序跟Android上層java應用沒有什麼關系,也不需要涉及jni來封裝native接口,通俗來講,就是把編譯好的純C/C++程序,push到Android設備或者仿真器上,然後在設備上運行該程序。而調試則是通過attach到gdbserver來實現。推薦在Ubuntu或者mac osx下來進行,windows下要安裝cygwin來模擬posix環境,速度很慢的說。具體操作如下:


0. 准備工作
首先確保機器上已經有Android開發環境,比如下載了Android SDK以及NDK包,配置了相關環境變量,啟動了Android設備或者仿真器等等。當然你也需要編譯生成了帶有調試Symbol的Native程序,我是用NDK下的gcc編譯器通過自己配置編譯環境來進行編譯的,當然你也可以直接使用ndk-build。


1. 在設備上部署gdbserver
所謂部署其實就是把android ndk下的gdbserver拷貝到設備上,可以通過如下命令
adb push $ANDROID_NDK_ROOT/prebuilt/android-arm/gdbserver/gdbserver /data


2. 在設備上部署你的Native程序
需要把你編譯出的程序和相關so庫部署到設備上,注意so庫要放在/system/lib下,/system路徑默認是只讀的,可以通過adb remount來重置。
adb push ./myapp /data/data
adb push ./libmylib.so /system/lib


3. 把設備上的相關調試環境拷貝到本地
因為遠程調試需要一些目標機的庫,把如下文件拷貝到本地文件夾
adb pull /system/lib ./debugging/lib
adb pull /system/bin/linker ./debugging/lib


4. 在設備上通過gdbserver運行你的程序
adb shell gdbserver :12345 /data/data/myapp


5. 在本地把本地TCP端口forward到設備的TCP端口
adb forward tcp:12345 tcp:12345


6. 在本地運行Android ndk路徑下的gdb程序
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuild/darwin-x86/bin/arm-linux-androideabi-gdb
這裡注意如果你在Ubuntu下用的是Linux的NDK包,那路徑會有點不同,darwin-x86的地方應該是linux-x86.最保險的還是自己在NDK下搜索。


7. 啟動gdb後在gdb下設置solib搜索路徑
就是讓gdb運行時能夠找到調試相關的那些lib,也就是那些第三步中從設備上拉下來的文件。
(gdb) set solib-search-path ./debugging/lib


8. 在gdb下設置你希望調試的Native程序
(gdb) file ./myapp


9. 連接到設備的gdbserver
(gdb) target remote :12345
上面的6~9步也可以通過如下命令一步執行完
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuild/darwin-x86/bin/arm-linux-androideabi-gdb --eval-command="set solib-search-path ./debugging/lib"  --eval-command="file  ./myapp" --eval-command="target remote :12345"


10. 開始調試
通過continue或c運行程序。注意不是用run,因為程序在目標機上其實已經啟動了,只是break在程序入口。


本文不會討論gdb調試命令的具體用法,相關文章網上應該很多,或許後續會寫篇使用gdb的心得體會。另外也可以把編譯和調試命令配置到一些通用IDE中更方便使用,比如eclipse,codeblocks等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved