android 移植valgrind

自己一直在linux下使用valgrind用于应用内存泄漏,网上也找到了宋宝华老师写的有关源码编译移植的文章。我发现在我android编译后out目录里面就有相关的valgrind文件。所以就懒得下载valgrind源码了。

./target/product/g18ref/symbols/system/bin/valgrind
./target/product/g18ref/symbols/system/lib/valgrind
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_tsan-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_core-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/memcheck-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_drd-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/massif-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/helgrind-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_helgrind-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/cachegrind-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_memcheck-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/drd-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/callgrind-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/vgpreload_massif-arm-linux.so
./target/product/g18ref/symbols/system/lib/valgrind/none-arm-linux
./target/product/g18ref/symbols/system/lib/valgrind/tsan-arm-linux

第一行是编译出来的bin文件
我把它放在 android 盒子的 data 目录,
第一行之后的都是valgrind所用的库文件
这个库文件可以随便指定。之后用export VALGRIND_LIB= 指定你库文件路径
我开始移植为了小心就和宋宝华老师放的位置一样,
/data/local/valgrind/lib/valgrind

ls /data/local/valgrind/lib/valgrind/                 
cachegrind-arm-linux
callgrind-arm-linux
default.supp
drd-arm-linux
helgrind-arm-linux
massif-arm-linux
memcheck-arm-linux
none-arm-linux
tsan-arm-linux
vgpreload_core-arm-linux.so
vgpreload_drd-arm-linux.so
vgpreload_helgrind-arm-linux.so
vgpreload_massif-arm-linux.so
vgpreload_memcheck-arm-linux.so
vgpreload_tsan-arm-linux.so

开始运行的时候发现少default.supp文件。
把out/target/product/g18ref/obj/lib/default.supp文件移到valgrind就可以了。

在运行valgrind一定要指定库文件路径

export VALGRIND_LIB=/data/local/valgrind/lib/valgrind
#include <stdio.h>
#include <stdlib.h>

main(int argc, char **argv)
{

    char *p = malloc(5);
    char *q = malloc(10);

    //free(p);
    //free(q);
    //
    return;
}

这是我编写的测试文件一看就有问题。
然后拷贝到android的data目录下。

ls data
lost+found
media
misc
pptv
preinstall_md5
property
resource-cache
ssh
system
user
valgrind
xc

其中 pptv是上面的测试文件 valgrind就是./target/product/g18ref/symbols/system/bin/valgrind文件。千万别把上面测试程序命名 test。
在中断下运行命令

./valgrind --leak-check=full --track-origins=yes  ./pptv  
==6285== Memcheck, a memory error detector ==6285== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==6285== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==6285== Command: ./pptv ==6285== ==6285== ==6285== HEAP SUMMARY: ==6285== in use at exit: 15 bytes in 2 blocks ==6285== total heap usage: 2 allocs, 0 frees, 15 bytes allocated ==6285== ==6285== 5 bytes in 1 blocks are definitely lost in loss record 1 of 2 ==6285== at 0x4897CCC: malloc (in /data/local/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so) ==6285== by 0x1083C7: ??? (in /data/pptv) ==6285== ==6285== 10 bytes in 1 blocks are definitely lost in loss record 2 of 2 ==6285== at 0x4897CCC: malloc (in /data/local/valgrind/lib/valgrind/vgpreload_memcheck-arm-linux.so) ==6285== by 0x1083CD: ??? (in /data/pptv) ==6285== ==6285== LEAK SUMMARY: ==6285== definitely lost: 15 bytes in 2 blocks ==6285== indirectly lost: 0 bytes in 0 blocks ==6285== possibly lost: 0 bytes in 0 blocks ==6285== still reachable: 0 bytes in 0 blocks ==6285== suppressed: 0 bytes in 0 blocks ==6285== ==6285== For counts of detected and suppressed errors, rerun with: -v ==6285== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

发现上面报的错很明显。很好用

你可能感兴趣的:(源码,valgrind)