안드로이드에서 개발을 하는 도중 테스트 버전의 실행파일의 메모리 leak을 체크하고자 valgrind를 사용해보기로 결정하고 방법을 정리해보고자 한다.


valgrind는 우분투 12.04 64bits에서 컴파일을 하였고 안드로이드 NDK가 필요하며 NDK를 안드로이드 developer 사이트에서 다운로드 받아 압축을 풀어 사용한다.


참고로 컴파일에 사용한 NDK 버전은 android-ndk-r9 이고 valgrind를 사용하기 위해서는 rooting이 필요하다.


valgrind의 컴파일은 http://valgrind.org/docs/manual/dist.readme-android.html 를 참고하였다.

위의 사이트에서 실행을 확인한 Android 버전은 다음과 같이 소개하고 있다.


ARM:
  Android 4.0.3 running on a (rooted, AOSP build) Nexus S.
  Android 4.0.3 running on Motorola Xoom.
  Android 4.0.3 running on android arm emulator.
  Android 4.1   running on android emulator.
  Android 2.3.4 on Nexus S worked at some time in the past.

x86:
  Android 4.0.3 running on android x86 emulator.


http://valgrind.org/downloads/ 에서 valgrind 3.9.0 (tar.bz2)를 다운로드 하였다.


순서대로 명령을 실행한다.


$ cd valgrind-3.9.0

$ export NDKROOT=~/android-ndk-r9


하드웨어 종류를 설정하는데 확인된 설정은 다음과 같다.

 

export HWKIND=nexus_s         # Samsung Nexus S; also Xoom (for now)
export HWKIND=generic         # A generic Android device. eg, Pandaboard
export HWKIND=emulator        # Android emulator


$ export HWKIND=emulator

$ export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
$ export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
$ export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc


아래 설정에서 --with-tmpdir=/storage/sdcard는 SD card의 경로로 valgrind 실행 시 임시 파일을 쓰기 위해 필요한 경로이다.

테스트하고자 하는 단말이나 에뮬레이터의 실제 SD card의 경로를 써야 한다. 그렇지 않으면 valgrind 실행 시 에러가 발생한다.


$ CPPFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm -DANDROID_HARDWARE_$HWKIND" \
   CFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm" \
   ./configure --prefix=/data/local/Inst \
   --host=armv7-unknown-linux --target=armv7-unknown-linux \
   --with-tmpdir=/storage/sdcard

 

명령 실행 후 마지막 줄에 아래의 항목이 표시되는지 확인한다.
"Primary -DVGPV string: -DVGPV_arm_linux_android=1"

 

$ make -j2
$ make -j2 install DESTDIR=`pwd`/Inst


adb push로 Inst 디렉터리를 에뮬레이터나 단말의 /data/local/Inst로 업로드 한다.


$ adb push Inst /

$ adb shell

$ /data/local/Inst/bin/valgrind [the usual args etc]


갤럭시 노트3의 안드로이드 4.3 버전에 valgrind를 실행한 결과 아래 에러가 발생하면서 실행이 되지 않았다.


root@hlteskt:/data/local/tmp # /data/local/Inst/bin/valgrind
valgrind: failed to start tool 'memcheck' for platform 'arm-linux': Permission denied

 

/data/local/Inst/lib/valgrind/memcheck-arm-linux 가 연관이 있다고 하는데 해결 방법을 찾을 수는 없었다.

아마도 /data의 마운트 관련된 문제이거나 Knox와 연관이 있지 않을까 하는 추측을 해본다.

그리고 export HWKIND=nexus_s, export HWKIND=generic, export HWKIND=emulator 로 각각 설정을 바꾸어 시도해보았으나 같은 에러가 발생하였다.

할 수 없이 에뮬레이터(Android 4.3)를 구동하여 사용하였다.

 

/data/local/Inst/lib/valgrind/ 내의 라이브러리의 퍼미션을 755로 설정하면 실제 단말에서도 된다.


에뮬레이터(Android 4.3)는 /data/local/Inst/lib/valgrind/ 퍼미션을 설정하지 않아도 구동하여 사용할 수 있었다.

Inst 디렉터리의 사이즈가 대략 150MB이므로 에뮬레이터의 /data 디렉터리의 용량을 충분하게 잡아줘야 한다.

/data 디렉터리의 용량을 늘리는 방법은 http://dcmru.tistory.com/2511037 글을 참고한다.


동적라이브러리까지 체크를 하기 위해서는 아래와 같은 방법으로 한다.

LD_PRELOAD="/path/to/library.so:/path/to/library1.so" valgrind -v --trace-children=yes --leak-check=full prog-and-args


참고

http://valgrind.org/docs/manual/dist.readme-android.html

http://stackoverflow.com/questions/12621418/valgrind-find-memory-leak-in-a-shared-library

http://abipictures.tistory.com/939


Posted by dcmru
,