https://windmissing.github.io/linux/2016-02/valgrind-memcheck.html

一、valgrind

1. Valgrind是什么

Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等

不管是使用哪个工具,valgrind在开始之前总会先取得对你的程序的控制权,从可执行关联库里读取调试信息。然后在valgrind核心提供的虚拟CPU上运行程序,valgrind会根据选择的工具来处理代码,该工具会向代码中加入检测代码,并把这些代码作为最终代码返回给valgrind核心,最后valgrind核心运行这些代码。

valgrind是高度模块化的,所以开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。

2. valgrind tool是什么

valgrind提供多种内存检测方法,用于检测不同的数据,满足不同的使用需求

可使用的工具如下:

(1)cachegrind是一个缓冲模拟器。它可以用来标出你的程序每一行执行的指令数和导致的缓冲不命中数。

(2)callgrind在cachegrind基础上添加调用追踪。它可以用来得到调用的次数以及每次函数调用的开销。作为对cachegrind的补充,callgrind可以分别标注各个线程,以及程序反汇编输出的每条指令的执行次数以及缓存未命中数。

(3)helgrind能够发现程序中潜在的条件竞争。

(4)lackey是一个示例程序,以其为模版可以创建你自己的工具。在程序结束后,它打印出一些基本的关于程序执行统计数据。

(5)massif是一个堆剖析器,它测量你的程序使用了多少堆内存。

(6)memcheck是一个细粒度的的内存检查器。

(7)none没有任何功能。它一般用于Valgrind的调试和基准测试。

3. Valgrind怎么用
(1)安装
yum install valgrind
(2)运行
valgrind --tool=toolname args-val program args-pro

例如

valgrind --tool=memcheck ls -l

--tool选项,用于选择valgrind tool中的一种,后面接tool的名字。可以不加这个参考,则默认使用memcheck。

args-val选项,这是指valgrind可以添加的参数,用于配置单次运行时的特殊需求。

可以通过valgrind -h查看参数的各类的作用。

program选项,用于指定检测程序对象。valgrind对目标program的编译过程有些要求:

(1)打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即使最好的valgrind工具也将中能够猜测特定的代码是属于哪一个函数。打开调试选项进行编译后再用valgrind检查,valgrind将会给出具体到某一行的详细报告。

(2)关闭编译优化选项(比如-O2或者更高的优化选项)。这些优化选项可能会使得memcheck提交错误的未初始化报告,因此,为了使得valgrind的报告更精确,在编译的时候最好不要使用优化选项。

args-pro选项,运行program所需要的参数。

memcheck

1.valgrind memcheck是什么

memcheck是valgrind tool的一种,是一个细粒度的的内存检查器。它可以检测以下问题:

1)使用未初始化的内存

2)读/写已经被释放的内存

3)读/写内存越界

4)读/写不恰当的内存栈空间

5)内存泄漏

6)使用malloc/new/new[]和free/delete/delete[]不匹配。

7)src和dst的重叠

2.运行
valgrind --tool=memcheck program args-pro

valgrind  program args-pro
3.输出信息

(1)版本信息,其中==中间的数字(31549)是valgrind的进程ID,也是program的进程ID,它们是同一个进程。

==31549== Memcheck, a memory error detector
==31549== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==31549== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==31549== Command: ./uninit1
==31549==

后面的内容需要等程序运行结束才会出现。

(2)错误信息,不同的错误将出现不同的内容,下方将详细解说。

(3)总结

==31549== HEAP SUMMARY:
==31549== in use at exit: 0 bytes in 0 blocks
==31549== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==31549==
==31549== All heap blocks were freed -- no leaks are possible
==31549==
==31549== For counts of detected and suppressed errors, rerun with: -v
==31549== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 2 from 2)
使用举例
1.使用未初始化的内存

《valgrind memcheck 使用未初始化的内存》

2.读/写已经被释放的内存

《valgrind memcheck 读/写已经被释放的内存》

3.读/写内存越界

《valgrind memcheck 读/写内存越界》

4.读/写不恰当的内存栈空间

其它几篇都有读/写不恰当内存栈空间的例子

5.内存泄漏

《valgrind memcheck 内存泄漏》

6.使用malloc/new/new[]和free/delete/delete[]不匹配

《valgrind memcheck 使用malloc/new/new[]和free/delete/delete[]不匹配》

7.src和dst的重叠
测试代码
#include <iostream>
using namespace std; #include "string.h" void test1()
{
char ch[10] = "abcdefghi";
char *p1 = ch;
char *p2 = ch + 3;
memcmp(p1, p2, 5);
} int main()
{
test1();
return 0;
}
编译及运行
g++ -g -o overlap val-overlap.cpp
valgrind --leak-check=full /home/vagrant/git_hub/windmissing.github.io/_posts/code/overlap
检测结果
==29405== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
检测结果解读

对于不涉及到写的情况,src和dst重叠不算是问题

四、Valgrind的特点

1.优点

(1)检测对象程序在编译时无须指定特别的选项,也不需要连接特别的函数库

(2)valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序。要检查一个程序很简单,只需要执行下面的命令就可以了

(3)valgrind模拟程序中的每一条指令执行,因此,检查工具和剖析工具不仅仅是对你的应用程序,还有对共享库,GNU C库,X的客户端库都起作用。

(4)能打印堆栈信息,具体到某一行

(5)合并重复的信息

2.缺点

(1)不同工具间加入的代码变化非常的大。在每个作用域的末尾,memcheck加入代码检查每一片内存的访问和进行值计算,代码大小至少增加12倍,运行速度要比平时慢25到50倍。

(2)程序运行结束后才会显示结果

valgrind memcheck使用方法及效果(转)的更多相关文章

  1. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  2. 【转】 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

    系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工具来 ...

  3. 如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

      系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦.所以,在实践中会用到很多工 ...

  4. Valgrind memcheck 8种错误实例

    调不尽的内存泄漏,用不完的Valgrind Valgrind 安装 1. 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2 2. 解压安装包:tar –jxvf ...

  5. 利用ListView的基本方法实现效果

    日常的开发工作经常需要ListView作为布局的组件,而且很多时候都会遇到需要自定义ListView的情况. 也有些问题并不需要自定义的ListView,基于原生的ListView就能实现,但需要灵活 ...

  6. [ javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中 ] javascript canvas isPointInPath(x,y) 判断点是否在最后绘制的图形中方法演示 效果之三

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  7. Valgrind: memcheck of memleak/mem-uninitialization; massif usage

    first install valgrind, its newest ver is 3.11, and stops updating since 2015/12. in centos, yum ins ...

  8. 在flask中使用swagger(flasgger使用方法及效果展示)

    一. 部分代码及效果 from flask import Flask from flasgger import Swagger import config app = Flask(__name__) ...

  9. javascript 实现函数/方法重载效果

    什么是重载? 在C#和JAVA等编程语言中函数重载是指在一个类中可以定义多个方法名相同但是方法参数和顺序不同的方法,以此来实现不同的功能和操作,这就是重载. JS没有重载,只能模拟重载 一般来说,如果 ...

随机推荐

  1. 使用SonarQube和SonarQube Scanner分析项目

    一.概述 SonarQube的安装,请参考链接:https://www.cnblogs.com/xiao987334176/p/12011623.html 配置好sonar的服务端后,接下来就要使用s ...

  2. SSM基本配置详解

    需要查看SSM基本依赖和完整配置文件的到:SSM基本配置及依赖 示例项目:SSMDemo 1 Spring IOC容器配置 1.1 applicationContext.xml 1.1.1 配置数据源 ...

  3. 使用python远程连接数据库

    根据web连接服务的原理,我们可以通过一台电脑连接我们另一台电脑上的数据库 一.开启数据库的权限1.Mysql:1)修改访问权限首先修改可以访问的ip,把‘localhost’全部修改为‘%’,打开c ...

  4. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  5. golang学习笔记---string && strconv

    1.字符串的组成?Golang的字符串都是由单个字节连接起来的,每个字节都是UTF8编码标识的Unicode文本.(不需要在考虑中文不兼容问题) 2.如何遍历字符串?先看一个例子: package m ...

  6. jquery动画控制非css属性

    JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...

  7. 排序算法Java代码实现(三)—— 插入排序 和 希尔排序

    因为希尔排序的核心思想是插入排序,所以本篇将两篇排序一起记录 本篇内容: 插入排序 希尔排序 (一)插入排序 算法思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序 ...

  8. 基于DockerSwarm 部署InfluxDB并使用JAVA操作

    Docker中部署InfluxDB 1.运行容器 $ docker run --rm \ -e INFLUXDB_DB=db0 -e INFLUXDB_ADMIN_ENABLED=true \ -e ...

  9. golang下载图片,而非预览

    1 前言 网上查询使用html5,a增加属性download和使用表单get,post提交,都是只能预览,根本原因是返回值需要加入头 w.Header().Add("Content-Type ...

  10. 记一次CSS反爬

    目标网址:猫眼电影 主要流程 爬取每一个电影所对应的url 爬取具体电影所对应的源码 解析源码,并下载所对应的字体 使用 fontTools 绘制所对应的数字 运用机器学习的方法识别对应的数字 在源码 ...