• 移植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

    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 777 /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
  • 相关阅读:
    登录模块(前端bookstrapValidator校验+加密+后台加密+后台验证)
    spring+springmvc+mybatis+redis 实现两重数据缓存
    spring+springmvc+mybatis+redis实现缓存
    获取网页上的所有QQ号码,并生成exel报表
    单点登录(因为原理一样,所以没有实现注销)
    solr 基本命令二(权重查找)
    solr 搭建 (基于solr-5.0.0)
    OC 添加导航栏item
    xcode 一些三方库版本警告 iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99.
    Swift UITextView设置富文本点击, 取消一切点击事件(放大镜/复制粘贴/删除等等)
  • 原文地址:https://www.cnblogs.com/kuliuheng/p/10600737.html
Copyright © 2020-2023  润新知