前言
首先我們要知道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