安卓* 系统级 Java*/C++ 代码调试(二)

2014-11-24 01:34:11 · 作者: · 浏览: 1
路径

现在您将在编辑器窗口中看到 Java 代码。

\图 15. 安卓项目调试工具

我们现在可以设置断点,并对安卓系统级 Java 代码进行调试。

3.2 调试安卓内建应用

安卓系统内建了许多应用(即所谓的系统应用),例如 Calendar、Settings、Gallery 等。这些项目位于安卓代码库中,并使用 system.img 进行构建。要调试 them ,我们需要为其创建 pseudo(伪) 项目,就像 system_process。 您需要将软件包名称更改为应用名称,而不是输入“system_process”。

\
图 16. 安卓应用软件包名称

然后转至 DDMS,选择“com.android.calendar”进程,并点击“debug”按钮。

\
图 17. 选择要调试的应用

\
图 18. 安卓应用调试工具

4 调试安卓系统 C/C++ 代码

4.1 调试 system_process

我们通常可以使用 gdbserver/gdb 来调试安卓原生 C/C++ 代码。 也就是说,使用 gdbserver 连接至正在运行的进程,然后使用 gdb 进行远程调试。 但是,system_ process 是由 zygote 在系统启动时创建,我们在连接前初始化已经完成。 要从一开始调试 system_process,我们要使用安卓调试实用程序,强迫 system_process 在开始的时候进入一个无限循环,以便我们能够尽早地建立连接。 然后,我们会使 system_process 退出无限循环并继续运行。

4.1.1 创建 C/C++ 项目

我们可以创建一个新的 C/C++ 项目。 此外,我们还可以将现有的安卓项目“system_process”转化为 C/C++ 项目。 点击“File->New->Convert to a C/C++ Project (Adds C/C++ Nature)”,选择 system_process 项目:

\
图 19. 将安卓项目转化为 C/C++ 项目

4.1.2 创建调试配置

转至“Debug”视图,点击“调试按钮->Debug Configurations”,创建一个 C/C++ 远程应用调试配置,输入 app_process 二进制的名称,并禁用自动构建功能。

\
图 20. 将应用映像设置为调试

转至安卓调试实用程序所在的目录,编辑 gdb 初始化脚本 sdk_x86_gdb.setup,用您的安卓根目录和设备名称来替换 $android 和 $__board,以便使 gdb 判别正确的符号文件目录:

shell echo set solib-absolute-prefix $android/out/target/product/$__board/symbols > 
tmp.gdb
shell              echo                   set                     solib-search-path 
$android/out/target/product/$__board/symbols/system/lib:$android/out/target/product/$
__board/symbols/system/lib/hw:$android/out/target/product/$__board/symbols/system/li
b/egl:$android/out/target/product/$__board/symbols/system/lib/soundfx:$android/out/tar
get/product/$__board/symbols/system/lib/bluez-plugin:$android/out/target/product/$__b
oard/symbols/system/vendor/lib/egl:$android/out/target/product/$__board/symbols/syste
m/vendor/lib/hw:$android/out/target/product/$__board/symbols/system/vendor/lib:$andr
oid/out/target/product/$__board/symbols/system/lib/parameter-framework-plugins/Audio:
$android/out/target/product/$__board/symbols/system/lib/soundfx:$android/out/target/p
roduct/$__board/symbols/system/usr/lib/alsa-lib >> tmp.gdb 
source tmp.gdb

或者在启动 Eclipse 之前导出两个环境变量:

$ export android=
$ export __board=

点击“Debugger”选项卡,输入 sdk_x86_gdb.setup 的路径:

\
图 21. 设置 gdb 初始化脚本

点击“Connection”选项卡,将端口号改为 1234。

\
图 22. 设置 gdb 调试端口

4.1.3 调试 system_process

启动安卓设备,并使用 USB 线缆将其连接至主机。 重启 system_process,并使用 gdbserver 进行连接:

$ cd ~/android-sdk/android-debug-utility/target
$ ./start_system_server.sh
zygote:115
killall: gdbserver: no process killed
killall: gdb: no process killed
/lib/gdbserver: No such file or directory
mkdir failed for /lib, File exists
push: ./lib/ld-linux.so.2 -> /lib/ld-linux.so.2
push: ./lib/system_server -> /lib/system_server
push: ./lib/libthread_db.so.1 -> /lib/libthread_db.so.1
push: ./lib/libpthread.so.0 -> /lib/libpthread.so.0
push: ./lib/libc.so.6 -> /lib/libc.so.6
push: ./lib/libreadline.so.5.2 -> /lib/libreadline.so.5.2
push: ./lib/libreadline.so.6 -> /lib/libreadline.so.6
push: ./lib/gdb -> /lib/gdb
push: ./lib/libdl.so.2 -> /lib/libdl.so.2
push: ./lib/app -> /lib/app
push: ./lib/libz.so.1 -> /lib/libz.so.1
push: ./lib/libm.so.6 -> /lib/libm.so.6
push: ./lib/libutil.so.1 -> /lib/libutil.so.1
push: ./lib/libexpat.so.1 -> /lib/libexpat.so.1
push: ./lib/libpython2.6.so.1.0 -> /lib/libpython2.6.so.1.0
push: ./lib/libcrypto.so.0.9.8 ->