最近在看android上的C++的代码,有时候需要用到调试功能跟踪一些问题。以前做开发的基本都是运行在HOST上的,可以用IED的debuger直接Debug,很多问题在Debug的时候直接就可以看到了。现在没办法用IDE,在那个命令行中进行调试,其中的味道我想正在经历或是曾经经历的大全高手们都知道。。。。。。
闲话少说,咱进入正题。
要想用Eclipse调试Android上的C或是C++代码,首先要准备几样东西。
1、用Eclipse调用C,Eclipse当然是最重要的,CDT也是必不可少的,不然可没办法支持C或是C++的代码。所以呢。。。当然是Eclipse的CDT插件了,一定要把其中的Debuger安装上啊。
2、调试Android上的C代码,这个SDK和NDK肯定是必不可少的;当然,如果你有完整的android代码这两个东东可以不管。
3、。。。好像没有三了,嘿嘿。。。。
接下来,我们就要开始配置了
1、编译对你的C或是C++代码(如果只是一个小工程可以放到Eclipse中去编译)。如果是完整的Anroid代码,直接make -j4。
2、在Eclipse中新建一个C或C++的工程,把你的代码放到这个工程中。如果是完整的Android代码,可以选择从已有代码新建C++工程(1中编译出来的out目录也要加进来)。
3、新建一个C++远程调试工程。
4、配置这个C++远程调试工程。
4.1、设置调试应用,在android中,绝大多数情况这个应用选择app_process。如果是完整的android代码编译出来的,这个文件在out/target/product/generic/symbols/system/app下。
4.2、设置调试的C++工程。
4.3、设置GDB程序。android需要选择arm-eabi-gdb
4.4、若是不是用Eclipse进行编译的,把你的代码编译出来的共享库加进来。若是完整的Android的代码编译出来的,这些文件在out/target/product/generic/symbols/system/lib下,当然,这个目录下的子目录也需要加进来(如果你确定只调试某一个LIB,也可以只加那一个)。
4.5、设置远程调试的连接信息。
调试工程也配置完成了。
接下来就基本可以开始调试了。
1、启动Android设备,并打开设备的USB调试功能。
2、启动需要调试的应用,打开对应的Activity,或是通过对应的方式**。只要这个进程存在就行,可以不在页面上。
3、用adb shell ps查看这个应用的进程号。 用这个时得搞清楚你的这些代码会跑在哪个进程中,如果不知道那就没办法进行调试了。
4、用adb forward tcp:5039 tcp:5039 把设备上的端口与主机上的端口连接起来。后两个参数是可变化的,只是一般都用的5039。第一个TCP:5039表示在主机上建立一个监听,监听端口是5039;第二个TCP:5039表示在设备上有一个监听,监听的是TCP的5039端口。我们发送到主机的5039端口的数据会被ADB发送到设备的5039端口上。第一个TCP:后的端口号必需与Eclipse中连接设置中的端口相同。
5、adb shell gdbserver --remote-debug :5039 --attach $PID 来启动GDBSEVER, PID就是3中看到的进程号。这里--remote-deubg跟的是端口号,这个号码号必需与adb forward命令中的第二个端口号相同,这里表示gdbserver启动一个TCP监听,这个监听的端口为5039
6、启动Eclipse上的设置好的C++调试工程。 Run --> Debug Hostory --> $你设置的调试工程的名称
7、开始进行调试。后面的操作与调试本地代码没有区别,就是有时反应会比本地点。
到了这里算是完了。最后就说说我对用于远程连接的几个设置或是命令的理解吧。
先来说说Eclipse上的那个连接设置,这里没太多,就是说启动远程调试的时候连接到哪个地方的信息。
然后是adb forward命令,看命令的意思就知道,它的功能就是一个转发,第一个参数设定的端口收到的数据转发到第二个参数指定的在设备上的端口,这里会建立一个监听,但是没有连接。
最后gdbserver,这里就是建议一个监听,所有的调试命令都会走这里监听的端口。
在启动调试的时候的流程就是:Eclipse建议一个连接,连接到本地指定的端口(设置为5039);因为5039是ADB在监听,而我们又设置的转发,所以ADB就连接到设备上的5039端口,并通知开始调试,设备上的5039端口上gdbserver在监听,所以接收到的就是gdbserver,它会根据接收到的命令进行相应的处理。
说了这么多,自己感觉有点晕,不知道说清楚了没有,以前没有写过这些东东。各位路过飞过的大侠们,帮忙斧正下啊…………