Ubuntu内存检测工具Valgrind用法详解

检测维修 0 110

参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html

几乎是照抄参考过来的,只不过后面自己调试一下代码。

此处所着重讲述的,乃是Valgrind的某些较为简易的运用方式。而更多详尽完备的使用办法,能够前往valgrind的主页进行访问:http://www.valgrind.org。

运行在Linux上的,包含一个内核、一个软件合成的CPU以及一系列小工具的,基于仿真技术的程序调试和分析工具Valgrind,乃是Julian Seward的作品。

每个工具都可以完成一项任务—调试分析或测试等。

Valgrind能够对内存泄漏以及内存违例加以检测。它还能够针对cache的使用情况展开分析,其具备灵活性且十分强大,是值得去入手的。

一、Valgrind概述

它主要有下列几个工具。

1.Memcheck

运用能够监测程序里出现的内存问题的方式,此方式是最为常用的,借助该方式所有针对内存的读写均会被监测到,并且所有对malloc与free的调用也都会被捕获,由于如此,它能够检测如下问题:

1)对为初始化内存的使用

2)读/写释放后的内存块

3)读/写超出malloc分配的内存块

4)读/写不适当的栈中的内存块

5)内存泄漏,指向一块内存的指针永远丢失

6)不正确的malloc/free或new/delete匹配

7)memcpy相关函数中的dst和src指针重叠

2.Callgrind

有一种和gprof类似的分析工具,它对于程序的运行观察更为细致入微,能够给我们提供更多的信息,它与gprof不同,它不需要在编译源代码的时候添加附加特殊选项,不过加上调试选项是推荐的。

Callgrind会收集程序运行期间的某些数据,进而建立函数调用关系图,并且能够有选择性地开展cache模拟。在运行完毕时,它会将分析数据写入到一个文件之中,而callgrind_annotate能够把此文件的内容转化为可读的形式。

3.Cachegrind

Cache分析器,它对CPU里的一级缓存I1模仿,它对DI进行模拟,它还模拟二级缓存,它可以精准地指明程序当中cache的错过和命中。

要是有需求,它能够给我们供应cache丢失的次数,内存引用的次数,以及每一行代码、每一个函数、每一个模块、整个程序所生成的指令数量,这对于优化程序有着极大的助力。

4.Helgrind

有这样一种工具,它被用来检测多线程程序当中出现的那种竞争的问题,这种工具是Helgrind,它会去寻找内存里那些被多个线程访问,与此同时又未曾一贯进行加锁操作的区域。这些区域通常是线程之间呈现出失去同步的状况,并且还会致使出现一些难以被发觉的错误。

关于名为“Eraser”的竞争检测算法,Helgrind不光实现了它,还做了进一步改进,以此减少了报告错误的次数。然而,Helgrinf迄今为止依旧处于实验阶段,这一点是毋庸置疑的。

5.Massif

有一种堆栈分析器,其可以测量程序于堆栈里使用数量多少的内存,告知我们堆块、堆管理块以及栈方面的大小情况。Massif能够助力我们降低内存的使用,在现如今那些代用虚拟内存为特点的现代系统当中,它还能够促使我们程序运行速度加快,削减程序停留在交换区之中的概率,这一点是勿庸置疑的并且是很明确的事实。

另外,lackey与nulgrind也将会供给,lackey属于小型工具,运用频率很低,而nulgrind仅仅是给开发者呈现怎样去打造一个工具。

二、使用Valgrind

先来进行安装,在我的服务器之上,已然完成安装的状态,不清楚,针对所有的linux而言,是否都内在附带这个事物。

命令格式如下:

valgrind

valgtind-options

your-prog

your-prog options

比如:

-h  显示帮助信息

–version用来展现内核版本信息,(我不清楚为何并非是-v)。

-q 安静的运行,只打印错误信息

-tool=

default:memcheck

在后面接上工具名的情况下,是最常用的选项。要是省略了工具名那默认运行memcheck了。

比如下面的程序:

#include
#include
void fun()
{
         int *x = malloc(10 * sizeof(int));
         x[10] = 0;
}
int main()
{
         int i = 99;
         fun();
         printf("i = %d\n", i);
         return 0;
}

存在两个问题:

1)没有free掉申请的资源

2)fun函数里面越界了,x是非法的

下面演示如何使用valgrind中的memcheck:

在进行调用这个操作的时候,还能够去加上这样的工具工具名为,$valgrind,其工具参数为–tool,赋值为memcheck,然后再 ./malloc这些内容。

==28308== 中的28308表示程序运行时的进程号。

存在无效的大小为4的写入操作,这意味着非法写入,接下来要说明的是告知我们错误发生地点的内容,此内容所指位置是在main中被调用的fun函数。

说明了堆的情况,可以看到,申请了一些字节,是40个,再后面提到,有1个申请,然而,0个被free。

堆积泄露境地的说明事项,确切遗失的字节数量为四十之数,形成LEAK SUMMARY。

要是main之中的i未被赋予值,此处还会存有一些别的错误,具体的能够自行去尝试一番。这得运用到实际的项目当中方可更加好地理解。

下面就是i没有赋值的错误信息截取了部分:

下述介绍一批别样用法,我是依照参考进行学习的,至于具体怎样应用到实际项目里,仍需自身去领会:

测试下面时,main函数中的i我改为了没有赋值:

1.出现差错之时,valgrind就会自行开启调试器(通常为gdb)。

2.下面来试试callgrind:

能看到有一个文件被生成了(绿色框框部分)。在 callgrind 运行你的程序之际,还能够借助 callgrind_control 去观察程序的执行情况,并且不会对它的运行造成干扰:

相关推荐: