移植Valgrind检测Android JNI内存泄漏

1、相关工具

Valgrind:从Valgrind官网下载最新的源码包,我这里用的是:valgrind 3.14.0 (tar.bz2) [17MB] - 9 October 2018.

Ubuntu:V18.04.1_X64(Linux ubuntu 4.15.0-45-generic x86_64)

NDK:android-ndk-r12b-linux-x64

Android手机:ROOT

2、编译步骤

(1)解压源码

#tar -jxvf valgrind-3.14.0.tar.bz2

(2)进入解压文件夹中,查看README.android 了解编译步骤,里面用的Android版本都很旧,不过没关系,新版NDK也能编译。这里简化一下,在工程目录写一个脚本批量执行一下,含义对照README就懂了:

#!/bin/sh

export NDKROOT=/home/kuliuheng/_8GB_EXT/android-ndk-r12b-linux-x64
export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

./autogen.sh

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

  (3)执行编译

make -j4
make -j4 install DESTDIR=`pwd`/Inst

 (4)上一步编译出来的内容都会放到本地的一个名为Inst的目录中,里面是configure配置的三层路径/data/local/Inst,这样直接通过 adb push Inst / 命令就可以推送到Android机器上去了(当然必须要ROOT,否则肯定写不进去)。

3、安装Valgrind到Android手机

#adb shell
#cd /data/local/Inst
/data/local/Inst # chmod -R 777 bin
/data/local/Inst # chmod -R 777 lib
export VALGRIND_LIB="/data/local/Inst/lib/valgrind"

  请注意后面两句很重要,如果这么写的话在我的手机上会遇到一个问题是(而且我的手机无法使用 chmod +x,只能用chmod 777):

valgrind: failed to start tool 'memcheck' for platform 'arm-linux': Permission denied

猜你喜欢

转载自www.cnblogs.com/kuliuheng/p/10600737.html