1. valgrind检测内存泄漏状况
valgrind功能非常强大,检测内存泄漏,内存初始化等很多问题,但同时valgrind在嵌入式上面对CPU占用会影响性能,而且必须代码退出才能得出结果,不便于动态检测。如果有一些程序,在运行时一直malloc,但是结束都free了, 那这样的程序valgrind也检测不出问题。
2. gcc -fsanitize=address 选项
gcc编译时加上-fsanitize=address,编译好的二进制文件,运行结束打印内存统计信息,类似valgrind
gcc -fsanitize=address -g -o memDebug memDebug.c
3.实时监控内存使用情况
3.1. --wrap功能 gcc -o test main.c -Wl,--wrap,malloc -Wl,--wrap,free 用GCC的wrap功能自己实现malloc和free来监控使用情况
3.2 malloc/free自带功能,在程序调用malloc出来的内存,系统会有一个“记录”,而且在得到的指针前面几个字节会有一些信息,我们可以利用malloc前面几个字节的信息来记录malloc/free的情况。在Linux 32位系统中,前面8字节记录了malloc的时候系统开辟的尺寸信息(如:malloc(0)也能成功,有些系统也开辟了24字节左右的空间),free的时候可以根据这个信息得到free的size,这样就可以动态监控malloc的空间。在Windows debug模式下也有相关信息,甚至还记录有malloc的调用者的信息;在Linux系统也提供了malloc_usable_size函数,用于获取malloc size,但很多嵌入式系统中该函数并没有保留,我们可以通过以下函数获取malloc size. 不同平台需要修改int *ptr = (int *)_ptr - 2;这一行,有的-2,有的-4;
int malloc_usable_size(int* _ptr)
{
int *ptr = (int *)_ptr - 2;
// printf("Free size:%u %x %x %x \n",ptr[0], ptr[1], ptr[2], ptr[3]);
return ptr[0];
}