How to use gdb (in Emacs) for android

1 gdbserver

首先,需要在phone上用adb上启动gdbserver,这个用我写的增强版adb可以这样:

adb gdbserver -p mediaserver

它会自动找到mediaserver进程的pid(如果有多于一个mediaserver进程,它会让 你选——但这对mediaserver这样的进程没什么意义)。然后attach上,并在phone 和PC的:3333 tcp端口开始监听gdb的连接。PC这端是通过调用adb forward实现的。

2 agdb

通过我写的增强版agdb/agud的脚本,可以简单地在Emacs底下打 M-x gud-gdb 来调用,需要手动输入的命令是 agud mediaser ,同样,它会自动切换到 android 代码的根目录下,并在 ./out/target/product/$TARGET_PRODUCT/symbols/system/bin 下找到 mediaserver 这个文件,最后真正启动的命令是:

/home/bhj/src/android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb -f -x /tmp/gdbclient.cmds ./out/target/product/pxa986ff/symbols/system/bin/mediaserver

gdb初始化执行的脚本 /.cache/gdbclient.cmds 的内容是这样的:

set solib-absolute-prefix /home/bhj/src/android/out/target/product/pxa986ff/symbols
set solib-search-path /home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/bluez-plugin/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/drm/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/egl/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/hw/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/PowerDaemon/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/soundfx/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/ssl/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/lib/valgrind/:/home/bhj/src/android/out/target/product/pxa986ff/symbols/system/usr/lib/alsa-lib
target remote localhost:3333
#dir /home/bhj/src/android

3 compilation-minor-mode

这里我们用的是gud,而不是Emacs下支持多窗口的gdb,是因为我发现后者不太稳 定,性能也比较弱些。gud的bt列出来的文件不支持跳转,我们可以用 compilation-minor-mode 加上这个支持:

gud-cmm.png

为了来回切换方便,我们把这个命令绑一个快捷键:

(global-set-key (kbd "M-s x") 'compilation-minor-mode)

所有增强脚本见我的配置环境