Valgrind 快速入门
1. 介绍
Valgrind工具组提供了一套调试与分析错误的工具包,能够帮助你的程序工作的更加准确,更加快速。这些工具之中最有名的是Memcheck。它能够识别很多C或者C++程序中内存相关的错误,这些错误会导致程序崩溃或者出现不可预知的行为。
接下来会以最短的篇幅告诉你如何使用Memcheck来识别你写的程序中的内存错误。你可以从用户手册中获取Memcheck的完整文档以及其他工具的使用说明。
2. 准备你的程序
在编译程序时开启-g
选项来引入调试信息,这样Memcheck的错误信息中能够准确的显示问题代码的序号。如果你能够容忍一些性能损失,请使用-O0
选项来编译程序.使用-O1
方式来编译程序错误信息可能会不准确,虽然大体而言在使用-O1
方式编译的程序上使用Memcheck没有问题,而且相比-O0
方式编译的程序而言性能大为提升.不推荐使用-O2
或者更高级别来编译程序,因为Memcheck偶尔会误报值未初始化的错误.
3.在Memcheck下运行你的程序
如果你的程序按照以下方式运行:
myprog arg1 arg2
请使用下述命令来执行内存检查:
valgrind --leak-check=yes myprog arg1 arg2
Memcheck是默认的工具,开启--leak-check
选项会启动内存泄露检查.
你的程序会比正常运行慢很多(大概20到30倍),并且会使用更多的内存.Memcheck会记录检测到的内存错误和内存泄露信息.
4.解释Memcheck的输出信息
这是我们的用于示例的C程序代码,其文件名为a.c,这段代码中有一个内存错误和内存泄露问题.
#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;
}
下面是使用上述C代码生成程序的makefile文件.
example:example.ogcc -o example example.oexample.o:a.cgcc -c -O0 -g -Wall a.c -o example.o.PHONY:clean
clean:-rm -rf *.o example
使用下述命令检查程序中的内存错误:
valgrind --leak-check=yes ./example
大多数的错误信息和下面的一致,下面展示了内存越界的错误:
==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产生的所有类型的错误信息.
5.警告
Memcheck并不完美,它偶尔会误报,有些机制可以抑制这些误报.(请参考用户手册中的减少出错章节).然而,他在99%的情况下都不会出错,所以你需要谨慎地忽略它报告的错误信息.毕竟,你也不会忽略编译器的报警信息.抑制机制对于你不能修改的库代码也有用.默认的抑制会影响库代码中的内存错误.
Memcheck不能够侦测你程序中的所有内存错误.比如,他不能识别越界读,或者对分配到栈区的数组的越界写入.但是它能够识别能导致你程序崩溃的大多数错误.
尝试使你的程序更加清晰,这样Memcheck检测不出错误.当你达到这种状态,你会更容易发现对程序的哪些修改导致Memcheck报告了新的错误.数年的Memcheck使用经验说明,大型程序也能够使用Memcheck. 比如KDE,Firefox等.
6.更多信息
请查询 Valgrind FAQ Valgrind User Manual.使用--tool选项可以使用Valgrind中的其他工具.
转载于:https://www.cnblogs.com/zhoudayang/p/6110360.html
Valgrind 快速入门相关推荐
- Valgrind快速入门指南
Valgrind快速入门指南 介绍 Valgrind工具套件提供了许多调试和分析工具,可帮助您更快更准确地完成程序.这些工具中最受欢迎的名为Memcheck.它可以检测C和C ++程序中常见的许多与内 ...
- Valgrind的Memcheck快速入门
一.前言 对于C/C++程序员来说,关于内存问题真是让人头痛不已,尤其是内存泄露.使用未初始化的局部变量进行跳转或移动等隐形问题.要求程序员养成良好的编码习惯确实很重要,但是人总会出现稀里糊涂的时候, ...
- python和c语言的对比_Python与C语言基础对比(Python快速入门)
原博文 2019-07-05 09:23 − > 代码较长,建议使用电脑阅读本文. # 10分钟入门Python `本文中使用的是Python3` 如果你曾经学过C语言,阅读此文,相信你能迅速发 ...
- Shiro第一个程序:官方快速入门程序Qucickstart详解教程
目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...
- 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧
异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...
- Spring Boot 2 快速教程:WebFlux 快速入门(二)
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...
- Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)
2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...
- 《iOS9开发快速入门》——导读
本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序
BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...
最新文章
- php无法加载Memcache缓存模块问题及Memcache的安装
- 从重采样到数据合成:如何处理机器学习中的不平衡分类问题?
- 决策树-CART算法
- 一键安装zabbix percona mysql插件监控mysql
- HeroKu PaaS模式
- java中final语句_Java中使用非final变量的不可访问语句
- Presenter层如何高度的复用
- Jupyter notebook最简原型界面设计 - ipywidgets与lineup_widget
- 开发必学的验证码,教你从零写一个验证码
- 兄弟們,彈鋼琴不是只有有錢人可以玩的
- 圆弧周长公式_弧长计算公式
- python爬虫图书信息并存入数据库,以及安装工具库
- Sublime Text清除历史记录
- 《Visual Basic.Net 循序渐进》阅读器说明
- 数据产品新人的三大有毒问题,你犯了吗?
- ‘’和“”区别和使用
- 看片会员php源码,会员碎片 · THINKPHP插件 · 看云
- 对薛兆丰经济学思维的研究:价格的教益
- 经常用的命令一(linux)
- OJ每日一练——雇佣兵
热门文章
- 【转】创建SVN仓库的步骤
- Linux中配置bochs
- 纯css的accordion效果
- 【我看Hibernate】Hibernate 介绍及其简单应用
- C#中的空值的判断(转)
- 汽车票销售系统mysql,jsp683客运汽车票网上售票系统mysql
- java无法编译_Java静态方法无法编译
- 循环队列c语言的实现,循环队列的C语言实现
- java客户服务器程序预约口罩_团队作业(二):Github实训:口罩预约
- 计算机设备报废界定,福建省国家税务局关于印发《计算机及其附属设备报废淘汰暂行办法》的通知...