Work/Android

android 에서 gdb 사용하기

sleepiggy 2018. 6. 19. 23:00

업무를 할 때 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  hostP
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