안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요~ 안드로이드에 관심이 많아 가입하고선 첫번째 남기는 글이네요. 그리고 첫 글이 질문성글이라 좀 죄송스러운 마음입니다. ^^;;;
요즘 wince에서 돌아가는 어플을 안드로이드용으로 포팅하고 있는데요, 어플에서 성능 및 메모리 사용량을 좀 많이 플요로 하는 부분은 NDK로 만들고 있습니다.
궁금한 점은 NDK 디버깅 방법을 알고싶은데, 명쾌하게 설명해 놓은 글이 없네요. 국내에는 정보가 별로 없어서 구글링으로 주로 영문서를 찾아보았는데, NDK 디버깅에 대한 글은 거의 없고, 어쩌다 찾으면 너무 심플하게 일반적인 shared library의 디버깅 방법만 나열해서, 실제 그대로 해봐도 잘 안되네요.
혹시 NDK 디버깅을 성공하신 분이 있나해서 질문 드립니다.
2010.06.10 10:26:46
NDK로 만들어진 어플은 아니지만, Android에서 GDB 사용한 경험이 있어서 혹 도움될까 몇자 적습니다.
제 갠적 예상을 적는 거라 안 될 수도 있습니다. 그냥 참고나 하세요.
windows 환경에서는 NDK랑 cygwin이 설치되어야 gdb가 제대로 동작합니다.
리눅스 환경이 좀 더 편하기 때문에 리눅스 추천입니다.
만약 NDK로 shared lib을 만들고 이를 java에서 사용하는 중이라면 dalvikvm 실행 이미지도 있어야 할겁니다.
/system/bin/dalvikvm 이 있으니 빼내면 될 것 같습니다. symbolic info가 있는 거면 좋은데 release에는 없을 겁니다.
뭐 그래도 디버깅하는 건 문제 shared lib이니 전혀 문제는 되지 않습니다.
dalvkim은 p_root/dalvik, 디버깅할 shared lib은 p_root/lib에 있다고 가정하고 갑니다.
.so들은 당연히 symbolic info가 있어야 합니다.
그리고는 다음 단계를 따르면 됩니다.
1. adb forward tcp:7777 tcp:7777 (타켓 포트 푸워딩을 설정합니다.)
2. 어플을 실행 합니다.
3. adb shell로 들어가서 ps로 해당 어플의 PID를 확인 합니다.
4. 자동으로 gdb에서 so를 매핑 해주면 좋기는 한데, 안 될 경우를 대비해서 load address를 확인 합니다.
cat /proc/PID/maps 로 so 파일들이 매핑된 위치를 확인합니다.
형식이
xxxxxxxx-yyyyyyy rwxp xxxxxxxxx ...... /system/lib/zzzz.so 이런 식으로 나옵니다.
여기서 xxxxxx가 so가 로드된 base address입니다.
해당 so가 없다면 아직 로딩된 것이 아니기 때문에 gdb에서 자동으로 해줍니다.
5. gdbserver :7777 --attach PID : gdbserver를 실행하는 겁니다.
6. cygwin 창을 엽니다.
7. p_root/dalvik으로 디렉토리를 바꿉니다.
8. arm-eabi-gdb 실행
9. gdb>set solib-search-path ../lib (so lib serach path 설정)
10. gdb>set auto-solib-add on (so lib 자동 loading 설정)
11. gdb>target remote localhost:7777
12.이 단계는 만약 map에서 so 파일이 존재하 경우입니다.
map에 안 나타난 경우는 나중에 필요할 때 로딩될 것이기 때문에 이 단계는 넘어가셔도 됩니다.
연결될 때 shared lib 로딩 된다는 메시지가 없으면
gdb>info sharedlibrary
로 로딩되어 있는지 확인 합니다.
로딩되어 있지 않다면
gdb>add-symbol-file ../lib/so파일이름 0x(xxxxxx) (xxxxx는 cat map에서 확인 한 값입니다.)
13. 적당하게 break 걸고 continue 하시면 됩니다.
한번 해보시고 되는지 알려주세요.
dalvikvm 이미지 그냥 빼고 한번 해볼 수도 있을 것 같은데.. 확신이 없네요.