Android native debug: 手動使用gdbserver遠程調試C代碼

通常用java作一個Android app,裏面夾雜着jni/*.c 所編譯出來的lib,是能夠經過gdb來調試的,也許大多數人都在按照網上各類幫助在使用,原理是比較古怪的:app裏被塞進去一個gdbserver程序!安裝後,會在該app的data目錄下出現gdbserver,而後eclipse活着什麼別的工具偷偷的啓動gdbserver,讓他調試改app進程,哦,是經過偵聽一個socket,以便讓PC端遠程發送命令。關於這個網上有很多原理敘述。java

可是有時候,就是開發一個和java無關的C程序放在android裏運行,要想調試,這麼簡單的需求,就不想被那些亂七八糟的束縛了,方法基本參照gdbserver標準方法,例如這個。 只是稍微結合一下Android和NDK。linux

大體以下:android

在ndk裏找到gdbserver, 例如shell

find /Applications/android-ndk -type f -name '*gdbserver*' |grep arm

結果app

 

/Applications/android-ndk/prebuilt/android-arm/gdbserver/gdbserver
/Applications/android-ndk/prebuilt/android-arm64/gdbserver/gdbserver

Android 5.0以前是第1行,以後是第2行。eclipse

把找到的gdbserver傳到Android上, 例如socket

adb push /Applications/android-ndk/prebuilt/android-arm/gdbserver/gdbserver /data/local/tmp/

啓動Android裏的gdbserver來打開目標C程序,例如a.outtcp

adb shell /data/local/tmp/gdbserver localhost:9999 /data/local/tmp/a.out 目標程序的命令行參數...

結果ide

Process /data/local/tmp/a.out created; pid = 16236
Listening on port 9999

把本地的9999端口映射到Android上以便之後的操做工具

adb forward tcp:9999 tcp:9999

至於gdb client,也是在NDK裏找出來

find /Applications/android-ndk -type f -name '*gdb' |grep arm

結果

/Applications/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb
/Applications/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb
/Applications/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb

就選最後一行好了。

啓動gdb client(固然在PC上)

/Applications/android-ndk//toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb ./a.out
target remote :9999

結果就不囉嗦了,就是個(gdb)提示符,等你輸入斷點命令(b)和繼續命令(cont)還有什麼顯示代碼命令(list)等等,直接在網上找找還快些。

至於如何簡單的編譯出Android下的C程序,能夠參照

拒絕ndk-build (Android Native Development Kit)

相關文章
相關標籤/搜索