Linux下的检测工具valgrind的使用(memcheck)

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的使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值