准备工作:
1、ubuntu系统安装adb工具;
2、ubuntu安装android开发源码;
3、设备上烧写userdebug rom(一般自带gdbserver,如果没有,需要编译一个进去);
调试步骤:
1) 启动要调试的程序
直接在调试设备上点击你要启动程序的图标,就可以让程序跑起来了。
光跑起来还不行,还需要知道这个程序在系统中当前的进程号是多少。可以在调试设备的adb shell上,通过下面的命令查到:
ps | grep <PackageName>
其中, PackageName 就是你要调试程序对应的包名,例如:
可以看到,对于本例来说,其进程号是8143。
2) 启动GDB服务器端
在调试Android设备上启动gdbserver,并让其attach到前一步运行的那个要调试的进程上去。命令如下:
gdbserver :<PORT>--attach:<PID>
这个命令必须要用root用户来执行。命令中的PID参数就是前一步查看到的被调试进程号。由于要采用GDB远程调试模式,所以要让gdbserver打开一个端口,这里的PORT参数就是指定要打开哪个端口进行监听。
还是接着上面的例子,假设打开端口号是 1234 ,并且从上一步查看到的进程号是 8143 ,则结果是:
对了,还有一点需要注意的是,Android从4.4开始,强制打开了SELinux,其规则是不允许一个进程attach到一个非自己的子进程或兄弟进程上进行调试的,哪怕这个进程是以root用户启动的也不行。想要知道当前SELinux的工作模式,可以在adb shell下键入getenforce命令,例如:
这是在我运行Android 5.0系统的Google Nexus 5上运行的结果,可以看出,其已经默认打开了强制(Enforcing)模式。所以,要想调试成功,必须要关闭SELinux的强制模式,可以通过下面的命令来关闭:
echo 0> /sys/fs/selinux/enforce
注意,这条命令必须用root用户来运行。下面看看运行后的结果:
可以看出,SELinux的模式已经从强制变成了允许(Permissive)。
3)建立PC和Android设备间的端口转发
前面的命令已经让gdbserver在Android设备上打开了一个端口,监听远端GDB的调试命令。不过,这个监听端口只在Android设备上有效,在PC端根本访问不到。这时候,需要用adb将Android设备上的端口转发到PC机上。请在PC上再打开一个控制台,并键入如下命令:
adb forward tcp:<PC_PORT>tcp:<DEVICE_PORT>
这条命令的作用就是将发往PC机上端口为PC_PORT的TCP报文,发送到Android设备上DEVICE_PORT端口上。
假设还是想在PC上打开1234端口,映射到上一步在设备上打开的1234端口:
4)启动GDB客户端
GDB的客户端启动非常简单,只要在命令行下或者Cygwin下执行NDK中自带的gdb程序就可以了:
接下来,就要让这个在PC上的GDB客户端,连接上在Android设备上的GDB服务器了,命令如下:
(gdb) target remote localhost:<PORT>
其中,参数PORT就是在第三步中,在PC上建立的转发端口。对于前面的例子,就是:
这时,在gdbserver端就会显示:
这就表示GDB客户端与服务端已经连接成功了。
设置android符号表
<gdb> set solib-absolute-prefix /home/wangyj/android_samsung_4.0/android_4.0.3_samsung_dev/out/target/product/smdkc110/symbols/
<gdb>set solib-search-path /home/wangyj/android_samsung_4.0/android_4.0.3_samsung_dev/out/target/product/smdkc110/symbols/system/lib
经过以上四个步骤之后,就可以在PC端使用常用的GDB命令,对Android设备上指定的程序进行调试了。
补充:使用gdbclient方便调试的方法,转自:http://blog.youkuaiyun.com/zero9988/article/details/51325872
二:gdbclient与gdb
1,在源码目录执行:
1-1,source build/envsetup.sh
1-2,lunch full-eng
2,类似上面的gdbserver的启动和adb forward的端口映射
3,启动gdbclient
gdbclient dex2oat :1234
4,设置断点,开始调试
envsetup.sh中关于gdbclient的源代码
Ps,1,通过脚本方便调试:
source XXXX
XXXX: