如何使用Valgrind内存检查工具 检查C/C++中内存泄露(一)

如何使用Valgrind内存检查工具 检查C/C++中内存泄露(一)

系统编程的一个主要任务是有效地处理内存相关的问题。你的工作越是靠近系统,那么你就就越需要面对内容相关的问题。 有时候这些问题非常的致命,很多情况下调试内存相关的问题可能变成恶魔。因此,实际使用中有许多工具可以用于调试内存相关的问题。 本文中,我们讨论最流行的开源内存管理框架VALGRIND。 来自Valgrind.org Valgrind是一个用于编译动态分析工具的指令框架。它提供一组工具,可以用于执行调试、性能优化或者帮助你改进程序的类似工作。Valgrind架构是模块化的,因此新的工具可以很容易创建,并且不会影响到已有的结构。 一些有用的工具作为标准提供。 1 memcheck是一个内存错误检测器。它帮助你编译你的程序,特别是让使用C和C++编写的程序更加正确。 2 Cachegrind是一个缓存和测试台预测优化工具。它帮助你的程序运行的更快。 3 Callgrind是一个调用图生成缓存优化工具。它与Cachegrind有一些重叠,但是也收集一些Cachegrind没有的信息。 4 Helgrind是一个线程错误检测器。它帮助你使得多线程程序更加正确。 5 DRD也是一个线程错误检测器,它类似于Helgrind,但是使用不同的分析技术,因此可以发现不同的问题。 6 Massif是一个堆优化工具,它帮助你让你的程序使用更少的内存。 7 DHAT是一个不同类型的堆优化工具,它帮助你发现块生命周期、块使用率和布局的性能低下的问题。 8 SGcheck是一个实验性工具,它能检查出栈和全局数组的交叠。它的功能是Memcheck的补充:SGcheck发现Memcheck不能检查的问题,反之亦然。 9 BBV是一个实验性SimPoint基本块向量生成器,它提供给处理计算机架构研究和开发人员使用。 这里也有一些对许多用户不常使用的工具:Lackey是一个例子工具,说明一些指令的基础;Nulgrind是一个最小Valgrind工具,它不分析或者执行指令,它只用于测试目的。 在本文中,我们只是关注于memcheck工具。 Memcheck工具的使用如下所示: # valgrind –tool=memcheck ./a.out 正如上面命令描述,主要的二进制程序是“Vlagrind”,我们希望使用的工具通过选项”--tool"来指定。“a.out”是一个希望运行mencheck的可执行程序。 这个工具可以检查下面的内存相关的问题。 1)      没有初始化内存的使用; 2)      在释放之后读写内存; 3)      在malloc块结束之后读写内存; 4)      内存泄露 5)      Malloc/new/new[]和free/delete/delete[]不配对使用; 6)      两次释放内存。 注意:上面的列表不全面,但是包括这个工具所能检查的流行问题。 让我们逐一讨论上面的场景: 注意:下面描述的所有的测试代码都使用带有-g选项时能的gcc进行编译(为了在memcheck输出中国生成行号)。正如前面早些时候讨论的《C程序编译成可执行程序》,它必须通过4个不同的阶段。 1 没有初始化内存的使用 代码: #include <stdio.h> #include <stdlib.h> int main(void) {    char *p;    char c = *p;    printf("\n [%c]\n",c);    return 0; } 在上面的代码中,我们试图使用没有初始化的指针“p”。 让我们运行memcheck并且查看下结果。 #  gcc -g val.c -o val # # valgrind --tool=memcheck ./val ==3087== Memcheck, a memory error detector ==3087== Copyright (C) 2002-2009, and GNUGPL'd, by Julian Seward et al. ==3087== Using Valgrind-3.5.0 and LibVEX;rerun with -h for copyright info ==3087== Command: ./val ==3087==  ==3087== Use of uninitialised value of size8 ==3087==    at 0x4004A4: main (val.c:8) ==3087==   [] ==3087==  ==3087== HEAP SUMMARY: ==3087==    in use at exit: 0 bytes in 0 blocks ==3087==  total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==3087==  ==3087== All heap blocks were freed -- noleaks are possible ==3087==  ==3087== For counts of detected andsuppressed errors, rerun with: -v ==3087== Use --track-origins=yes to seewhere uninitialised values come from ==3087== ERROR SUMMARY: 1 errors from 1contexts (suppressed: 4 from 4) 正如上面输出所示,Valgrind检查到没有初始化变量,并且给出警告(查看上面粗体行)。 继续阅读:如何使用Valgrind内存检查工具 检查C/C++中内存泄露(二)
原文地址:http://www.software8.co/wzjs/cpp/1263.html

你可能感兴趣的:(如何使用Valgrind内存检查工具 检查C/C++中内存泄露(一))