업무를 할 때 90%가 이미 개발된 코드를 보는 일인데, runtime 의 코드 흐름을 살펴보기에는 gdb 만한것이 없다.
이전에 하던 업무는 c 언어로 된 모듈의 유지보수 작업이였는데,
subtle 한 timing 이슈가 아닌 이상 gdb 의 breakpoint 를 걸어서 잘못된 로직을 타고 있지는 않은지 볼 수 있고,
왜 그런 흐름을 타게 되었는지 backtrace 를 통해 각 변수의 값들을 보면 금방 알아낼 수 있었다.
그런 환경에 익숙해지다가 android 환경에 놓이게 되니 backtrace 가 되지 않는 것이 그렇게 불편할 수 없었다.
breakpoint 나 코드 분기는 그나마 로그를 통해 확인 할 수 있지만,
매번 빌드를 새로 하고 push 한 후 재부팅 하는 작업을 하자니 배보다 배꼽이 큰 느낌 이였다.
그래서 android gdb 로 검색했는데,
android developer 사이트에서는 gdbclient 를 쓰는 방법만 나와있고 gdbclient 의 설치 방법이 가이드 되어 있지 않았다.
그러다가 찾은 글이 이것
http://say2.tistory.com/entry/android-gdb-디버깅하는법 [say2]
찬찬히 따라하다 보면 되고, 의외로 간단하다.
target 과 host PC 로 나누어 정리해 둔다.
gdbclient 는 타겟의 소스 코드가 전부 있어야 하는지 잘 안되길래 더 파보지 않았다.
* 64bit 인 경우 (64) 로 된 부분은 64를 붙여주면 된다.
* hostPC 의 gdb 는 ndk디렉토리/prebuilt/linux-x86_64/bin 에 존재하는 것으로 사용한다. (Ubuntu 14.04 64bit의 경우)
* breakpoint 를 걸 때 classname 으로 시작하면 안되고 namespace 부터 시작해야한다. 그래야 tab 으로 검색도 가능하다.
target | hostPC |
tar -cvzf /sdcard/so.tar.gz /system/lib(64) gdbserver(64) tcp:5040 --attach [app_pid] *5040 은 다른 포트도 가능 |
mkdir ~/gdb-test cd ~/gdb-test adb pull /system/bin/app_process adb pull /sdcard/so.tar.gz tar -xzvf so.tar.gz adb forward tcp:5040 tcp:5040 gdb app_process (gdb) set solib-search-path ~/gdb-test (gdb) target remote:5040 |
* 그 외 참고한 사이트들
https://wladimir-tm4pda.github.io/porting/debugging_gdb.html
https://gist.github.com/chitacan/11200703
http://vcodecs.com/display/SWEN/GDB+in+Android