1. 内存检测工具
1.1 Valgrind
交叉编译
sudo apt-get install automake
./autogen.sh
把 configure中的armv7改成armv7|arm
armv7*)
改成
armv7|arm*)
配置-编译-安装
./configure --prefix=$PWD/install --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc CPP=arm-none-linux-gnueabi-cpp CXX=arm-none-linux-gnueabi-g++
make
make install
把install的整个目录都复制到板子上
export VALGRIND_LIB=/home/me/install/libexec/valgrind
chmod +x /home/me/install/ -R
运行
cd /home/me/install/bin
./valgrind --tool=memcheck ./test
1.2 mtrace
Q:在ARM单板上使用mtrace需要交叉编译吗?
A: 不需要。mtrace是glibc自带的功能,可以直接使用。
Q: ARM单板上没有mtrace目标码,如何直观分析生成的文件?
A: 把文件放在ubuntu上一样可以分析。
使用
代码中添加
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
mtrace(); // 开始跟踪
char *p = (char *)malloc(100);
free(p);
p = NULL;
p = (char *)malloc(100);
muntrace(); // 结束跟踪,并生成日志信息
return 0;
}
编译生成mem文件,传到arm的单板上,要带调试信息,否则不好分析。
arm-none-linux-gnueabi-gcc mem.c -o mem -g
在单板上输入:
export MALLOC_TRACE=mtrace.log
直接运行程序
./mem
程序退出时,自动在当前目录生成mtrace.log文件。
# cat mtrace.log
= Start
@ ./mem:[0x84e0] + 0x1b7b380 0x64
@ ./mem:[0x84f0] - 0x1b7b380
@ ./mem:[0x8500] + 0x1b7b380 0x64
= End
在地址0x1b7b380申请了0x64(100)字节,没有看到释放。要想直观的对应到代码,需要用到mtrace工具。mtrace 工具在单板上没有,ubuntu上的可以直接用。
分析
把目标码mem和mtrace.log都传到ubuntu系统中
输入
xxxx@ubuntu:~/work/test/mem_detect$ mtrace mem mtrace.log
Memory not freed:
-----------------
Address Size Caller
0x0000000001b7b380 0x64 at /home/xxxx/work/test/mem_detect/mem.c:12
xxxx@ubuntu:~/work/test/mem_detect$
即可看到在mem.c的第12行没有释放内存