目录

1. 内存泄漏的产生

2. Valgrind使用的目的

3. 安装 Valgrind 的命令

4. 如何使用Valgrind

5.valgrind 基本选项

6.valgrind错误相关选项。

7.valgrind还能干什么


1. 内存泄漏的产生

内存泄漏(Memory Leak) 是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果!

2. Valgrind使用的目的

Valgrind 是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。在人为编写代码不能预防消除内存泄漏的情况下,使用该工具对代码进行检测。

3. 安装 Valgrind 的命令

sudo apt-get install valgrind

4. 如何使用Valgrind

使用示例程序 malloc.c 

#include <stdlib.h>
int main()
{void *p;p = malloc(20);return 0;
}

malloc申请内存以后没有释放内存
然后输入命令 gcc –g malloc.c -o malloc编译,加入 -g 参数的目的是为了定位在第几行.

执行 valgrind --tool=memcheck --leak-check=full ./malloc,其中 --leak-check=full 指的是完全检查内存泄漏,

得到查询的结果:

==4339== Memcheck, a memory error detector
==4339== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4339== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==4339== Command: ./a.out
==4339==
==4339==
==4339== HEAP SUMMARY:
==4339==     in use at exit: 20 bytes in 1 blocks //退出时使用:1块中20字节
==4339==   total heap usage: 1 allocs, 0 frees, 20 bytes allocated //总堆使用量:1个分配,0个释放,20个字节分配
==4339==
==4339== 20 bytes in 1 blocks are definitely lost in loss record 1 of 1 //1块中的20个字节肯定在1的丢失记录中丢失
==4339==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4339==    by 0x10865B: main (main.c:6)
==4339==
==4339== LEAK SUMMARY:
==4339==    definitely lost: 20 bytes in 1 blocks //确认丢失:1块中20字节
==4339==    indirectly lost: 0 bytes in 0 blocks
==4339==      possibly lost: 0 bytes in 0 blocks
==4339==    still reachable: 0 bytes in 0 blocks
==4339==         suppressed: 0 bytes in 0 blocks
==4339==
==4339== For counts of detected and suppressed errors, rerun with: -v
==4339== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

检测到内存泄漏
其中的含义分别是:

definitely lost:确认丢失。 程序中存在内存泄露,应尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。

indirectly lost:间接丢失。 当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需 直接修复,他们总是与”definitely lost”一起出现,只要修复”definitely lost”即可。例子可参考我的例程。

possibly lost:可能丢失。 大多数情况下应视为与”definitely lost”一样需要尽快修复,除非你的程序 让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运算得到这块内存起始地 址,再释放它。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。

still reachable:可以访问,未丢失但也未释放。 如果程序是正常结束的,那么它可能不会造成程序崩 溃,但长时间运行有可能耗尽系统资源,因此笔者建议修复它。如果程序是崩溃(如访问非法的地址而 崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。

suppressed:已被解决。 出现了内存泄露但系统自动处理了。暂时先无视这类错误。

5.valgrind 基本选项

-h --help 显示所有选项的帮助,包括内核和选定的工具两者。

--help-debug 和–help相同,并且还能显示通常只有Valgrind的开发人员使用的调试选项。

--version 显示Valgrind内核的版本号。

-q --quiet 安静的运行,只打印错误信息。 在进行回归测试或者有其它的自动化测试机制时会非常有用。

-v --verbose 显示详细信息。 在各个方面显示你的程序的额外信息,例如:共享对象加载,使用的重置,执行引擎和工具的进程,异常行为的警告信息。重复这个标记可以增加详细的级别。

-d 调试Valgrind自身发出的信息。 通常只有Valgrind开发人员对此感兴趣。重复这个标记可以产生更详细的输出。如果你希望发送一个bug报告,通过-v -v -d -d生成的输出会使你的报告更加有效。

--tool= [default: memcheck] 运行toolname指定的Valgrind, 例如,Memcheck, Addrcheck, Cachegrind,等等。

--trace-children= [default: no] 当这个选项打开时,Valgrind会跟踪到子进程中。 默认这个选项是关闭的。

--track-fds= [default: no] 当这个选项打开时,Valgrind会在退出时打印一个打开文件描述符的列表。 每个文件描述符都会打印出一个文件是在哪里打开的栈回溯,和任何与此文件描述符相关的详细信息比如文件名或socket信息。

--time-stamp= [default: no] 当这个选项打开时,每条信息之前都有一个从程序开始消逝的时间,用天,小时,分钟,秒和毫秒表示。

--log-fd= [default: 2, stderr] 指定Valgrind把它所有的消息都输出到一个指定的文件描述符中去。 默认值2, 是标准错误输出(stderr)。注意这可能会干扰到客户端自身对stderr的使用, Valgrind的输出与客户程序的输出将穿插在一起输出到stderr。

--log-file= 指定Valgrind把它所有的信息输出到指定的文件中。 实际上,被创建文件的文件名是由filename、’.'和进程号连接起来的(即.),从而每个进程创建不同的文件。

--log-socket= 指定Valgrind输出所有的消息到指定的IP,指定的端口。 当使用1500端口时,端口有可能被忽略。如果不能建立一个到指定端口的连接,Valgrind将输出写到标准错误(stderr)。这个选项经常和一个Valgrind监听程序一起使用。

6.valgrind错误相关选项。

--num-callers= [default: 12] 默认情况下,Valgrind显示12层函数调用的函数名有助于确定程序的位置。 可以通过这个选项来改变这个数字。这样有助在嵌套调用的层次很深时确定程序的位置。注意错误信息通常只回溯到最顶上的4个函数。(当前函数,和它的3个调用者的位置)。所以这并不影响报告的错误总数。
( 这个值的最大值是50。注意高的设置会使Valgrind运行得慢,并且使用更多的内存,但是在嵌套调用层次比较高的程序中非常实用。)

--error-limit= [default: yes] 当这个选项打开时,在总量达到10,000,000,或者1,000个不同的错误,Valgrind停止报告错误。 这是为了避免错误跟踪机制在错误很多的程序下变成一个巨大的性能负担。

--error-exitcode= [default: 0] 指定如果Valgrind在运行过程中报告任何错误时的退出返回值,有两种情况;当设置为默认值(零)时,Valgrind返回的值将是它模拟运行的程序的返回值。当设置为非零值时,如果Valgrind发现任何错误时则返回这个值。
( 在Valgrind做为一个测试工具套件的部分使用时这将非常有用,因为使测试工具套件只检查Valgrind返回值就可以知道哪些测试用例Valgrind报告了错误。)

--show-below-main= [default: no] 默认地,错误时的栈回溯不显示main()之下的任何函数(或者类似的函数像glibc的__libc_start_main(),如果main()没有出现在栈回溯中);这些大部分都是令人厌倦的C库函数。如果打开这个选项,在main()之下的函数也将会显示。

--suppressions= [default: $PREFIX/lib/valgrind/default.supp] 指定一个额外的文件读取不需要理会的错误; 你可以根据需要使用任意多的额外文件。

--gen-suppressions= [default: no] 当设置为yes时,Valgrind将会在每个错误显示之后自动暂停并且打印这一行:----Print suppression ? --- [Return/N/n/Y/y/C/c] ----
( 如果选择是,Valgrind会打印出一个错误的禁止条目,你可以把它剪切然后粘帖到一个文件,如果不希望在将来再看到这个错误信息。)
( 当设置为all时,Valgrind会对每一个错误打印一条禁止条目,而不向用户询问。)
( 这个选项对C++程序非常有用,它打印出编译器调整过的名字。)
--db-attach= [default: no] 当这个选项打开时,Valgrind将会在每次打印错误时暂停并打出这一行:---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----
( 注意:–db-attach=yes与–trace-children=yes有冲突。你不能同时使用它们。Valgrind在这种情况下不能启动。)

--db-command= [default: gdb -nw %f %p] 通过–db-attach 指定如何使用调试器。 默认的调试器是gdb.默认的选项是一个运行时扩展Valgrind的模板。 %f会用可执行文件的文件名替换,%p会被可执行文件的进程ID替换。
( 这指定了Valgrind将怎样调用调试器。默认选项不会因为在构造时是否检测到了GDB而改变,通常是/usr/bin/gdb.使用这个命令,你可以指定一些调用其它的调试器来替换。)
( 给出的这个命令字串可以包括一个或多个%p %f扩展。每一个%p实例都被解释成将调试的进程的PID,每一个%f实例都被解释成要调试的进程的可执行文件路径。 )

--input-fd= [default: 0, stdin] 使用 --db-attach=yes 和 --gen-suppressions=yes 选项,在发现错误时,Valgrind会停下来去读取键盘输入。 默认地,从标准输入读取,所以关闭了标准输入的程序会有问题。这个选项允许你指定一个文件描述符来替代标准输入读取。

--max-stackframe= [default: 2000000] 栈的最大值。 如果栈指针的偏移超过这个数量,Valgrind则会认为程序是切换到了另外一个栈执行。
( 如果在程序中有大量的栈分配的数组,需要使用这个选项。)
( 普遍地,在栈中分配大块的内存是一个坏的主意。因为这很容易用光你的栈空间,尤其是在内存受限的系统或者支持大量小堆栈的线程的系统上,因为Memcheck执行的错误检查,对于堆上的数据比对栈上的数据要高效很多。如果你使用这个选项,你可能希望考虑重写代码在堆上分配内存而不是在栈上分配。)

7.valgrind还能干什么

Memcheck。 这是valgrind应用最广泛的工具,一个重量级的 内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。

Callgrind。 它主要用来检查程序中 函数调用 过程中出现的问题。

Cachegrind。 它主要用来检查程序中 缓存使用 出现的问题。

Helgrind。 它主要用来检 查多线程程序中出现的竞争问题。

Massif。 它主要用来检查程序中 堆栈使用 中出现的问题。

Extension。 可以 利用core提供的功能,自己编写特定的内存调试工具。

简单说说Linux中valgrind进行内存检测相关推荐

  1. linux 省内存的桌面,Linux_在Linux中可视化显示内存占用情况的方法,物理内存不足对Linux桌面系统 - phpStudy...

    在Linux中可视化显示内存占用情况的方法 物理内存不足对Linux桌面系统和服务器系统的性能影响都很大.当你的计算机变慢时,要做的第一件事就是释放内存.尤其是在多用户环境以及执行关键任务的服务器环境 ...

  2. linux监测cpu 内存,Linux中CPU与内存性能监测.docx

    Linux中CPU与内存性能监测(出处://chenleixing/article/details 在系统维护的过程中,随时可能有需要查看 CPU 使用率内存使用情况的需要,尤其是涉及到JVM,程序调 ...

  3. Linux一个内存大页多大,Linux中的“大内存页”(hugepage)是个什么?

    学习 Linux 中的大内存页hugepage.理解什么是"大内存页",如何进行配置,如何查看当前状态以及如何禁用它. 本文中我们会详细介绍大内存页huge page,让你能够回答 ...

  4. linux查服务器总内存大小,怎么查看linux中的可用内存大小

    怎么查看linux中的可用内存大小 发布时间:2020-06-16 13:28:33 来源:亿速云 阅读:620 作者:鸽子 作为Linux用户,特别是管理员,我们需要检查系统使用多少内存资源以及有多 ...

  5. Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个centos7的系统上,free命令的显示内容大概是这样一个状态: 这个 ...

  6. Linux中的常用内存问题检测工具

    原文地址:http://blog.csdn.net/jinzhuojun/article/details/46659155 C/C++等底层语言在提供强大功能及性能的同时,其灵活的内存访问也带来了各种 ...

  7. linux检测内存条损坏,在Linux中检查可用内存的5种方法

    作为Linux用户,特别是管理员,我们需要检查系统使用多少内存资源以及有多少内存资源是空闲的.我们还知道,通过Linux命令行而不是图形用户界面可以更好地实现大多数与管理相关的任务.例如,服务器主要在 ...

  8. linux 系统显示很大,在Linux中可视化显示内存占用情况的方法

    物理内存不足对Linux桌面系统和服务器系统的性能影响都很大.当你的计算机变慢时,要做的第一件事就是释放内存.尤其是在多用户环境以及执行关键任务的服务器环境下,内存消耗会变得更加关键,因为多个用户和应 ...

  9. c++ 进程快照_如何在 Linux 中找出内存消耗最大的进程

    很多次,你可能遇见过系统消耗了过多的内存.如果是这种情况,那么最好的办法是识别出 Linux 机器上消耗过多内存的进程. -- Magesh Maruthamuthu(作者) 很多次,你可能遇见过系统 ...

最新文章

  1. 萤石云 服务器错误 10017
  2. IO流操作-图片操作(二)
  3. 了解 Apache ActiveMQ
  4. Python 实例方法、类方法、静态方法的区别与作用
  5. 【深度学习】PyTorch 中的线性回归和梯度下降
  6. 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)
  7. 理解Go Interface
  8. word List 15
  9. java数组清空能释放jvm内存嘛_JVM面试题汇总
  10. python控制电脑定时开机关机软件_用python写一个windows下的定时关机脚本(推荐)
  11. android 添加字库
  12. 一年读完100本书(5/100)《创新者的窘境》2021-02-25
  13. 我的框架——MyBean
  14. 曲线运动与万有引力公式_考前冲刺,人手一份!高中物理公式大全,不看太亏...
  15. Pspice仿真实验-RC滤波器电路
  16. php抛物线函数,通过JS如何实现抛物线运动(详细教程)
  17. 五、肿瘤全基因组学体细胞结构突变特征(Patterns of somatic structural variation in human cancer genomes)
  18. 魅族手机投屏电脑如何操作
  19. qpython oh下载_QPython OH
  20. ffmpeg 实现 视频与gif互转

热门文章

  1. 关于 Visual stdio 编译报错:error MSB6006: “CL.exe”已退出
  2. UGUI的text赋值问题-速度
  3. 更改ubuntu的默认shell
  4. linux nohup screen注解
  5. RHEL 6.x 搭建企业级FTP
  6. ROS学习之roslaunch的node标签
  7. HDU 2955 Robberies
  8. hdu 5497 Inversion(树状数组)
  9. NYOJ 370 波动序列
  10. NYOJ 286 动物统计