Valgrind
Valgrind是一款用于内存调试,内存泄漏检测以及性能分析的软件开发工具。
安装
安装命令:apt-get install valgrind
安装成功后,查看安装版本号命令:valgrind -h --version
使用valgrind下的工具的命令格式:valgrind --tool = memcheck --leak-check = full ./test
查看其他命令:valgrind -h
Valgrind的的使用手册:PDF下载 https://download.csdn.net/download/wjb123sw99/10889351
MEMCHECK工具
Memcheck是一个内存错误检测器。它可以检测C和C ++程序中常见的以下问题;
在Valgrind的命令行上指定,MEMCHECK是默认工具,所以使用时可以省略--tool = MEMCHECK;
主要功能是检测下列情况:
(1):不合法内存访问,例如内存释放后又访问;
(2):使用未定义的值;
(3):内存错误释放或者未释放,例如的malloc /新和自由/删除错配;
(4):类似的memcpy的函数的SRC和DST指针使用同一个内存地址;
(5):类似的malloc的函数,大小值输入为负数;
(6):内存泄漏。
测试代码:
/* main.c */
#include <stdio.h>
#include <stdlib.h>
void test()
{
char *p = (char *)malloc(1024);
}
int main()
{
test();
return 0;
}
编译命令:gcc main.c -o test
测试命令:valgrind --leak-check=full ./test
分析:
在堆总结HEAP SUMMARY栏我们可以看到提示:
如图1所示,堆在程序退出后依然有1024比特的内存在使用;
2,在堆的总结中可以看到,共申请了一次内存,释放了0次,1024byte的内存被申请过;
3,有1024byte绝对已丢失,丢失的位置在主和测试函数里
在内存泄漏总结LEAK SUMMARY栏我们可以看到提示:
1,肯定丢失绝对丢失definitely lost栏:必定有1024bytes内存已泄露
2,间接丢失间接丢失indirectly lost栏:0字节内存泄漏
3,可能丢失可能丢失possibly lost栏:0字节内存泄漏
4,仍然可达仍然可达still reachable栏:0字节内存泄漏
5,抑制suppressed栏:0bytes内存泄露
一般一款程序进行测试主要看前三项definitely lost、indirectly lost、possibly lost;
必须保证definitely lost、indirectly lost为0bytes;
possibly lost最好也过一遍,但不需要保证0bytes;