本文描述使用AOSP进行调试的环境配置,最终达到源码级调试目标。
这步是获取特定于设备的项目,这些项目是配置环境所需要的,至于需要git那些项目根据设备不同而不同,项目目录存在于{source-path}/device/{device-name}/,例如,我们的环境目录为/Android/android_442/device/lge/,命令如下:
问题:需要git那些项目呢?这些项目是做什么的?在我编译后的4.4.2真机中没有git任何项目,在调试过程中还未发现问题,希望后面遇到问题后再补充。
获取项目完成后,通过下载build/envsetup.sh脚本并执行lunch目录来配置和初始化AOSP生成环境,命令如下: 注:如果不执行这步骤的话,将影响后续“链接GDB客户端”步骤,会出现下面异常提示:
AOSP的prebuilts目录中包含了调试所需的gdbserver二进制文件,只需通过命令拷贝到设备上即可,目录如下:
如果使用USB,需要ADB的端口转发功能为GDB客户端打开一个管道,命令如下:
adb forward tcp:31337 tcp:31337可以使用带有start参数的am命令来启动目标进程,也可以手动直接打开。
以mediaserver进程为例,通过下面命令:
退出ADB shell 使用附加模式启动gdbserver,命令如下:
$ adb shell su -c /data/local/tmp/gdbserver --attach tcp:31337 2194启动后通过Control-Z组合键挂起该进程,然后通过bg命令将adb进程转到后台运行。
直接使用命令:
$ arm-eabi-gdb -q通过编译AOSP支持的设备源代码,大部分符号信息文件会与发布版本文件同时生成。但由于包含符号的二进制文件非常大,如果直接将其刷入设备,会很快耗尽系统的可用内存空间。因此在远程调试时,可以将这些带有符号的大文件与运行在设备上的无符号二进制文件配合使用。
除了编译生成一个完整的设备镜像,也可以通过mmm和mm命令来单独编译需要的组件,编译系统会将包含符号文件写入out/target/product/{build-number}/symbols目录下。
gdbclient、ndk-gdb和直接使用GDB三种方式都需要加载获取的符号来改进调试体验,但三种方法加载符号方式各不同,这里讲述gdbclient和直接使用GDB的方法及优缺点。
gdbclient会自动使用编译生成的符号。Gdbclient通过Android编译系统获取生成的符号并指示GDB客户端在其中查找。但gdbclient会默认使用生成的几乎所有模块符号,所以这个过程非常慢,而且大部分情况下,完全没有必要为所有模块加载符号。
所以,直接调用AOSP GDB客户端是调试原生代码的首选方法。此方法能够最大化的控制目标设备和GDB客户端自身的情况,同时调试不同的项目时,也可以支持管理项目的特定的配置。
要搭建项目特定的最佳调试环境的步骤如下:
创建存放项目相关数据的目录:
为想要加载的符号的模块创建符号链接,为了加快加载过程,应该只为有限的需要的模块加载符号:
其中,包含了核心模块libstagefright.so、libstdc++.so和libdvm.so(Dalvik VM)。
创建GDB脚本: 这个命令告诉GDB客户端在当前目录下查找符号文件。在新建的符号目录进行attach服务器目标进程,即可实现源码级调试。这里以mediaserver进程调试为例:
$ arm-eabi-gdb -q -x script.gdb app_process
