如何通过gdb/lldb快速调试Android原生ART运行时模块?求更高效方案
更优的ART调试方案
1. 用Android Studio Native调试功能一键搞定
不用手动替换库、转发端口,Android Studio能自动处理调试符号和进程连接:
- 确保AOSP构建时生成了带调试信息的ART库,模拟器使用自己编译的系统镜像
- 打开目标应用项目(比如日历),进入
Run > Edit Configurations,勾选对应应用配置的Debug native code - 在
Debugger > Native里指定AOSP源码路径~/android/aosp/,启动调试后直接设置断点(比如JNI_CreateJavaVM)就能调试
2. 换用LLDB(Android官方推荐工具)
LLDB比GDB更适配Android生态,操作更顺畅:
- 先按之前的步骤替换好带调试信息的libart
- 端口转发后启动主机端LLDB:
lldb platform select remote-android platform connect connect://localhost:2345 target create --symbols ~/android/aosp/out/target/product/generic_x86_64/symbols/system/lib/libart.so /system/lib/libart.so breakpoint set -n JNI_CreateJavaVM process continue - 也可以直接用
adb shell lldb-server启动调试服务,步骤更简化
3. 编译调试版系统镜像,省去重复替换libart
直接编译带调试信息的完整系统镜像,启动模拟器时自动加载调试版ART:
- 在AOSP源码目录执行:
make -j8 eng # eng版本默认带全量调试信息,包含ART的符号表 emulator -verbose -show-kernel # 启动编译好的调试版模拟器 - 后续调试不用再手动push替换libart,直接连接调试工具即可
4. 附加到已运行进程,不用重启应用
如果不想重启目标应用,可以直接附加到正在运行的进程:
- 先获取进程PID:
adb shell ps | grep com.android.calendar - 启动gdbserver附加到进程:
adb forward tcp:2345 tcp:2345 adb shell gdbserver :2345 --attach <进程PID> - 主机端连接后直接加载符号、设断点,省去重启应用的等待时间
5. 写GDB初始化脚本,减少重复输入
把常用的调试命令写到脚本里,启动GDB时自动执行:
- 创建
art_gdb_init.gdb文件:target remote :2345 dir ~/android/aosp/ b JNI_CreateJavaVM - 启动GDB时加载脚本:
gdb -x art_gdb_init.gdb
内容的提问来源于stack exchange,提问作者Zu Zhu
相关产品推荐
相关产品推荐

