1,memcheck
(1),对未初始化内存的使用;
(1),对未初始化内存的使用;
(2),读/写释放后的内存块;
(3)、读/写超出malloc分配的内存块;
(4)、读/写不适当的栈中内存块;
(5)、内存泄漏,指向一块内存的指针永远丢失;
(6)、不正确的malloc/free或new/delete匹配;
(7)、memcpy()相关函数中的dst和src指针重叠
使用方法:
valgrind --leak-check=full ./程序名
2,Callgrind
类似于gprof一样的工具,Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟
Callgrind可以生成程序性能分析的图形,首先来说说程序性能分析的工具吧,通常可以使用gnu自带的gprof,它的使用方法是:在编译程序时添加-pg参数。
例如:
gcc -pg -o tmp tmp.c
gprof使用方法:----
gprof ./tmp | gprof2dot.py |dot -Tpng -o report.png
借助graphviz-2.26.3.tar.gz工具可以绘制图形,内容包括调用关系,调用次数和图形。
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.26.3.tar.gz
再来看 Callgrind的生成调用图过程吧,
执行:valgrind --tool=callgrind ./tmp,-----------------单线程
valgrind --tool=callgrind --separate-threads=yes ./tmp--------多线程
执行完成后在目录下生成"callgrind.out.XXX"的文件这是分析文件,
可以直接利用:callgrind_annotate callgrind.out.XXX 打印结果,
也可以使用:[root@M-192-168-10-225 valgind]# ./gprof2dot.py -f callgrind callgrind.out.26829|dot -Tgif -o report.png 来生成图形化结果:
下面是示例代码
1 /*************************************************************************
2 > File Name: callgrind.cpp
- callgrind.cpp (/home/zhangt 3 > Author:zhangtx
|- function 4 > Mail: 18510665908@163.com
|| f 5 > Created Time: 2015年10月24日 星期六 16时51分45秒
|| l1 6 ************************************************************************/
|| l2 7 #include<iostream>
|| main 8 #include <stdio.h>
9 #include <malloc.h>
~ 10 using namespace std;
~ 11 void f()
~ 12 {
~ 13 int i;
~ 14 for(i=0;i<1000000000;i++)
~ 15 {
~ 16 int count=0;
~ 17 count++;
~ 18 }
~ 19 }
~ 20
~ 21 void l2()
~ 22 {
~ 23 int count=0;
~ 24 for(int i=0;i<1000000000;i++)
~ 25 count=i*2;
~ 26 cout<<endl<<"l2"<<endl;
~ 27 }
~ 28 void l1()
~ 29 {
~ 30 cout<<endl<<"l1"<<endl;
~ 31 l2();
~ 32 }
~ 33 int main()
~ 34 {
~ 35 f();
~ 36 l1();
~ 37 printf("process is over!\n");
~ 38 return 0;
~ 39 }
~ 40
3.Cachegrind
Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。
valgrind --tool=cachegrind 程序名,
4.Helgrind---多线程竞争条件检测
使用方法:
valgrind --leak-check=full ./程序名
2,Callgrind
类似于gprof一样的工具,Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟
Callgrind可以生成程序性能分析的图形,首先来说说程序性能分析的工具吧,通常可以使用gnu自带的gprof,它的使用方法是:在编译程序时添加-pg参数。
例如:
gcc -pg -o tmp tmp.c
gprof使用方法:----
gprof ./tmp | gprof2dot.py |dot -Tpng -o report.png
借助graphviz-2.26.3.tar.gz工具可以绘制图形,内容包括调用关系,调用次数和图形。
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.26.3.tar.gz
再来看 Callgrind的生成调用图过程吧,
执行:valgrind --tool=callgrind ./tmp,-----------------单线程
valgrind --tool=callgrind --separate-threads=yes ./tmp--------多线程
执行完成后在目录下生成"callgrind.out.XXX"的文件这是分析文件,
可以直接利用:callgrind_annotate callgrind.out.XXX 打印结果,
也可以使用:[root@M-192-168-10-225 valgind]# ./gprof2dot.py -f callgrind callgrind.out.26829|dot -Tgif -o report.png 来生成图形化结果:
下面是示例代码
1 /*************************************************************************
2 > File Name: callgrind.cpp
- callgrind.cpp (/home/zhangt 3 > Author:zhangtx
|- function 4 > Mail: 18510665908@163.com
|| f 5 > Created Time: 2015年10月24日 星期六 16时51分45秒
|| l1 6 ************************************************************************/
|| l2 7 #include<iostream>
|| main 8 #include <stdio.h>
9 #include <malloc.h>
~ 10 using namespace std;
~ 11 void f()
~ 12 {
~ 13 int i;
~ 14 for(i=0;i<1000000000;i++)
~ 15 {
~ 16 int count=0;
~ 17 count++;
~ 18 }
~ 19 }
~ 20
~ 21 void l2()
~ 22 {
~ 23 int count=0;
~ 24 for(int i=0;i<1000000000;i++)
~ 25 count=i*2;
~ 26 cout<<endl<<"l2"<<endl;
~ 27 }
~ 28 void l1()
~ 29 {
~ 30 cout<<endl<<"l1"<<endl;
~ 31 l2();
~ 32 }
~ 33 int main()
~ 34 {
~ 35 f();
~ 36 l1();
~ 37 printf("process is over!\n");
~ 38 return 0;
~ 39 }
~ 40
3.Cachegrind
Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。
valgrind --tool=cachegrind 程序名,
4.Helgrind---多线程竞争条件检测
它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。
Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。
valgrind --tool=helgrind ./test
5. Massif
堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。
示例:valgrind --tool=massif --stacks=yes ./test
Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。
valgrind --tool=helgrind ./test
5. Massif
堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。
示例:valgrind --tool=massif --stacks=yes ./test