1. android dalvik debugging


디버깅은 개발에 있어서 정말 중요하다.

달빅을 개발할 때 버추얼 머신 디버깅을 하면서 개발 효율이 많이 올라갔었다.

그당시 참고 사이트.

http://androidkr.blogspot.kr/2010/10/android-gdb-dalvik-vm.html


2. android art debugging


dalvik은 버추얼 머신위에서 어플리케이션이 돌아가기때문에 달빅을 디버깅을 하면 된다. 어플리케이션을 돌리는 프로그램이 app_process 이므로 이것을 시작으로 디버깅을 시작했다.

현재 내가 하는 것은 art에서 돌아가는 시스템 프로그램들이다.



3. 준비물 확인


  • gdbserver - 안드로이드 디바이스에서 프로그램과 엮겨 호스트의 gdb의 입력을 받아들인다.
  • gdb - 호스트에서 gdbserver와 통신하며 프로그램을 디버깅 한다.

4. 호스트 준비하기

호스트는 우리의 컴퓨터이다. 컴퓨터를 준비하고 소스코드를 다운받고 빌드한다.


5. 머신 준비하기

나의 머신은 nexus 7. 4.에서 준비한 빌드 이미지를 머신에 플래시 한다.
이 과정은 다른 곳에도 많으니 생략하자.


6. 호스트와 머신간 통신

호스트를 통해 머신의 프로그램을 디버깅 할 것이기 때문에, 당연히 호스트와 머신은 통신을 할 수 있어야 한다.
이 통신을 하기 위해 로컬 네트워크를 이용한다. 로컬 허브에 머신을 와이파이로 연결하고, 머신으로 포트를 포워딩 한다.




7. 머신에서 해야할 일


안드로이드 쉘에 접속한다.

$adb shell

디버깅 하고자 하는 프로그램을 실행한다. 여기서 프로그램은 안드로이드 어플리케이션이 아닌 art의 프로그램이다.

이 프로그램의 PID를 확인한다.

#ps

이 프로그램을 gdbserver에 등록한다.

#gdbserver 163.152.73.73:2345 --attach 3403

위에서 IP주소는 내 서버 호스트의 IP 주소이고 port는 6.에서 설정한 port이다. --attach 뒤의 숫자는 디버깅할 프로그램의 PID.


다음과 같이 메세지가 나온다.

gdbserver 163.152.73.73:2345 --attach 3332

Attached; pid = 3332

Listening on port 2345

Remote debugging from host 163.152.73.73


이제 호스트에서 디버깅을 하면 된다.



8. 호스트에서 해야할 일


머신과 통신할 gdb가 있어야 한다.

나의 경우는 arm 머신이기 때문에 다음의 gdb를 이용한다.

prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb


이때 7에서 실행하는 프로그램을 명시해 주어야 한다. art에서 사용하는 프로그램 대부분은 다음 path에 있다.

out/target/product/flo/system/bin


adb를 디버깅한다고 가정하면.....

$android-5.0.1_r1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb out/target/product/flo/symbols/system/bin/adb

와 같다.


그렇게 되면 gdb 가 실행이 된다.

그리고 나서 이 프로그램의 symbol들을 알 수 있는 path를 지정해 준다.

$set solib-search-path out/target/product/flo/symbols/system/lib


이제 gdbserver에 접속하도록 하자.

(gdb) target remote 163.152.73.82:2345

위에서 IP주소는 나의 허브 아이피 주소이고, 포트는 머신으로 포워딩된 포트이다.


Remote debugging using 163.152.73.82:2345

위와 같이 메세지가 나오면서 연결이 된다.






기타 사항


맨처음에 가장 고생했던 것.

머신에서 gdbserver를 실행하려고 하면 계속 다음과 같은 메세지를 뱉었다.

Cannot attach to lwp 3403: Operation not permitted (1)

Exiting

그 이유는 내가 디버깅 하고자 한 프로그램이 root권한을 필요로 했던것.


이를 해결 하기 위해 adb를 root 권한으로 실행한다.

$adb root

$adb shell


이후에 안드로이드 쉘 프롬프트가 root로 변한 것을 볼 수 있고, 위와 같은 에러도 발생하지 않았다.







+ Recent posts