valgrind支持的工具:memcheck  addrcheck cachegrind Massid helgrind  Callgrind
运行时必须指明想用的工具,如果省略工具名,默认运行memcheck
1,memcheck
1),使用未初始化的内存
2),读/写已经被释放的内存
3),读/写内存越界
4),读/写不恰当的内存栈空间
5),内存泄露,指向一块内存的指针永远丢失
6),使用malloc/new/new[]和free/delete/delete[]不匹配
7),memcpy()相关函数中的src和dst的内存重叠
常用选项:--leak-check=<no|summary|yes|full> [default:summary]

2,cachegrind

cache剖析器,模拟执行CPU中的L1,D1和L2 cache,可以很精准的支出戴拿中的cache未命中。可以打印cache未命中的次数、内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块。可以打印每一行机器码的未命中次数。

3,helgrind

查找多线程中的竞争数据
寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。

4,Callgrind

收集程序运行时的一些数据,函数调用关系等信息,汉可以有选择的进行cache模拟,在运行结束后,它会把分析数据写入一个文件,callgrind_annotate可以吧这个文件的内容转化成可读的形式

一般用法:

valgrind --tool=callgrind ./test   会在当前目录下生成callgrind.out.[pid]

killall callgrind   结束程序

callgrind_annotate --auto=yes callgrind.out.[pid] > log

vi  log

5,Massif

堆栈分析器,能测量程序在堆栈中使用了多少内存

6,lackey

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

Valgrind的参数(所有工具都适应)

--tool=<name>
-h --help
--version
-q --quiet     安静的运行,只打印错误信息
--verbose     更详细的信息
--trace-children=<yes|no> 跟踪子进程,默认no
--trace-fds=<yes|no>    跟踪打开的文件描述符,默认no
--time-stamp=<yes|no>    增加时间戳到LOG信息,默认no
--log-fd=<number>     输出log信息到文件描述符
--log-file-exactly=<file>   输出log信息到file
--xml=yes         将信息以xml格式输出,只有memcheck可用
--num-callers=<number>
--error-exitcode=<number>  如果发现错误则返回错误码
--db-attach=<yes|no>    当出现错误,valgrind会自动启动调试器,默认no
--db-command=<command>   启动调试器的命令行选项
valgrind(memcheck)包含7类错误
1,illegal read/illegal write errors  
 提示信息:[invalid read of size 4]
2,use of uninitialised values 
  提示信息:[Conditional jump or move depends on uninitialised value]
3,use of uninitialised or unaddressable values in system calls  
  提示信息:[syscall param write(buf) points to uninitilaised bytes]
4,illegal frees  
  提示信息:[invalid free()]
5,when a heap block is freed with an inappropriate deallocation function  
  提示信息:[Mismatched free()/delete/delete[]]
6,overlapping source and destination blocks
  提示信息:[source and destination overlap in memcpy(,)]
7,memory leak detection
 1),still reachable 
    内存指针还在还有机会使用或释放,指针指向的动态内存还没有被释放就退出了
 2),definitely lost 
    确定的内存泄露,已经不能访问这块内存
 3),indirectly lost 
    指向该内存的指针都位于内存泄露处
 4),possibly lost 
    可能的内存泄露,仍然存在某个指针能够快速访问某块内存,但该指针指向的已经不是内存首位置
Invalid write of size 1 : 堆内存越界访问
Source and destination overlap in memcpy : 内存重叠
Invalid free() / delete / delete[]  : 重复释放
Use of uninitialised value of size 4 : 非法指针
HEAP SUMMARY:堆内存使用摘要
LEAK SUMMARY : 泄露摘要
ERROR SUMMARY: 错误总数
--trace-fds=yes
FILE DESCRIPTORS:3 OPEN AT EXIT :文件描述符

内存检查原理



检测原理:
1,当要读写内存中的某个字节时,首先检查这个字节对应的A bit。如果该A bit显示该位置是无效位置,memcheck则会报告读写错误
2,内核(core)类似于一个虚拟的CPU环境,这样当内存中的某个字节被加载到真实的CPU时,该字节对应的V bit也会被加载到虚拟的CPU环境中。一旦寄存器中的值,被用来产生内存地址,或者该值能够影响程序输出,则memcheck会检查对应的V bits,如果该值尚未初始化,则会报告使用未初始化内存错误。

valgrind的使用、原理相关推荐

  1. valgrind基础

    valgrind 官网 原理 官网解释 Your program is then run on a synthetic CPU provided by the Valgrind core. As ne ...

  2. HeadFirstC笔记_6  数据结构与动态存储:牵线搭桥

    保存可变数量的数据 由于数组长度是固定的,为了保存可变数量的数据,需要一个比数组更灵活的东西,即链表. 链表就是一连串的数据 链表是一种抽象数据结构.链表是通用的,可以用来保存很多不同类型的数据,所以 ...

  3. valgrind的说明使用和原理

    编译 #gcc -g -o test test.c 内存检查 #valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./tes ...

  4. 【linux】Valgrind工具集详解(十):SGCheck(检查栈和全局数组溢出)

    一.概述 SGCheck是一种用于检查栈中和全局数组溢出的工具.它的工作原理是使用一种启发式方法,该方法源于对可能的堆栈形式和全局数组访问的观察. 栈中的数据:例如函数内声明数组int a[10],而 ...

  5. 【linux】Valgrind工具集详解(六):使用Valgrind gdbserver和GDB调试程序

    一.概述 在Valgrind下运行的程序不是由CPU直接执行的.相反,它运行在Valgrind提供的合成CPU上.这就是调试器在Valgrind上运行时无法调试程序的原因. 二.快速入门 在使用Mem ...

  6. 【linux】Valgrind工具集详解(二):入门

    一.使用valgrind 1.安装 安装超级简单: sudo apt-get install valgrind 2.使用 运行valgrind -h可以查看详细使用方法,命令格式如下: valgrin ...

  7. 内存泄漏的定位与排查:Heap Profiling 原理解析

    系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败,这就是典型的内存泄漏问题.这类问题通常难以预测,也很难通过静态代码梳理的方式定位.Heap Profiling 就是帮助我们解决此类问题的 ...

  8. c linux new使内存耗尽_C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

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

  9. valgrind 的使用简介

    一  valgrind是什么? Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架 ...

最新文章

  1. BZOJ4866 Ynoi2017由乃的商场之旅(莫队)
  2. fastdfs上传文件_SpringBoot+FastDFS搭建分布式文件系统
  3. deactivate_sending在创建新的table entry时的作用
  4. python安装后无法使用_Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)...
  5. editplus保存时自动创建备份文件设置关闭
  6. PHP 正则表达式资料
  7. 2.10 m 个样本的梯度下降
  8. linux 驱动编译静态,Linux驱动静态编译和动态编译方法详解
  9. postgresql授权和撤销
  10. quartus仿真27:JK触发器构成的同步十进制可逆计数器(分析)
  11. 1 dhcp服务器的配置文件,Linux1 DHCP服务器配置 主配置文件(dhcpd.conf)
  12. 安装和运行,意思差异应该很明显
  13. STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)
  14. @Aspect 注解使用详解
  15. 把unc0ver.ipa重签名后安装到手机上实现越狱
  16. LAN9220 MII并行接口 PHY设备
  17. th标签内的Cannot resolve ‘msg‘爆红出现的问题
  18. 锤子官方再曝新手机 暗示坚果Pro采用新后壳
  19. 更简单获取到Bean对象(1)
  20. Docker Dashboard

热门文章

  1. Codeforces 940E - Cashback
  2. 三下乡辅导孩子计算机知识,【“三下乡”社会实践活动】计算机学院——每个课程,都是你我成长的故事...
  3. 基于OpenCV的混凝土裂纹检测
  4. 加载组件Already included file name ‘e:/Vuejs/组件/单文件组件/vue_test/src/components/Message.vue‘ differs from
  5. 服务器系统挂安卓游戏吗,云服务器可以挂游戏吗
  6. Access 2007技巧 “伊妹儿”数据采集
  7. 【C语言程序设计】实验 2
  8. 【C语言程序设计】实验 1
  9. 区块链应用开发快速入门
  10. hihoCoder #1558 : H国的身份证号码I