Valgrind使用方法及举例(代码和效果以后补充)

一、Valgrind是什么

Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等

不管是使用哪个工具,valgrind在开始之前总会先取得对你的程序的控制权,从可执行关联库里读取调试信息。然后在valgrind核心提供的虚拟CPU上运行程序,valgrind会根据选择的工具来处理代码,该工具会向代码中加入检测代码,并把这些代码作为最终代码返回给valgrind核心,最后valgrind核心运行这些代码。

valgrind是高度模块化的,所以开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。

 

二、Valgrind怎么用

使用方法
 valgrind --tool=toolname program args
 例如
 valgrind --tool=memcheck ls -l
默认情况下,tool=memcheck
 

三、Valgrind怎么用

1.可使用的工具如下:

(1)cachegrind是一个缓冲模拟器。它可以用来标出你的程序每一行执行的指令数和导致的缓冲不命中数。
(2)callgrind在cachegrind基础上添加调用追踪。它可以用来得到调用的次数以及每次函数调用的开销。作为对cachegrind的补充,callgrind可以分别标注各个线程,以及程序反汇编输出的每条指令的执行次数以及缓存未命中数。
(3)helgrind能够发现程序中潜在的条件竞争。
(4)lackey是一个示例程序,以其为模版可以创建你自己的工具。在程序结束后,它打印出一些基本的关于程序执行统计数据。
(5)massif是一个堆剖析器,它测量你的程序使用了多少堆内存。
(6)memcheck是一个细粒度的的内存检查器。
(7)none没有任何功能。它它一般用于Valgrind的调试和基准测试。

2.编译要求

(1)在编译程序的时候打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即使最好的valgrind工具也将中能够猜测特定的代码是属于哪一个函数。打开调试选项进行编译后再用valgrind检查,valgrind将会给你的个详细的报告,比如哪一行代码出现了内存泄漏。
(2)一些编译优化选项(比如-O2或者更高的优化选项),可能会使得memcheck提交错误的未初始化报告,因此,为了使得valgrind的报告更精确,在编译的时候最好不要使用优化选项。

 

三、Memcheck工具

1.主要作用

(1)检测内存泄漏
(2)对非法内存地址的访问
(3)读取未初始化区域
(4)其它问题

 

2.特点

(1)程序运行结束后才会显示结果
(2)能打印堆栈信息,具体到某一行
(3)合并重复的信息

 

四、Valgrind的特点

1.优点

(1)检测对象程序在编译时无须指定特别的选项,也不需要连接特别的函数库
(2)valgrind被设计成非侵入式的,它直接工作于可执行文件上,因此在检查前不需要重新编译、连接和修改你的程序。要检查一个程序很简单,只需要执行下面的命令就可以了
(3)valgrind模拟程序中的每一条指令执行,因此,检查工具和剖析工具不仅仅是对你的应用程序,还有对共享库,GNU C库,X的客户端库都起作用。

 

2.缺点

(1)不同工具间加入的代码变化非常的大。在每个作用域的末尾,memcheck加入代码检查每一片内存的访问和进行值计算,代码大小至少增加12倍,运行速度要比平时慢25到50倍。

 

你可能感兴趣的:(Valgrind使用方法及举例(代码和效果以后补充))