内存检测方法

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行没有释放内存

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值