自己一直在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)
发现上面报的错很明显。很好用