通常用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程序,能夠參照