Valgrind编译使用检查Android Native程序

Android系统使用Java/C++/C编写。 Dalvik虚拟机集成了垃圾回收机制,内存使用不易出错,通常就是一个本该被释放的对象却被另一对象长时间持有着。对这类问题,IDE(Eclipse和Android Studio)都有很好的分析工具。但很多Android程序、算法移植等出于性能和安全考虑,通过JNI调用了Native程序。
这些Native程序使用C/C++编写,没有Java的垃圾回收机制,而且可以使用指针直接对内存进行操作,因此容易出现内存泄露、缓冲区溢出等内存使用方面的错误。Valgrind很适合这类问题。

  1. 下载source code http://valgrind.org/downloads/
  2. 根据平台参照README写build.sh,这里android armv7平台,详细如下
#!/bin/sh

export NDKROOT=/home/hanpeng/android/android-ndk-r6
export HWKIND=generic

# export VALGRIND_LIB=/home/hanpeng/workspace/valgrind-3.13.0/.in_place
# for ARM64

# export NDKROOT=/home/hanpeng/android/android-ndk-r10c
# export AR=$NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar 
# export LD=$NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld
# export CC=$NDKROOT/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc

# CPPFLAGS="--sysroot=$NDKROOT/platforms/android-21/arch-arm64 -DANDROID_HARDWARE_$HWKIND" CFLAGS="--sysroot=$NDKROOT/platforms/android-21/arch-arm64" ./configure --prefix=/data/local/Inst/lib/valgrind --host=aarch64-unknown-linux --target=aarch64-unknown-linux --with-tmpdir=/sdcard

# # for ARM
export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc

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

make -j8
make -j8 install DESTDIR=`pwd`/valgrind

到valgrind下执行build.sh,成功会生成执行文件和连链接库如下:
这里写图片描述
之后push 到对应平台目录/data/local/valgrind下。
export VALGRIND_LIB=/data/local/valgrind/lib/valgrind/

valgrind使用:
valgrind命令的格式如下:
valgrind [valgrind-options] your-prog [your-prog options]
/data/local/valgrind/bin/valgrind –tool=memcheck ./XXX

valgrind-options详解
1. 工具集:
memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
helgrind:用于检查多线程程序的竞态条件。
massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
通过–tool=name 程序名来分别调用的,当不指定tool参数时默认是 –tool=memcheck

valgrind  -v --error-limit=no --trace-children=yes --track-fds=yes --log-fie=/sdcard/<YOUR PROGRAM NAME>.%p.valgrind.log --tool=memcheck --leak-check=full --track-origins=yes <YOUR PROGRAM NAME>

参考:
http://valgrind.org/
https://blog.csdn.net/yanghao23/article/details/7514587
https://blog.csdn.net/Roland_Sun/article/details/46049485

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值