本帖最后由 YMC 于 2016-11-17 09:40 编辑
如题 ,像单片机这样的程序,有没有检查其内存泄露的工具和方法。
网上搜了很多的工具,比如 Valgrind ,用了之后只知道检查linux下的可执行程序,来检查其源码有没有内存泄露。
如果有数组越界和内存泄露都是能跟踪到源码的。但是单片机这样的程序,在linux下该怎么编译处理,真的想不到什么方法。
或是在windows下有没有这种检测工具和方法,网友们有没有这方面的经验,传授下。
------------------------------------------------------------------------------------------------------------------------------
网上Valgrind检查内存泄露的例子 ,和查找结果,这种是gcc编译出的可执行程序来检查内存泄露
------------------------------------------------------------------------------------------------------------------------------
[mw_shl_code=c,true]#include <stdlib.h>
int* func(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; //问题1: 数组下标越界
}
int main(void)
{
int* x=NULL;
x=func();
//free(x);
x=NULL;
return 0; //问题2: 内存没有释放
} [/mw_shl_code]
说明
Invalid write of size 4:表示数组越界写了4字节
40 bytes in 1 blocks:表示因程序退出而发生内存泄露40字节
头次听说“内存泄漏”,围观。
首先,STM32常用的IC是无法运行linux系统的(F7我不确认),在单片机这么小ram的系统上,是不推荐使用标准的malloc和free函数的,因为标准库的算法会导致内存的不连续,导致内存本来够用,却无法分配内存的现象(MMU很重要,Linux也是需要有MMU才可以运行的)。所以一般都是自己分配一个内存池来实现动态内存的管理~其次,对于题主的问题,如何防止内存泄露,在这种小系统上开发更多依托的不是工具,而且开发人员的软件设计和开发习惯来做边界检查。对于内存越界的情况,stm32设计了hardfault中断的机制,用于检查一些内存非法操作~另外,如果你使用了arm自家的RTOS,KEIL提供了堆栈检查的一些代码和工具,可以帮助你检查rtos的内存状况。PS:一般对于内存的检查在linux系统上是依靠工具的,google的gtest是一套专门用于C/C++白盒测试的软件框架,有完善的内存检查功能,题主可以了解下,当然也是运行在linux系统下的工具
谢谢详细的解释和介绍
请问原子哥综合实验不用官方malloc是不是因为经常导致内存泄漏?
一周热门 更多>