본문 바로가기

Smart Platform/Android

[Android Debugging]gdb & gdbserver setting process

NDK Debugging in Android ( gdb & gdbserver)

1. NDK 다운로드
에서 자신의 운영체제에 맞는 Android NDK 를 다운로드



2. NDK 내 gdbserver 및 gdb 경로 확인 ( Windows )

= gdbserver =
경로 : [NDK 설치경로]/prebuilt/android-arm/gdbserver/

= gdb =
경로 : [NDK 설치경로]/toolchains/arm-linux-androideabi-4.X/prebuilt/windows/bin/




3. gdbserver 설정

안드로이드 디바이스에 gdbserver 파일 전송


안드로이드 디바이스에 올라온 해당 파일 확인.


파일 확인 결과. 실행 권한이 없으므로 chmod 755 gdbserver 명령어를 통해 실행 권한을 부여


디버깅 대상 PID(프로세스 아이디) 확인 후
# ./gdbserver :[임의의 포트번호] --attach [PID]




4. gdb 사용 전 사전작업
Android 환경에서 App 이 동작하면 여러가지 라이브러리 파일이 필요하다.
이 라이브러리 파일들이 안드로이드 기기의 /system/lib 경로에 존재한다.
이 라이브러리 파일들을 원격 gdb 에서도 로딩을 하기 위해 /system/lib 하위에 존재하는 라이브러리 파일들을 가져와야 한다.


tar 를 이용해 해당 디렉토리에 존재하는 모든 파일을 압축한 뒤 압축한 파일을 PC 로 전송한다.

해당 압축파일을 압축해제
원격 gdb 에서 해당 라이브러리 파일 경로를 설정해주어야 하므로
라이브러리 파일이 존재하는 경로를 기억하고 있자!!



다음으로 Android 에서는 app_process 라는 서비스를 통해 Dalvik VM 을 실행시킨 후 zygote를 생성한다.







5. gdb 설정
현재 안드로이드 디바이스에 있는 gdbserver 의 결과를 PC 로 포워딩 하기위해

# adb forward tcp:[임의의 포트번호] tcp:[임의의 포트번호]

명령어 입력 후

PC에서 [NDK 설치경로]/toolchains/arm-linux-androideabi-4.X/prebuilt/windows/bin/ 에 존재하는 gdb 실행


gdb 진입 후 라이브러리 심볼로드 및 접속하기 위해 추가작업을 실행해 주어야 한다.

(gbd) set solib-absolute-prefix "PATH"
: 시스템 /(root) 경로 설정, 모든 공유 라이브러리 앞에 이 옵션이 붙어서 path 를 찾기 때문이다.
예를들어, 우리가 가져온 파일이 /system/lib 하위에 있는 공유 라이브러리이므로
gdb 를 실행해 줄 때에도 target 과 동일한 환경을 맞추어 주는 것이다.

(gdb) set solib-search-path "PATH"
: shared library(공유 라이브러리)를 찾기 위한 경로 설정


(gbd) file "PATH"

gdb 에서 아래명령 입력

(gdb) target remote :[임의의 포트번호]