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..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 bin
/data/local/Inst # chmod -R 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

4、启动Valgrind测试 

  首先请参考下这个文章《Can't run a Java Android program with Valgrind》,这里我抽取出关键步骤来看下:

(1)创建一个启动工具的脚本(包装命令内容,我的APP名称是com.klh.testandroid):

#!/system/bin/sh

PACKAGE="com.klh.testandroid"

# Callgrind tool
#VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=callgrind --callgrind-out-file=/sdcard/callgrind.out.%p' # Memcheck tool
VGPARAMS='-v --error-limit=no --trace-children=yes --log-file=/sdcard/valgrind.log.%p --tool=memcheck --leak-check=full --show-reachable=yes' export TMPDIR=/data/data/$PACKAGE exec /data/local/Inst/bin/valgrind $VGPARAMS $*

(2)将脚本上传到Android手机,并设置权限

> adb push start_valgrind.sh /data/local/Inst/
> adb shell chmod /data/local/Inst/start_valgrind.sh

(3)设置一个包装环境属性,用于启动程序时自动关联Valgrind及日志系统:

adb root
adb shell setprop wrap.com.klh.testandroid "logwrapper /data/local/Inst/start_valgrind.sh"

   请注意这里有两个坑:1、setprop的Key长度不能大于31,Value长度不能大于91,参考文章《How can I overcome the property length limitation of the “adb shell setprop”》;2、我的手机上用adb shell setprop的方式无法设置,会提示错误“usage: setprop <key> <value>”,需要adb shell登录之后单独执行setprop。

(4)启动程序(下面分别是命令行退出和启动App的方式)

adb shell am force-stop com.klh.testandroid
adb shell am start -a android.intent.action.MAIN -n com.klh.testandroid/.MainActivity

移植Valgrind检测Android JNI内存泄漏的更多相关文章

  1. android 常见内存泄漏原因及解决办法

    android常见内存泄漏主要有以下几类: 一.Handler 引起的内存泄漏. 在Android开发中,我们经常会使用Handler来控制主线程UI程序的界面变化,使用非常简单方便,但是稍不注意,很 ...

  2. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  3. [原理] Android Native内存泄漏检测原理解析

    转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...

  4. [教程] Android Native内存泄漏检测方法

    转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...

  5. Android防止内存泄漏以及MAT的使用

    Android发生内存泄漏最普遍的一种情况就是长期保持对Context,特别是Activity的引用,使得Activity无法被销毁.这也就意味着Activity中所有的成员变量也没办法销毁.本文仅介 ...

  6. Android之内存泄漏

    开篇之前,我们要先理解:什么是内存泄漏.百度百科:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等 ...

  7. android性能测试内存泄漏

    1.什么是内存泄漏?     适用于该系统的内存使用内存泄漏,未回复(释放),该内存可以没有事业,也不能被其他人使用使用自己. 2.出有什么差别?    内存泄漏是分配出去的内存无法回收.    内存 ...

  8. Android应用内存泄漏的定位、分析与解决策略

    什么是内存泄漏 对于不同的语言平台来说,进行标记回收内存的算法是不一样的,像 Android(Java)则采用 GC-Root 的标记回收算法.下面这张图就展示了 Android 内存的回收管理策略( ...

  9. 检测应用的内存泄漏情况(shell)

    写代码--调试--修BUG 改来改去可能还存在一些没发现的问题,在工程量大的时候更容易出现,例如内存泄漏这样的问题,严重影响着系统性能. 网上有些检测C程序是否存在内存泄漏的工具还不错的,例如valg ...

随机推荐

  1. 数独_erlang解题代码

    前几天LP玩数独,玩到大师级各种被虐,我看了看说,分分钟帮你做出来, 结果当然没有做出来. 于是上网搜了下数独的解题代码,看了下C的代码,大多是递归之类的(如http://blog.sina.com. ...

  2. 7.6 GRASP原则六: 多态 Polymorphism

    GRASP原则六: 多态 Polymorphism  How to handle alternative behaviors based on type 如何处理依据类型不同而有 不同行为的一类需求 ...

  3. Android测试(三)——APK文件反编译

    APK文件反编译: 在进行反编译操作前,先简单介绍下smali文件: smali是一种文件格式,语法和Jasmine的语言类似,这些smali文件包含开发应用程序时编写的java类的代码. 工具:ja ...

  4. GANs用于文本生成

    上学期期末老师给了我本杂志让我好好看看里面的Gans网络是如何应用在文本生成上的,文章里面也没有介绍原理性的东西,只是说了加入这个Gans模型后效果有多好,给出了模型架构图和训练时所用的语料例子,也没 ...

  5. (02) 第一个springboot程序

    1. 创建一个springboot程序 1. idea 自带的springboot插件 2. 直接从https://start.spring.io 创建好程序下载下来, 之后覆盖你的创建的项目 2. ...

  6. Spring Security Oauth2 单点登录案例实现和执行流程剖析

    Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...

  7. centos安装ruby

    下面开始安装Ruby 一.下载Ruby源码包 wget ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.7.tar.gz 二.解压安装Ruby tar zx ...

  8. 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性:     #类.属性: 调用的就是类中的属性     #对象.属性: 先从自己的内存空间里找名 ...

  9. git 的安装和使用及hithub同步

    作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址 https://github.com/ ...

  10. 截取URL链接中字段的方法

    第一个页面像第二个页面传参方法 location.href = "poster.html?" + "name=" + name + "&tim ...