如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测
2015-12-22 10:55
375 查看
英文原文:How to Detect Memory Leaks Using Valgrind memcheck Tool for C / C++
系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。所以,在实践中会用到很多工具来调试内存问题。 在本文中,我们将讨论最流行的开源内存管理框架 VALGRIND。 摘自 Valgrind.org: Valgrind是用于构建动态分析工具的探测框架。它包括一个工具集,每个工具执行某种类型的调试、分析或类似的任务,以帮助完善你的程序。Valgrind的架构是模块化的,所以可以容易地创建新的工具而又不会扰乱现有的结构。 |
许多有用的工具被作为标准而提供。 Memcheck是一个内存错误检测器。它有助于使你的程序,尤其是那些用C和C++写的程序,更加准确。 Cachegrind是一个缓存和分支预测分析器。它有助于使你的程序运行更快。 Callgrind是一个调用图缓存生成分析器。它与Cachegrind的功能有重叠,但也收集Cachegrind不收集的一些信息。 Helgrind是一个线程错误检测器。它有助于使你的多线程程序更加准确。 DRD也是一个线程错误检测器。它和Helgrind相似,但使用不同的分析技术,所以可能找到不同的问题。 Massif是一个堆分析器。它有助于使你的程序使用更少的内存。 DHAT是另一种不同的堆分析器。它有助于理解块的生命期、块的使用和布局的低效等问题。 SGcheck是一个实验工具,用来检测堆和全局数组的溢出。它的功能和Memcheck互补:SGcheck找到Memcheck无法找到的问题,反之亦然。 BBV是个实验性质的SimPoint基本块矢量生成器。它对于进行计算机架构的研究和开发很有用处。 也有一些对大多数用户没有用的小工具:Lackey是演示仪器基础的示例工具;Nulgrind是一个最小化的Valgrind工具,不做分析或者操作,仅用于测试目的。 在这篇文章我们将关注“memcheck”工具。 |
使用 Valgrind Memcheckmemcheck工具的使用方式如下:? 该工具可以检测下列与内存相关的问题 : 未释放内存的使用 对释放后内存的读/写 对已分配内存块尾部的读/写 内存泄露 不匹配的使用malloc/new/new[] 和 free/delete/delete[] 重复释放内存 注意: 上面列出的并不很全面,但却包含了能被该工具检测到的很多普遍的问题. 让我们一个一个地对上面的场景进行讨论: 注意: 下面讨论的所有测试代码都应该使用gcc并且加上-g选项(用来在memcheck的输出中生成行号)进行编译. 就想我们之前讨论过的 C程序被编译成可执行文件, 它需要经历四个不同的阶段. |
1. 使用未初始化的内存Code :? 让我们运行Memcheck来看下结果. ? 2. 在内存被释放后进行读/写Code :? 让我们运行memcheck来看一下Valgrind对这种情况是如何反应的. ? 另注,使用gdb来调试c程序. 3. 从已分配内存块的尾部进行读/写Code :? 现在我们使用Valgrind运行上面的代码 : ? 4. 内存泄露Code:? ? 注意: 在这里我们增加了一个选项‘–leak-check=full’来得到内存泄露的详细细节. |
5. 不匹配地使用malloc/new/new[] 和 free/delete/delete[]Code:? 注意 : 使用g++来编译上面的代码,因为delete操作符是在C++中引进的,而要编译C++需要使用g++. 让我们运行来看一下 : ? 你可以尝试在测试代码中使用'new'和'free'进行组合来看看Valgrind给出的结果是什么. |
6. 两次释放内存
Code :?
?
在本文中,我们把注意力放在了内存管理框架Valgrind,然后使用memcheck(Valgrind框架提供的)工具来了解它是如何降低需要经常操作内存的程序员的负担的. 该工具能够检测到很多手动检测不到的与内存相关的问题
相关文章推荐
- 【c/c++】内存地址
- 谈下C++编程题和c语言中a/3*3的意义
- 【c/c++】void指针
- effective c++学习笔记
- C语言全局变量那些事儿
- VMware下的RHEL 6.4 安装gcc和gcc-c++
- C++ 定义适应不同平台调用不同代码的方法
- C++标准转换运算符 :reinterpret_cast <new_type> (expression)
- C++中的运算符重载
- struct和class 在C/C++/C#
- C++中map、hash_map、unordered_map、unordered_set通俗辨析
- c语言项目感慨
- lintcode 判断一个单链表是否有环及环的链接点
- C++ 的全局构造与析构函数
- 【c/c++】printf函数
- c++异常处理机制
- C++处理异常技巧-try,catch,throw,finally
- Visual C++6.0 程序设计从入门到精通(二) - MFC应用程序的启动和运行机制
- 跨平台CMake的编写
- c++实现大数乘法