플랫폼 코드 디버그

플랫폼용 Android 스튜디오 (ASfP)는 디버그 도구 창의 연결 탭을 중심으로 다국어 플랫폼 디버깅을 통합합니다.

  • Run > Attach to Android Process (Control+Alt+A)를 선택하여 Java 디버거, 네이티브 디버거 (번들 LLDB) 또는 둘 다를 실제 기기나 Cuttlefish 가상 기기에서 실행 중인 앱이나 시스템 프로세스에 연결합니다.
  • out/target/product/<device>/symbols 아래에 일치하는 로컬 디버그 심볼을 확인하는 체크표시 아이콘과 함께 연결하기 전에 로드된 모든 공유 라이브러리 (.so)와 라이브러리 패널의 8자리 ELF 빌드 ID를 검사합니다.
  • 툴바에서 기기 필수 요건을 관리합니다. 시스템 프로세스 표시로 필터링하고 루트 기기를 클릭하여 adb root를 실행하고 (활성 상태일 때 기기가 루팅됨 표시) JDWP 사용 설정을 클릭하여 userdebug 빌드에서 JDWP를 사용 설정합니다.
  • 조건부 및 예외 중단점을 설정하고, 편집기에서 인라인 변수 값을 확인하고, 프레임 드롭 및 스마트 Step Into를 사용하고, 런타임에 구조화된 C++ 및 Rust 유형을 검사합니다.

디버거를 사용하기 전에 로컬 out/target/product/<device>/symbols/.build-id 심볼 색인이 존재하도록 lunch 타겟을 빌드하고 일치하는 기기 이미지를 플래시하거나 실행합니다.

Java 및 이중 Java 및 네이티브 디버깅

Java 또는 Kotlin 애플리케이션, 시스템 앱 (예: com.android.messaging, 설정 또는 SystemUI) 또는 JNI 및 C++ 또는 Rust 코드를 호출하는 프로세스를 디버그하려면 다음 단계를 완료하세요.

  1. Java, Kotlin, C, C++, Rust 소스 파일에 중단점을 설정합니다.
  2. Run > Attach to Android Process (Control+Alt+A)를 선택합니다. ASfP는 디버그 도구 창 내에 고정된 첨부 탭을 엽니다.
  3. 기기 드롭다운 메뉴에서 대상 기기를 선택합니다. userdebug 빌드에서 JDWP가 사용 설정되지 않은 경우 JDWP 사용 설정을 클릭합니다. ASfP가 persist.debug.dalvik.vm.jdwp.enabled=1를 설정하고 기기를 재부팅합니다. 활성 상태일 때 버튼에는 JDWP 사용 설정됨이 표시되고 마우스 오른쪽 버튼 클릭 시 JDWP 사용 중지 작업이 표시됩니다.
  4. 표에서 타겟 프로세스를 선택합니다 (Java 및 ART 프로세스에는 커피잔 아이콘이 표시됨).
  5. 연결 탭 하단에서 Java 디버거, 네이티브 디버거 또는 둘 다를 선택합니다. 둘 다 선택하면 디버그 도구 창에 연결된 탭이 두 개 열립니다. <process> (<pid>)는 내장 LLDB용이고 <process> (<pid>)-jdwp는 Java용입니다. 수명 주기가 서로 연결되어 있으므로 어느 세션이든 중지하면 두 세션이 모두 중지됩니다.
  6. 연결을 클릭하고 기기에서 앱과 상호작용하여 중단점을 적중합니다.

연결 탭과 함께 연결된 이중 Java 및 네이티브 디버깅 탭

시스템 프로세스 (C 및 C++) 디버깅 및 심볼 확인

시스템 데몬, HAL 또는 시스템 서비스 (예: android.hardware.bluetooth-service.cuttlefish, surfaceflinger, audioserver)를 디버그하려면 다음 단계를 완료하세요.

  1. 실행 > Android 프로세스에 연결 (Control+Alt+A)을 엽니다. 툴바에 루팅된 기기가 표시되면 이를 클릭하여 ASfP가 adb root를 실행하고 기기가 루팅됨을 표시하도록 합니다.
  2. 상단 툴바에서 시스템 프로세스 표시를 선택하고 타겟 프로세스를 필터링합니다.
  3. 라이브러리 패널에서 로컬 디버그 심볼 확인: 프로세스를 선택하면 프로세스에 로드된 모든 ELF 공유 라이브러리 (.so)와 ELF 빌드 ID의 처음 8개 16진수 문자로 라이브러리 표가 채워집니다. ASfP는 각 빌드 ID를 out/target/product/<device>/symbols와 대조합니다 (symbols/.build-id는 APEX 내부의 라이브러리를 확인하는 데 필요함).
    • 인증된 라이브러리에는 체크표시 아이콘이 표시됩니다. 확인된 행을 가리켜 전체 로컬 .debug 기호 경로를 미리 봅니다.
    • 일치하는 로컬 심볼이 없는 해결되지 않은 라이브러리에는 경고 아이콘이 표시됩니다.
  4. 비 Java 프로세스 감지: C++ 또는 Rust 프로세스(육각형 C 아이콘으로 표시됨)를 선택하면 ASfP는 Java 디버거를 숨기고 Java 디버깅을 사용할 수 없습니다. Java 프로세스가 아닙니다.를 표시하는 동시에 네이티브 디버거를 선택된 상태로 유지합니다.
  5. C, C++ 또는 Rust 소스 파일에서 중단점을 설정하고 연결을 클릭한 다음 기기에서 코드 경로를 트리거합니다.

라이브러리 표, ELF 빌드 ID, 로컬 기호 체크표시를 보여주는 탭 첨부

Rust 코드 디버그

ASfP는 C 및 C++에 사용되는 동일한 내장 LLDB 디버거로 Rust 플랫폼 코드를 디버그합니다. 외부 어댑터나 수동 서버 설정이 필요하지 않습니다. ASfP는 번들로 제공되는 도구 모음에서 lldb-dap를 사용하고 AOSP 미리 빌드에서 Rust pretty-printer를 자동으로 로드하므로 String, Vec, HashMap, Option와 같은 표준 유형이 변수 창에 구조화된 값으로 표시됩니다.

기기에서 실행 중인 Rust 프로세스에 연결

시스템 프로세스 (C 및 C++) 디버깅의 단계를 따릅니다. 실행 > Android 프로세스에 연결을 열고, 기기가 루팅됨 및 로컬 심볼이 라이브러리 패널에 체크표시로 표시되는지 확인하고, 네이티브 디버거를 선택한 상태로 유지하고, 연결을 클릭합니다. Rust 및 C 또는 C++ 스택 프레임이 동일한 디버그 세션에 함께 표시됩니다.

rust_test 또는 rust_test_host 모듈 디버깅

  1. rust_test 또는 rust_test_host 타겟을 선언하는 Android.bp 파일을 열고 모듈 유형 옆의 여백에서 실행 아이콘을 클릭합니다.
  2. Debug '<ModuleName>'을 선택합니다. ASfP는 타겟을 빌드하고, 호스트 머신이나 연결된 기기의 LLDB에서 테스트 바이너리를 실행하고, Rust 중단점에서 일시중지합니다.
  3. 단일 테스트 함수를 디버그하거나 LLDB 시작 명령어를 맞춤설정하려면 실행 > 구성 수정을 열고 생성된 Soong 테스트 구성을 선택하고 메서드를 설정하거나 디버거 옵션을 펼칩니다. Soong Test 구성 옵션에 관한 자세한 내용은 atest로 테스트 플랫폼 코드를 참고하세요.

ASfP에서 구조화된 변수 시각화 도구를 사용하여 Rust 플랫폼 코드 디버깅