플랫폼 코드 디버그

플랫폼용 Android 스튜디오 (ASfP)는 다음 작업을 할 수 있는 강력한 디버거를 제공합니다.

  • 디버깅할 기기를 선택합니다.
  • Java, Kotlin, C/C++, Rust 코드에 중단점을 설정합니다.
  • 런타임에 변수를 검사하고 표현식을 평가합니다.

디버거를 사용하기 전에 빌드를 기기나 에뮬레이터에 플래시해야 합니다.

앱 프로세스 (Java/Kotlin) 디버깅

Java 또는 Kotlin 애플리케이션 프로세스를 디버그하려면 다음 단계를 따르세요.

  1. ASfP 내에서 Java 또는 Kotlin 코드에 중단점을 설정합니다.

  2. 메뉴에서 Run > Attach Debugger to Android Process를 선택합니다.

  3. Choose Process 대화상자에서 Debug typeJava Only로 설정되어 있는지 확인합니다.

  4. 목록에서 기기를 선택합니다.

  5. 디버그할 특정 애플리케이션 프로세스를 선택합니다.

  6. OK(확인)을 클릭합니다.

  7. 기기에서 애플리케이션과 상호작용하여 중단점을 적중합니다.

시스템 프로세스 (C/C++) 디버깅

C 또는 C++로 작성된 시스템 프로세스를 디버그하려면 다음을 실행하세요.

  1. 실행 중인 기기 또는 에뮬레이터가 하나만 있는지 확인합니다.

  2. 터미널을 열고 AOSP 체크아웃 루트에서 adb root를 실행합니다. bash adb root

  1. ASfP 내 C/C++ 코드에 중단점을 설정합니다.

  2. 메뉴에서 Run > Attach Debugger to Android Process를 선택합니다.

  3. Choose Process 대화상자에서 Debug typeNative Only 또는 Dual (Java + Native)로 변경합니다.

  4. Show all processes 체크박스를 선택하여 시스템 프로세스를 확인합니다.

  5. 목록에서 기기를 선택합니다.

  6. 디버그할 특정 시스템 프로세스 (예: surfaceflinger 또는 system_server)를 선택합니다.

  7. OK(확인)을 클릭합니다.

  8. 기기와 상호작용하여 중단점을 적중합니다.

Rust 디버깅

ASfP는 LLDB를 사용하여 디버그 어댑터 프로토콜 (DAP)을 통한 Rust 디버깅을 지원합니다. 이 섹션에서는 CodeLLDB를 디버그 어댑터 서버로 설정하고 호스트와 Android 기기에서 Rust 코드를 디버깅하는 방법을 설명합니다.

CodeLLDB를 디버그 어댑터 서버로 설정

  1. 디버그 어댑터 프로토콜 실행/디버그 구성을 만듭니다.

    1. 메뉴에서 Run > Edit Configurations를 선택합니다.
    2. + 버튼을 클릭합니다.
    3. Debug Adapter Protocol을 선택합니다.
  2. 서버 탭에서 새 서버 만들기를 클릭합니다.

  3. 새로 열린 대화상자에서 템플릿 선택을 클릭하고 목록에서 CodeLLDB를 선택합니다.

  4. CodeLLDB 템플릿을 선택하면 사전 정의된 구성으로 새 서버가 추가됩니다.

    1. 추적 드롭다운에서 상세를 선택하여 상세 추적을 사용 설정합니다.
    2. Android 소스 사전 빌드의 lldb-server 경로를 지정하는 환경 변수를 추가합니다.
        LLDB_DEBUGSERVER_PATH=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/runtimes_ndk_cxx/x86_64/lldb-server
        ```
    
    Replace `REPO_ROOT` with the absolute path to your Android source checkout.
    To find `CLANG_VERSION`, run the `get_clang_version.py` script from the root of
    your Android source tree:
    
    ```bash
        ./build/soong/scripts/get_clang_version.py
    
    1. <<insert base directory>> 섹션을 변경하지 마세요.

호스트에서 Rust 바이너리 디버그

  1. 디버그 어댑터 프로토콜 실행/디버그 구성에서 구성 탭을 엽니다.
  2. 디버그 모드실행을 선택합니다.
  3. 작업 디렉터리를 업데이트하고 디버그할 바이너리 파일을 선택합니다.
  4. 확인을 클릭하여 구성을 저장합니다.
  5. 구성 옆에 있는 디버그 아이콘을 클릭하여 디버깅 세션을 시작합니다.

처음 실행하면 CodeLLDB가 다운로드됩니다. 콘솔에 DAP 트레이스가 표시됩니다. Rust 코드에 설정된 중단점이 예상대로 적중됩니다.

Android 기기에서 Rust 바이너리 디버깅 (연결 모드)

  1. PID 찾기: Android 기기에서 디버그하려는 애플리케이션의 프로세스 ID (PID)를 확인합니다.

  2. 기기에서 lldb-server 시작: Android 소스 트리 체크아웃의 루트에서 lldbclient.py 스크립트를 실행하고 <PID>를 프로세스 ID로 바꿉니다.

    lldbclient.py --setup-forwarding vscode-lldb -p <PID>
    

    이 스크립트는 올바른 lldb-server를 기기에 푸시하고, 시작하고, 포트 전달 (호스트 포트 5039~기기)을 설정하고, 다음 단계에 필요한 DAP JSON 구성을 출력합니다. 이 터미널을 열어 둡니다.

  3. 호스트에서 CodeLLDB 디버그 어댑터 시작:

    • CodeLLDB 확장 프로그램 디렉터리 (기본값: ~/.lsp4ij/dap/codelldb/extension/adapter)로 이동합니다.
    • 필수 환경 변수를 설정하고 어댑터 서버를 시작합니다. 서버 설정에서 확인한 대로 REPO_ROOTCLANG_VERSION을 바꿉니다.
        # Sets PYTHONHOME env variable
        export PYTHONHOME=REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3
    
        # Tell the dynamic linker where to find python libs
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/python3/lib
    
        # Starts the CodeLLDB Debugger Adapter server on port 1234
        ./codelldb --liblldb REPO_ROOT/prebuilts/clang/host/linux-x86/CLANG_VERSION/lib/liblldb.so --port 1234
    
  4. ASfP DAP 클라이언트 구성:

    1. ASfP의 디버그 어댑터 프로토콜 실행/디버그 구성으로 돌아갑니다.
    2. 구성 탭을 선택합니다.
    3. 디버그 모드연결로 설정합니다.
    4. 주소localhost로 설정합니다.
    5. 포트1234으로 설정합니다.
    6. lldbclient.py 명령어 (2단계)의 JSON 출력을 DAP 매개변수 (JSON) 필드에 붙여넣습니다.
  5. 디버그를 클릭하여 디버깅 세션을 시작합니다.

문제 해결

  • error: Connection shut down by remote side while waiting for reply to initial handshake packet 오류가 표시되면 현재 디버그 세션을 종료하고 기기에서 lldb-server를 다시 시작하고 호스트에서 CodeLLDB 어댑터를 다시 시작합니다.