Android 소스 디버그 환경 구축(4) - ART 가상 기기의 디버그 문제

3603 단어 android
전언
우선 앱의 프로세스는 지그재그 프로세스 포크에서 나온다는 것을 알아야 한다.zygote 프로세스가 시작되었을 때 ART 가상 기기의 초기화와 시작 작업이 실행되었고, zygote 프로세스는 init 프로세스 fork에서 나온 것입니다.따라서 가상 머신 실행 단계를 디버깅하고 싶을 경우 앱 프로세스를 직접 디버깅하고 ART 초기화와 시작 단계를 디버깅한다.그러면 지그재그 서비스를 닫고 gdbserver detach를 통해 init 프로세스에 디버깅을 한 다음 지그재그 서비스를 시작해야 포크에서 나오는 지그재그 프로세스에 들어갈 수 있습니다.zygote 프로세스에 들어가면 ART 가상 기기의 초기화와 시작 과정을 디버깅할 수 있습니다.다음은 내가 주로 만날 두 가지 문제의 해결 방법을 소개한다. 1.어떻게 컴파일러 최적화를 닫습니까?2.zygote 서비스 프로세스를 어떻게 닫습니까?
하나.ART 메서드의 변수 표시 value optimized out 문제를 해결합니다.
  • 비활성화libard.so 최적화는 디버깅을 시작할 때 가상 머신 관련 방법에 들어갈 때 변수가 표시되는 것을 발견할 수 있습니다. 기본 컴파일링libart.so이 시작되었을 때 최적화 옵션이 켜져 있기 때문입니다.최적화를 닫기 위해 설정-O0이 필요하지만 이렇게 설정한 후에는 컴파일할 수 없습니다. 사실 AOSP를 컴파일할 때 libartd.so라는 공유 라이브러리를 생성했는데 이것은 디버깅을 위한 것입니다.그러나 기본값은 -O2 이고, 우리는 그것을 -O0 로 수정한 후에 다시 컴파일하면 된다.
  • 파일을 열고 주석의 설명에 따라 수정
    	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	
    
  • 시뮬레이터 재부팅
  • 에서 //art/build/art.go로 전환합니다. 안드로이드 시뮬레이터가 기본적으로 불러오는 것은 libartd.so이기 때문입니다.우리는 libart.so 로 전환해야 한다.명령을 실행하여 전환
    $ m use-artd-full
    
    에 대응하는makefilelibartd.so//art/Android.mk는 가상 기기의 시작이 느리고 실행도 느려질 수 있습니다. ART 가상 기기를 디버깅할 필요가 없으면 아래 명령을 사용하여 전환할 수 있습니다
    $ m use-art-full
    
  • 이렇게 ART 가상을 디버깅할 때 모든 변수 값을 볼 수 있고 다시 나타나지 않을 것이다libartd.so. 물론 ART 가상기가 아닌 방법도 나타날 수 있다. 그러면 대응하는 모듈을 찾아서 추가 최적화 옵션을 닫아야 한다.
    2. zygote 서비스 프로세스를 어떻게 닫습니까?
    ART 가상 머신 부트 프로세스를 디버깅하거나 zygote 프로세스 부트 프로세스를 디버깅하려고 합니다.수동으로 닫고 지고트 서비스를 켜야 돼요.
  • 디버깅 전에zygote 서비스를 닫고 명령은 아래와 같다
    $ adb shell stop zygote
    
  • attach에서 init 프로세스에 연결하고 gdb를 사용하여 gdb 서버에 연결한 후 다음 명령으로zygote 서비스를 시작합니다
    $ adb shell start zygote
    
  • 좋은 웹페이지 즐겨찾기