O.S使用Gnu gprof进行Linux平台下的程序分析
Gprof简介:
Gprof功能:打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。产生程序运行时候的函数调用关系,包括调用次数,可以帮助程序员分析程序的运行流程。
有了函数的调用关系,这会让开发人员大大提高工作效率,不用费心地去一点点找出程序的运行流程,这对小程序来说可能效果不是很明显,但对于有几万,几十万代码量的工程来说,效率是毋庸置疑的!而且这个功能对于维护旧代码或者是分析Open Source来说那是相当诱人的,有了调用图,对程序的运行框架也就有了一个大体了解,知道了程序的“骨架“,分析它也就不会再那么茫然,尤其是对自己不熟悉的代码和Open Source。费话不多说了,让我们开始我们的分析之旅吧!
Gprof实现原理:
通过在编译和链接你的程序的时候(使用-pg编译和链接选项),gcc在你应用程序的每个函数中都加入了一个名为mcount ( or “_mcount” , or “__mcount” ,依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount,而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间、调用次数等等的所有信息。
Gprof基本用法:
1.使用-pg编译和链接你的应用程序。
2.执行你的应用程序使之生成供gprof分析的数据。
3.使用gprof程序分析你的应用程序生成的数据。
Gprof简单使用:
让我们简单的举个例子来看看Gprof是如何使用的。
1.打开linux终端。新建一个test.c文件,并生用-pg编译和链接该文件。
test.c文件内容如下:
引文:
#include "stdio.h"
#include "stdlib.h"
void a(){
printf("/t/t+---call a() function/n");
}
void c(){
printf("/t/t+---call c() function/n");
}
int b() {
printf("/t+--- call b() function/n");
a();
c();
return 0;
}
int main(){
printf(" main() function()/n");
b();
}
命令行里面输入下面命令,没加-c选项,gcc会默认进行编译并链接生成a.out:
引文:
[linux /home/test]$gcc -pg test.c
如果没有编译错误,gcc会在当前目录下生成一个a.out文件,当然你也可以使用–o选项给生成的文件起一个别的名字,像gcc –pg test.c –o test ,则gcc会生成一个名为test的可执行文件,在命令行下输入[linux /home/test]$./test,就可以执行该程序了,记住一定要加上./否则程序看上去可能是执行,可是什么输出都没有。
2.执行你的应用程序使之生成供gprof分析的数据。命令行里面输入:
引文:
[linux /home/test]$a.out
main() function()
+--- call b() function
+---call a() function
+---call c() function
[linux /home/test]$
你会在当前目录下看到一个gmon.out文件,这个文件就是供gprof分析使用的。
3.使用gprof程序分析你的应用程序生成的数据。
命令行里面输入:
引文:
[linux /home/test]$gprof -b a.out gmon.out | less
由于gprof输出的信息比较多,这里使用了less命令,该命令可以让我们通过上下方向键查看gprof产生的输出,|表示gprof -b a.out gmon.out的输出作为less的输入。下面是我从gprof输出中摘抄出的与我们有关的一些详细信息。
引文:
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 a
0.00 0.00 0.00 1 0.00 0.00 b
0.00 0.00 0.00 1 0.00 0.00 c
Call graph
granularity: each sample hit covers 4 byte(s) no time propagated
index % time self children called name
0.00 0.00 1/1 b [2]
[1] 0.0 0.00 0.00 1 a [1]
-----------------------------------------------
0.00 0.00 1/1 main [10]
[2] 0.0 0.00 0.00 1 b [2]
0.00 0.00 1/1 c [3]
0.00 0.00 1/1 a [1]
-----------------------------------------------
0.00 0.00 1/1 b [2]
[3] 0.0 0.00 0.00 1 c [3]
-----------------------------------------------
Index by function name
[1] a [2] b [3] c
从上面的输出我们能明显的看出来,main调用了b函数,而b函数分别调用了a和c函数。由于我们的函数只是简单的输出了一个字串,故每个函数的消耗时间都是0秒。
使用gprof分析程序
gprof介绍
gprof是一个GNU profiler工具。可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间,也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。还可以显示“注释的源代码”--是程序源代码的一个复本,标记有程序中每行代码的执行次数。
基本用法:
1.使用-pg选项编译和链接你的应用程序。
2. 执行你的应用程序,使之运行完成后生成供gprof分析的数据文件(默认是gmon.out)。
3. 使用gprof程序分析你的应用程序生成的数据,例如:gporf a.out gmon.out。
gprof实现原理:
gprof并不神奇,在编译和链接程序的时候(使用-pg编译和链接选项),gcc在你应用程序的每个函数中都加入了一个名为mcount(or“_mcount”, or“__mcount”)的函数,也就是说-pg编译的应用程序里的每一个函数都会调用mcount,而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
常用的gprof命令选项:
-b不再输出统计图表中每个字段的详细描述。
-p只输出函数的调用图(Call graph的那部分信息)。
-q只输出函数的时间消耗列表。
-e Name不再输出函数Name及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个-e标志。一个-e标志只能指定一个函数。
-E Name不再输出函数Name及其子函数的调用图,此标志类似于-e标志,但它在总时间和百分比时间的计算中排除了由函数Name及其子函数所用的时间。
-f Name输出函数Name及其子函数的调用图。可以指定多个-f标志。一个-f标志只能指定一个函数。
-F Name输出函数Name及其子函数的调用图,它类似于-f标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个-F标志。一个-F标志只能指定一个函数。-F标志覆盖-E标志。
-z显示使用次数为零的例程(按照调用计数和累积时间计算)。
使用注意:
1)一般gprof只能查看用户函数信息。如果想查看库函数的信息,需要在编译是再加入“-lc_p
1 下载
http://code.google.com/p/jrfonseca/wiki/Gprof2Dot
http://jrfonseca.googlecode.com/svn/trunk/gprof2dot/gprof2dot.py下载gprof2dot.py
http://www.graphviz.org/Download_source.php下载源代码graphviz-2.18.tar.gz
2 环境
[admin@b2bsearch80 bin]$ python-V
Python2.3.4
[admin@b2bsearch80 bin]$gcc-v
Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.6/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
Thread model: posix
gcc version 3.4.6 20060404 (Red Hat3.4.6-3)
[admin@b2bsearch80 bin]$ uname -a
Linuxb2bsearch802.6.9-42.ELsmp #1 SMP Wed Jul 12 23:27:17 EDT 2006 i686 i686 i386 GNU/Linux
3 安装
Chmod744 gprof2dot.py
Tar-zxvfgraphviz-2.18.tar.gz
./configure
make
su-
make install
4 编译代码
gcc -pg-g-ouniqueCoreDumpuniqueCoreDump.c
5 执行代码生成gmon.out
执行命令产生gmon.out文件
./uniqueCoreDump
ll gmon.out
如果gprof./uniqueCoreDump有:
gmon.out file is missing call-graph data
则表示没有正确的编译选项或者只有一个main函数
6 生成图片
gprof./uniqueCoreDump| ./gprof2dot.py -n0 -e0 | dot -Tpng -o output.png
sz output.png
分享到:
相关推荐
《Tom Swans GNU C++ for Linux》是一本深入讲解如何在Linux环境下使用GNU C++进行编程的资源集合。这份压缩包文件包含了一系列关于C++编程和GNU工具链的知识点,适用于那些希望在开源操作系统上提升C++编程技能的...
12. **性能分析和优化**:讲解如何使用gprof、valgrind等工具分析程序性能,以及优化代码的策略。 13. **编程实践**:通过实际项目案例,引导读者将所学知识应用于实际开发中,提升解决实际问题的能力。 通过《GNU...
《GNU/Linux编程指南(第二版)》是一本深入探讨Linux操作系统下编程实践的权威书籍,旨在帮助开发者理解和掌握在GNU/Linux环境下进行软件开发的核心技术。本书涵盖了从基础的编程概念到高级的系统调用和程序优化等...
7. **程序性能分析**:通过`strace`、`gprof`等工具分析程序的系统调用和性能瓶颈,优化代码执行效率。 8. **安全编程**:理解权限模型,避免缓冲区溢出、路径遍历等常见安全问题,使用安全的编程习惯和库函数。 ...
Linux性能评测工具中的gprof是一个强大的分析工具,它可以帮助开发者识别程序中的性能瓶颈。gprof是GNU编译器工具包的一部分,通常在Linux系统中已经预装。它的主要功能是收集和分析程序运行时的统计信息,以便于...
在C编程中,性能分析是优化程序的关键...总之,通过对C程序使用gprof进行性能分析,开发者能更好地理解程序运行的内在细节,找到性能瓶颈,从而提高程序效率。学习和掌握gprof的使用,对于提升C语言编程技能至关重要。
gprof是GNU项目中的一个性能分析工具,它可以收集C和C++程序的运行时性能数据,并生成一个以函数调用关系为线索的性能报告。通过这个报告,开发者可以了解到程序中哪些函数消耗的时间最多,从而找到性能瓶颈。然而,...
《GNU/Linux编程指南(第二版)》是一本深入探讨Linux开发系统的权威著作,旨在帮助读者理解和掌握在GNU/Linux环境下进行程序设计的各种技术和方法。这本书详细介绍了UNIX输入和输出的实例,使得开发者能够熟练运用...
总的来说,《GNU/Linux应用编程》第二版是一部全面而深入的教程,它不仅教授了Linux环境下的编程技能,还涵盖了操作系统原理、网络通信、进程管理等多个方面,对于希望在Linux平台上开发应用程序的程序员来说,是一...
16. 性能分析:使用`gprof`或`valgrind`等工具分析代码性能,找出瓶颈并进行优化。 六、最佳实践 17. 编程规范:遵循良好的编码风格,如K&R风格,提高代码可读性。 18. 版本控制:利用Git进行版本管理,确保代码...
gprof是GNU项目中的一款强大的性能分析工具,它能够帮助开发者对C、C++、Pascal、Fortran等语言编写的程序进行性能分析,以识别程序中的性能瓶颈。在Linux、AIX、Sun等操作系统上,gprof通过收集程序运行时的采样...
gprof是GNU提供的一个分析程序运行时间的工具,它可以分析程序的调用图,给出函数的执行时间、调用次数等信息,帮助开发者定位性能瓶颈,进行代码优化。 6. **ld**:链接器 ld是GNU的链接器,负责将编译器生成的...
- **性能分析工具**:介绍gprof、valgrind等性能分析工具的使用方法,辅助开发者找出程序中的瓶颈所在。 - **代码调试技巧**:通过实际案例演示如何利用GDB等调试工具定位和解决程序运行时出现的问题。 - **代码...
- 如gprof、valgrind等,用于分析程序的运行时间、内存使用情况等。 4. **代码质量管理** - 包括编码规范检查、复杂度分析、代码覆盖率统计等,确保代码质量。 #### 总结 本指南涵盖了Linux编程的基础知识、...
Linux平台开发资料主要涵盖的是在Linux操作系统环境下进行软件开发的相关知识。Linux作为一种开源、免费的操作系统,被广泛应用于服务器、嵌入式设备以及各种开发环境中。以下是对这一主题的详细阐述: 1. **Linux...
GDB(GNU Debugger)是一种功能强大的调试工具,可以对嵌入式 Linux 应用程序进行调试和分析。GDB 提供了多种调试方式,包括断点、单步执行、变量查看等,可以帮助开发者快速定位和解决问题。 4. 内存工具 内存...
8. **性能优化**:了解如何使用GCC的编译选项进行性能优化,例如-O2或-O3优化级别,以及如何使用gprof等工具分析程序性能。 9. **多线程编程**:C++11引入了标准的线程库,CygWin支持这些标准,使得在Windows上可以...
GCC支持跨平台编译,通过配置选项可以生成适用于不同架构的代码,例如:`--target=i686-pc-linux-gnu`用于生成适用于i686架构的Linux程序。 总结,GCC中文手册详尽地阐述了GCC的使用方法,涵盖了从基本编译到高级...