valgrind使用整理

时间:20180703
参考文献:
https://www.cnblogs.com/AndyStudy/p/6409287.html  valgrind 工具介绍和简单的使用
https://blog.csdn.net/shixin_0125/article/details/78590796 linux工具之检测内存泄漏-valgrind

https://www.cnblogs.com/zhoudayang/p/6110360.html  Valgrind 快速入门

0).前言

内存泄漏是c++程序常见的问题了,特别是服务类程序,当系统模块过多或者逻辑复杂后,很难通过代码看出内存泄漏;
valgrind是一个开源的,检测c++程序内存泄漏有效工具,编译时加上-g选项可以定位到代码行,同时还检查‘野指针’,检查malloc与free是否匹配等功能;
Valgrind 是个开源的工具,功能很多。例如检查内存泄漏工具---memcheck。
Valgrind工具组提供了一套调试与分析错误的工具包,能够帮助你的程序工作的更加准确,更加快速。这些工具之中最有名的是Memcheck。它能够识别很多C或者C++程序中内存相关的错误,这些错误会导致程序崩溃或者出现不可预知的行为。

接下来会以最短的篇幅告诉你如何使用Memcheck来识别你写的程序中的内存错误。你可以从用户手册中获取Memcheck的完整文档以及其他工具的使用说明。

1).Valgrind 安装:

Ununtu:  apt-get install valgrind
嵌入式:(openwrt)
在内核菜单 make menuconfig
Development  --->
<*> valgrind......................... debugging and profiling tools for Linux 
<*>   valgrind-cachegrind                   
<*>   valgrind-callgrind               
<*>   valgrind-drd                          
<*>   valgrind-helgrind                                              
<*>   valgrind-massif. debugging and profiling tools for Linux (heap profiling)

<*>   valgrind-vgdb.... debugging and profiling tools for Linux (GDB interface)

2).Valgrind 命令介绍:

用法: valgrind [options] prog-and-args 
[options]: 常用选项,适用于所有Valgrind工具
    -tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
        memcheck ------> 这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
        callgrind ------> 它主要用来检查程序中函数调用过程中出现的问题。
        cachegrind ------> 它主要用来检查程序中缓存使用出现的问题。
        helgrind ------> 它主要用来检查多线程程序中出现的竞争问题。
        massif ------> 它主要用来检查程序中堆栈使用中出现的问题。
        extension ------> 可以利用core提供的功能,自己编写特定的内存调试工具
    -h –help 显示帮助信息。
    -version 显示valgrind内核的版本,每个工具都有各自的版本。
    -q –quiet 安静地运行,只打印错误信息。
    -v –verbose 更详细的信息, 增加错误数统计。
    -trace-children=no|yes 跟踪子线程? [no]
    -track-fds=no|yes 跟踪打开的文件描述?[no]
    -time-stamp=no|yes 增加时间戳到LOG信息? [no]
    -log-fd=<number> 输出LOG到描述符文件 [2=stderr]
    -log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
    -log-file-exactly=<file> 输出LOG信息到 file
    -log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]

-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port

LOG信息输出
    -xml=yes 将信息以xml格式输出,只有memcheck可用
    -num-callers=<number> show <number> callers in stack traces [12]
    -error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
    -error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]
    -db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
    -db-command=<command> 启动调试器的命令行选项[gdb -nw %f %p]

适用于Memcheck工具的相关选项:
    -leak-check=no|summary|full 要求对leak给出详细信息? [summary]
    -leak-resolution=low|med|high how much bt merging in leak check [low]
    -show-reachable=no|yes show reachable blocks in leak check? [no]

4).测试程序main.c:

下面通过一个简单的程序记录valgrind的用法。
#include <stdio.h>
void f(){
    int * x = malloc(10 * sizeof(int));
    x[10] = 0;  //problem 1: heap block overrun
                //problem 2: memory leak -- x not freed
}
int main(){
    f();
    return 0;
}
 
编译:
gcc main.c -g -o main
在编译程序时开启-g选项来引入调试信息,这样Memcheck的错误信息中能够准确的显示问题代码的序号。如果你能够容忍一些性能损失,请使用-O0选项来编译程序.使用-O1方式来编译程序错误信息可能会不准确,虽然大体而言在使用-O1方式编译的程序上使用Memcheck没有问题,而且相比-O0方式编译的程序而言性能大为提升.不推荐使用-O2或者更高级别来编译程序,因为Memcheck偶尔会误报值未初始化的错误.

下面是使用上述C代码生成程序的makefile文件.
example:example.o
    gcc -o example example.o

example.o:a.c
    gcc -c -O0 -g -Wall a.c -o example.o

.PHONY:clean
clean:
    -rm -rf *.o example

5).调试命令:

命令:
valgrind -v --log-file=valgrind.log --tool=memcheck --leak-check=full --show-mismatched-frees=yes ./main
说明:加--log-file=valgrind.log 会在当前目录下生成日志文件,日志不会在终端打印

[root@hui:/home/test/1test]#valgrind -v --log-file=valgrind.log --tool=memcheck --leak-check=full --show-mismatched-frees=yes ./main
[root@hui:/home/test/1test]#ls
main  main.c  main.c~  valgrind.log

最常用的命令格式:

valgrind --tool=memcheck --leak-check=full ./test


大多数的错误信息和下面的一致,下面展示了内存越界的错误:
==5753== Invalid write of size 4
==5753==    at 0x40053B: f (a.c:5)
==5753==    by 0x40054B: main (a.c:9)
==5753==  Address 0x51fc068 is 0 bytes after a block of size 40 alloc'd
==5753==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5753==    by 0x40052E: f (a.c:4)
==5753==    by 0x40054B: main (a.c:9)
注意:
• 每一个错误有很多信息, 请认真阅读
• 5732是进程ID,这一般不重要
• 第一行Invalid write告诉你出现了哪一种错误.因为内存泄露,程序向本不能访问的内存进行了写入操作.
• 在第一行之后紧跟的堆栈轨迹信息告诉你问题出现的位置. 堆栈轨迹信息可能会非常大,非常令人迷惑,特别是当你使用C++ STL的时候.推荐按照从下到上的顺序进行阅读.如果堆栈轨迹信息不够,可以使用--num-callers选项来扩充堆栈轨迹信息.
• 代码地址(例如:0x40054B) 一般不重要,但是有时在追踪神秘的bug时会很有用.
• 一些错误信息有第二个部分描述了涉及到的内存地址.这一段表明了写入的内存正好在malloc函数分配的内存的后面,对应代码中的第9行.
推荐按照提示的顺序来修复错误.因为后面的错误可能因为前面的错误导致.否则你会觉得Memcheck不好用.
内存泄露信息如下所示:
==5753== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==5753==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5753==    by 0x40052E: f (a.c:4)
==5753==    by 0x40054B: main (a.c:9)
堆栈追踪信息告诉你泄露的内存在哪里分配的.Memcheck不能告诉你为什么内存会泄露.
有几种不同的内存泄露方式,其中最重要的两种类别是:
• "definitely lost": 你的程序泄露了内存,请修复这个错误.
• "probably lost": 你的程序泄露了内存,除非你在"玩弄"指针(例如移动指针到分配的内存块的中间位置)
如果你不理解错误信息,请查询用户手册中关于Memcheck错误信息的说明,其中举例说明了Memcheck产生的所有类型的错误信息.
警告
Memcheck并不完美,它偶尔会误报,有些机制可以抑制这些误报.(请参考用户手册中的减少出错章节).然而,他在99%的情况下都不会出错,所以你需要谨慎地忽略它报告的错误信息.毕竟,你也不会忽略编译器的报警信息.抑制机制对于你不能修改的库代码也有用.默认的抑制会影响库代码中的内存错误.
Memcheck不能够侦测你程序中的所有内存错误.比如,他不能识别越界读,或者对分配到栈区的数组的越界写入.但是它能够识别能导致你程序崩溃的大多数错误.
尝试使你的程序更加清晰,这样Memcheck检测不出错误.当你达到这种状态,你会更容易发现对程序的哪些修改导致Memcheck报告了新的错误.数年的Memcheck使用经验说明,大型程序也能够使用Memcheck. 比如KDE,Firefox等.

6).原理分析

原理:

参考网站:

http://www.linuxidc.com/Linux/2012-06/63754.htm
http://elinux.org/Valgrind (wiki)
http://blog.csdn.net/sduliulun/article/details/7732906
http://blog.csdn.net/gatieme/article/details/51959654(比较全面的介绍)
http://www.linuxidc.com/Linux/2012-06/63754.htm (非常详细的介绍了每个工具的使用)

valgrind使用整理相关推荐

  1. Google Project Zero挖洞经验整理

    1. 目标:漏洞挖掘越来越难 2. 关注客户端,包括安卓,IOS,WINDOWS操作系统,PDF,DOC,AV等等:各种OSS开源代码安全,并且开放了OSS-FUZZ工具: 3. 漏洞削减技术来帮助G ...

  2. 技术文章系列整理(持续更新)

    本博客有很多关于技术的文章,我试着对你可能感兴趣的一些重要文章进行分类. 文章目录 一.基础 二.性能 三.Java接口测试 四.移动端测试 五.DevOps 六.运维 七.团队管理 八.大数据 九. ...

  3. 007 GitHub上整理的一些工具

    GitHub上整理的一些工具 技术站点 不错的书籍 平台工具(都是开源的好东东哦) 爬虫相关(好玩的工具) Web 服务器性能/压力测试工具/负载均衡器 Web 前端相关 大数据处理/数据分析/分布式 ...

  4. FFmpeg - ./configure编译参数全部总结和整理

    1 FFmpge编译参数 本文对FFmpeg4.4.1的./configure的所有编译参数进行了简要说明.在Linux系统上编译FFmpge时总是不太明白应该使用哪一些编译参数,这里以FFmpge4 ...

  5. 程序员优秀学习资料整理(不断更新中)

    如果你发现自己陷入各种新技术.工具包围中,而纠结于该选择哪些学习,读读这篇文章,技术的执念. 综合资源 资源链接汇集 awesome - 各种主流语言的优秀项目汇集 :+1: lists - 资源集合 ...

  6. 字节上岸成功,整理一波测试开发岗的基础知识,含答案

    本科非科班,春招找非技术岗工作失败(无法通过群面)于是秋招转码了.谁又能想到秋招形势严峻比春招还严峻-. 太难了!!!! 8月末开始投简历,9月份开始面了tplink.字节.美团.广立微电子这四家公司 ...

  7. linux内存管理、分析、泄露定位与工具整理

    linux内存管理.分析.泄露定位与工具整理 linux内存管理相关知识 1. 进程的内存申请与分配 2. 当前系统总内存的统计 linux内存分析 linux内存泄漏相关知识 内存泄露的分类 val ...

  8. 混战在帝都的妹纸一枚,整理于Github上的工具合集

    来自:SegmentFault 作者:妹纸一枚 链接:http://segmentfault.com/q/1010000002404545 原标题:GitHub上整理的一些工具,求补充 技术站点 Ha ...

  9. Map再整理,从底层源码探究HashMap

    前言 本文为对Map集合的再一次整理.内容包括:Map HashMap LinkedHashMap TreeHashMap HashTable ConcurrentHashMap Map Map< ...

最新文章

  1. 成功解决TypeError: drop() missing 1 required positional argument: 'labels'
  2. 【转】Oracle回收站(recyclebin)
  3. oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...
  4. 机器学习-吴恩达-笔记-14-应用实例:图片文字识别
  5. 【python】Tkinter窗口可视化二
  6. 冒险岛单机版mysql_冒险岛单机版
  7. 加壳及脱壳《逆向工程》
  8. 串口液晶屏和并口液晶屏的区别
  9. 电脑蓝牙音箱,有效解决笔记本电脑连接不了蓝牙音箱的办法
  10. 手机无线可以上网 电脑却没网络连接服务器,电脑连接手机热点不能上网怎么办 值得一看...
  11. 微信机器人终端1.0未来的设想就是做成telegram一样强大的机器人群体集控终端
  12. 如何使用CSS简单的制作一个视频网站
  13. 如何使用OLED显示图片
  14. Object.setPrototypeOf 与 Object.create() 的区别
  15. linux终端命令格式化硬盘,Ubuntu - 硬盘分区、格式化、自动挂载配置
  16. export default (imported as router) was not found_as也可以用于倒装句,你所不知道的as用法...
  17. 我觉得学习前端前提稍微懂懂英语 虽然我不懂但是我可以多敲
  18. 如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几
  19. PC端桌面倒计时提醒软件
  20. c++益智小游戏《十步万度》

热门文章

  1. c语言遍历枚举,C# Enum 类型遍历
  2. java opencv 提取车牌_opencv 学习之 车牌提取
  3. 创业项目怎么获得专业的投融资服务?
  4. 润和软件携OpenHarmony亮相全国首场华为云云商店·星品推介会
  5. 毕业设计、卷积cnn、lstm、random walk、地址交易识别
  6. 腾讯、网易云、字节跳动面试点总结—AMS在Android起到什么作用?
  7. 打造自己的 APP「冰与火百科」(一):分析定位
  8. 中职学校计算机专业精品课,建设中职学校计算机应用基础精品课程之我见
  9. 远控杂说---总有一款适合你
  10. 2019年二季度书单