Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

GDB 사용

GDB(GNU 프로젝트 디버거)는 일반적으로 사용되는 UNIX 디버거입니다. 이 페이지에서는 플랫폼 개발자를 위해 gdb를 사용한 Android 앱 및 프로세스 디버그에 관해 자세히 설명합니다. 제3자 앱 개발은 앱 디버그를 참조하세요.

기본 요건

앱 및 프로세스 디버깅에 GDB를 사용하는 방법:

  • envsetup.sh 명령어로 환경을 설정합니다.
  • lunch 명령어를 실행합니다.

환경 설정과 관련해 추가 도움이 필요한 경우 환경 설정을 참조하세요.

실행 중인 앱 또는 프로세스 디버깅

실행중인 앱 또는 네이티브 데몬에 연결하려면 PID와 함께 gdbclient.py를 사용합니다. 예를 들어 PID 1234를 사용하여 프로세스를 디버깅하려면 다음을 실행합니다.

gdbclient.py -p 1234

이 스크립트는 포트 전달을 설정하고, 기기에서 적절한 gdbserver를 시작하고, 호스트에서 gdb를 시작하고, 기호를 찾도록 gdb를 구성하고, 원격 gdbservergdb를 연결합니다.

네이티브 프로세스 시작 디버깅

프로세스를 시작할 때 디버깅하려면 gdbserver 또는 gdbserver64를 사용합니다. 64비트 실행 파일의 경우:

adb shell gdbserver64 :5039 /system/bin/MY_TEST_64_BIT_APP

32비트 실행 파일의 경우:

adb shell gdbserver :5039 /system/bin/MY_TEST_32_BIT_APP

출력 예:

Process MY_TEST_64_BIT_APP created; pid = 3460
Listening on port 5039

그런 다음 gdbserver 출력에서 앱 PID를 식별해 다른 터미널 창에서 사용합니다.

gdbclient.py -p APP_PID

마지막으로 gdb 프롬프트에서 continue를 입력합니다.

앱 시작 디버깅

앱이 시작될 때 앱을 디버깅하려는 경우가 있는데, 충돌이 발생한 경우 및 충돌이 발생하기 전에 무슨 문제가 있었는지 코드를 차근차근 살펴보고자 하는 경우가 여기에 해당합니다. 연결이 잘 작동하는 경우가 있지만 어떤 경우에는 연결하기 전에 앱이 충돌해 연결이 불가능합니다. 앱에 포트를 열 수 있는 권한이 없을 수 있고 gdbserver가 이러한 제한사항을 상속받기 때문에 logwrapper 접근 방법(strace에 사용됨)이 항상 효과가 있는 것은 아닙니다.

앱 시작을 디버그하려면 설정의 개발자 옵션을 사용하여 자바 디버거가 연결될 때까지 앱이 대기하도록 지시합니다.

  1. 설정 > 개발자 옵션 > 디버그할 앱 선택으로 이동하고 목록에서 앱을 선택한 다음 디버거 연결 대기를 클릭합니다.
  2. 런처에서 또는 명령줄을 사용하여 실행하려는 앱을 시작합니다.
    adb shell am start -a android.intent.action.MAIN -n APP_NAME/.APP_ACTIVITY
    
  3. 앱이 로드되고, 앱이 디버거를 대기하고 있음을 알리는 대화상자가 표시될 때까지 기다립니다.
  4. gdbserver/gdbclient를 일반적인 방법으로 연결하고 중단점을 설정한 다음 프로세스를 계속 진행합니다.

앱이 실행되도록 하려면 자바 디버거(jdb)와 같은 자바 디버그 유선 프로토콜(JDWP) 디버거를 연결합니다.

adb forward tcp:12345 jdwp:XXX  # (Where XXX is the PID
of the debugged process.)
jdb -attach localhost:12345

충돌하는 앱 또는 프로세스 디버깅

gdb에 연결할 수 있도록 debuggerd가 비정상 종료되는 프로세스를 정지하도록 하려면 적절한 속성을 설정합니다.

  • Android 7.0 Nougat 이상
    
    adb shell setprop debug.debuggerd.wait_for_gdb true
    
  • Android 6.0 Marshmallow 이하
    adb shell setprop debug.db.uid 999999
    

보통 비정상 종료 출력의 끝부분에서는 debuggerd가 다음 명령어를 사용하여 gdb를 연결하는 방법을 안내해줍니다.

gdbclient.py -p PID

기호 없이 디버깅

32비트 ARM의 경우 기호가 없으면 gdb는 어떤 명령 집합이 디스어셈블을 수행하는지 확인할 수 없습니다(ARM 또는 Thumb). 기호 정보가 없을 때 기본값으로 선택된 명령 세트를 지정하려면 다음 속성을 설정합니다.

set arm fallback-mode arm  # or thumb

VS 코드로 디버깅

GDB는 Visual Studio Code에 대한 디버깅 플랫폼 코드를 지원합니다. GDB CLI 인터페이스 대신 VS 코드 디버거 프런트엔드를 사용하여 기기에서 실행되는 네이티브 코드를 제어하고 디버깅할 수 있습니다.

디버깅에 VS 코드를 사용하기 전에 C/C++ 확장 프로그램을 설치하세요.

VS 코드를 사용하여 코드를 디버그하는 방법:

  1. gdbclient.py를 실행하는 데 필요한 모든 빌드 아티팩트(예: 기호)가 있는지 확인합니다.
  2. 다음 명령어를 실행합니다.
    gdbclient.py -p pid | -n proc-name |
    -r ... --setup-forwarding vscode ANY_OTHER_FLAGS

    그러면 JSON 객체가 인쇄되고 gdbclient.py가 계속해서 실행됩니다. 이는 예상된 동작이므로 gdbclient.py 프로그램을 종료하지 마세요.

  3. VS 코드의 디버깅 탭에서 구성 추가를 선택한 다음 C/C ++ gdb 연결을 선택합니다. 그러면 launch.json 파일이 열리고 목록에 새 JSON 객체가 추가됩니다.
  4. 새로 추가된 디버거 구성을 삭제합니다.
  5. gdbclient.py가 인쇄한 JSON 객체를 복사하여 방금 삭제한 객체에 붙여 넣습니다. 변경사항을 저장합니다.
  6. 창을 다시 로드하여 디버거 목록을 새로 고치려면 Ctrl+Shift+P를 누르고 reload window를 입력합니다.
  7. 새 디버거 구성을 선택하고 실행을 누릅니다. 디버거는 10~30초 후에 연결해야 합니다.
  8. 디버깅이 끝나면 gdbclient.py를 실행 중인 터미널로 이동하고 Enter를 눌러 gdbclient.py 프로그램을 종료합니다.

디버거 구성을 처음 설정한 후에는 3~6단계를 건너뛸 수 있습니다.