Valgrind 是在linux系统下开发应用程序时用于调试内存问题的工具。它尤其擅长发现内存管理的问题,它可以检查程序运行时的内存泄漏问题。
文章目录
1、Valgrind的安装
在Ubuntu上安装Valgrind我们只需输入相应的命令即可,如下:
一、sudo sudo apt-get install valgrind
二、我们可以在Valgrind的官网上面去下载
Valgrind的官网地址:http://www.valgrind.org/
2、Valgrind一 工具集介绍
Valgrind包含下列工具:
1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
2、callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
3、cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。
4、helgrind:用于检查多线程程序的竞态条件。
5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
6、lackey:
7、nulgrind:
这几个工具的使用是通过命令:valgrand --tool=name 程序名来分别调用的,当不指定tool参数时默认是 --tool=memcheck
3、Valgrind工具Memcheck的介绍
关于Valgrind的工具我只讲Memcheck的使用,因为我们经常使用Memcheck的频率比较多。
Memcheck
用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:
1、对未初始化内存的使用;
2、读/写释放后的内存块;
3、读/写超出malloc分配的内存块;
4、读/写不适当的栈中内存块;
5、内存泄漏,指向一块内存的指针永远丢失;
6、不正确的malloc/free或new/delete匹配;
7、memcpy()相关函数中的dst和src指针重叠
4、 Memcheck的使用示例
我只介绍它的几个使用,剩下的用法都是差不多的
(4.1) 对未初始化内存的使用
代码:
#include <stdio.h>
int main (int argc, char **argv)
{
int *p;
int c =*p;
printf("%d\n", c);
return 0;
}
当我们运行它时会出现以下错误
将程序编译生成可执行文件后执行:valgrind --leak-check=full ./a.out 将会出现以下页面
上面红色的部分就可以看出,我们使用了未初始化的内存,也就是我们经常说的野指针的使用
(4.2)内存泄漏的检测
代码如下:
#include <stdio.h>
#include <stdlib.h>
int *create()
{
return (int *)malloc(sizeof(int));
}
int main (int argc, char **argv)
{
int *p = create();
*p = 100;
return 0;
}
我们运行结果及检测如下:
从上面的图片看出,很明显我们在代码中分配了内存,但是却没有释放内存,如果我们加上free的话,就不存在内存泄漏
代码如下:加上free释放函数
#include <stdio.h>
#include <stdlib.h>
int *create()
{
return (int *)malloc(sizeof(int));
}
int main (int argc, char **argv)
{
int *p = create();
*p = 100;
free(p);
return 0;
}
代码运行结果如下:
其他的使用方法和上面一样,感兴趣的朋友可以自己写几个代码,然后尝试使用以下Valgrind的使用