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