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와 통신하며 프로그램을 디버깅 한다.
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로 변한 것을 볼 수 있고, 위와 같은 에러도 발생하지 않았다.
'Android' 카테고리의 다른 글
nexus 5를 위한 Android 4.4 빌드하기 2. 소스코드 다운로드 (0) | 2014.07.09 |
---|---|
nexus 5를 위한 Android 4.4 빌드하기 1. 빌드 환경 설정. (0) | 2014.07.08 |
android IP 확인 (0) | 2014.05.19 |