前言
首先我们要知道App的进程都是由zygote进程fork出来的。zygote进程启动的时候已经执行了ART虚拟机的初始化和启动的操作,而zygote进程又是由init进程fork出来的。因此如果你只是想调试虚拟机运行阶段,那就直接调试App进程,而如果想调试ART初始化和启动阶段。那就需要先关闭zygote服务,然后通过gdbserver detach到init进程调试,然后再启动zygote服务,最后才能进入到fork出来的zygote进程。当进入zygote进程后,你就可以开始调试ART虚拟机初始化和启动的过程了。下面我主要介绍会遇到的两个问题的解决方法:1. 如何关闭编译器优化?2. 如何关闭开启zygote服务进程?
一. 解决ART方法中变量显示value optimized out问题。
-
禁用
libard.so
优化
当你开始调试的时候你会发现进入到虚拟机相关方法中的时候变量都显示<value optimized out>
,那是因为默认编译libart.so
时,开启了优化选项。需要设置-O0
来关闭优化,但是这样设置之后是无法编译通过的,其实在编译AOSP时还生成了libartd.so
这个共享库,这个是专门用来进行调试的。不过它默认是-O2
,我们将它修改成-O0
,然后重新编译就可以了。-
打开
/<your aosp source path>/art/build/art.go
文件,按注释中的说明修改func debugFlags(ctx android.BaseContext) []string { var cflags []string opt := envDefault(ctx, "ART_DEBUG_OPT_FLAG", "-O0")//将-O2修改为-O0 cflags = append(cflags, opt) return cflags }
-
保存,重新编译
$ cd /<your aosp source path>#这里是你的aosp目录 $ source build/envsetup.sh $ m -j8
-
重新启动模拟器
-
-
切换到
libartd.so
因为Android模拟器默认加载的是libart.so
。我们需要切换到libartd.so
。执行一下命令进行切换$ m use-artd-full
对应的makefile在
/<aosp source path>/art/Android.mk
libartd.so
会导致虚拟机启动很慢,运行也会变得缓慢,如果不再需要调试ART虚拟机了,可以使用如下命令切换回来$ m use-art-full
这样调试ART虚拟的时候就可以看到每个变量值了,不会再出现<value optimized out>
,当然非ART虚拟机中的方法还是会出现,这就需要你找到对应的module并添加-O0
关闭优化选项。
二、如何关闭开启zygote服务进程?
如果要调试ART虚拟机启动过程,或者想调试zygote进程启动过程。就需要手动关闭再开启zygote服务
- 在调试前先关闭zygote服务,命令如下
$ adb shell stop zygote
- attach到init进程,并使用gdb连接到gdbserver后,使用如下命令启动zygote服务
$ adb shell start zygote