使用gprof2dot和graphivz生成程序运行调用图
使用gprof2dot和graphivz生成程序运行调用图
gprof2dot是一个将gprof生成的输出转换为dot脚本的工具。通过给定一个gprof的输出文件,将其转换为生成程序调用图的dot脚本。dot脚本可以生成图像来进行查看。
1、下载gprof2dot工具
gprof2dot工具由JoséFronseca维护,并托管在Google代码(http://code.google.com/p/jrfonseca/w/list),但是这个已经无法访问了。这里提供一个github的地址https://github.com/jrfonseca/gprof2dot.git。
git clone https://github.com/jrfonseca/gprof2dot.git
这个工具需要python环境的支持,请提前安装好python3。
2、使用gprof生成概要分析数据
2.1 gprof简介
Gprof 是GNU gnu binutils工具之一,默认情况下linux系统当中都带有这个工具。
- 可以显示“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。
- 可以显示“Call graph”,包括函数的调用关系,每个函数调用花费了多少时间。
- 可以显示“注释的源代码”--是程序源代码的一个副本,标记有程序中每行代码的执行次数。
2.2 使用gprof生成分析数据
1、在编译的时候使用-pg选项,可以写入makefile中。(链接时不需要)
# 普通程序编译
$ gcc -pg -g source.c -o binary
# cuda程序编译
$ nvcc -Xcompiler“-g -pg”-g -pg -arch = sm_20 source.cu -o binary
2、执行编译出的程序。
执行方式与没有加pg选项前是一样的,执行后将在程序运行目录下生成gmon.out文件。这是一个二进制文件,需要进一步分析生成文本文件。如果已经存在了gmon.out文件,将会被覆盖。
./binary # 必须先运行一遍生成gmon.out文件,后面才能使用gprof工具继续操作
3、用gprof工具生成概要分析数据文件。
$ gprof ./binary> gprof_output.txt
3、生成调用图
配置好gprof2dot运行环境后,就可以使用其来生成dot脚本。
$ graph2dot.py gprof_output.txt> call_graph.dot
我这里是直接使用git克隆下来的,提前安装好了python3和graphivz`,所以直接运行即可。
4、生成可视化的图形
这里需要安装好Graphivz软件。
Windows下可以直接下载安装包安装,或者下载编写版本。
Linux下可以使用下面命令直接安装
# debian系列
sudo apt install graphivz
# Archlinux系列
sudo pacman -S graphivz
# fedora
sudo dnf install graphivz
然后使用dot命令将前面生成的call_graph.dot文件转换为图像文件。
生成png文件
$ dot -Tpng call_graph.dot -o call_graph.png
生成PostScript文件
$ dot -Tps call_graph.dot -o call_graph.ps
如果要生成其他格式的图像,可以使用-T选项指定,支持eps/gif/jpeg/ps/svg/png/ps2/svgz等格式/
如果需要对布局引擎进行选择,可以使用-K进行指定,支持circo/dot/fdp/neato/nop/nop1/nop2/osage/patchwork/sfdp/twopi等。
例如,生成png图像,使用fdp布局引擎的命令如下:
$ dot -Tsvg -Kfdp call_graph.dot -o call_graph.svg
注:布局引擎可以根据自己的喜好选择,个人倾向使用fdp。默认是上下方向布局的,可以在call_graph.dot中添加一行rankdir=LR改为左向右方向布局。
参考
Linux性能評測工具之一:gprof篇
Linux下性能分析工具和内存泄露检测工具的简介(Valgrind和gprof)
gprof_call-graph_visualization
使用gprof2dot和graphivz生成程序运行调用图的更多相关文章
- CodeViz产生函数调用图
一.安装过程 1.CodeViz的安装 0).确认你已经安装Graphviz[ http://www.graphviz.org/] 1).下载CodeViz.[ http://www.csn.ul ...
- calltree看代码调用图
calltree是在linux下面看c代码(尤其是复杂的内核代码)的神器. 推荐 calltree+vim + ctags + cscope + taglist [ vim: 搭建vim看代码的环境 ...
- Python - 运行流程图, call graph, 调用图
解决方案 pycallgraph(感觉直接用pycallgraph grahviz命令生成的图并不是我想要的) 如何去阅读并学习一些优秀的开源框架的源码? - mailto1587的回答 - 知乎 h ...
- Servlet第二篇【Servlet调用图、Servlet细节、ServletConfig、ServletContext】
Servlet的调用图 前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解 Servlet的细节 一个已经注册的Servlet可以被多次映 ...
- calltree+graphviz 绘出项目函数调用图
install calltree: download from http://linux.softpedia.com/progDownload/calltree-Download-971.html f ...
- tracef 安装 跟踪 函数调用图
http://www.prevanders.net/dwarf.html redhat 5.4 tar -zxvf libdwarf-20140519.tar.gz [root@localhost d ...
- 【转】doxygen+graphviz生成工程中的类继承树及函数调用图
转自----hequn8128 在阅读代码量比较多的项目时,类的继承树和函数调用图能够直观地向我们显示类之间或者函数之间的各种关系,方便我们了解程序的整体框架,很多时候可以起到事半功倍的作用.这里尝试 ...
- JAVA call graphs JAVA调用图
https://github.com/gousiosg/java-callgraph Programs for producing static and dynamic (runtime) call ...
- win32内存调用图
https://msdn.microsoft.com/en-us/library/ms810603.aspxhttps://www.codeproject.com/Articles/14525/Hea ...
随机推荐
- JUnit4单元测试入门教程
本文按以下顺序讲解JUnit4的使用 下载jar包 单元测试初体验 自动生成测试类 执行顺序 @Test的属性 下载jar包## 下载地址 在github上,把以下两个jar包都下载下来. 下 ...
- PHP导出大数据
保存到本地 <?php // a db link for queries $lh = mysql_connect( '127.0.0.1', 'root', '' ); // and a con ...
- Ember.js 1.0 RC6 发布,JavaScript 框架
Ember.js 1.0 发布了第 6 个 RC 版本,下载地址:https://github.com/emberjs/ember.js/tree/v1.0.0-rc.6 该版本包含众多的改进记录,详 ...
- Redhat Linux NFS配置
Linux下,All deviceis file,所有的设备都是文件.当我们需要把某些文件夹就或者文件共享给其他用户,就可以使用网络文件系统. 本文介绍Redhat Linux下的NFS配置. 在使用 ...
- 在ASP.NET中支持断点续传下载大文件
IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下 ...
- js将滚动条滚动到指定位置的方法
代码如下(主要是通过设置Location的hash属性): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...
- [asp.net]C#实现json的序列化和反序列化
在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反 ...
- 知乎:GAN 的发展对于研究通用人工智能有什么意义?
https://www.zhihu.com/question/57668112/answer/155367561 Lyken 愿以有涯随无涯 收录于 编辑推荐知乎圆桌 · 296 人赞同了该回答 资历 ...
- 【转】字符编码笔记:ASCII,Unicode 和 UTF-8
原文:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html https://www.key-shortcut.com/ ...
- 【Python】列表(数组)的引用和拷贝
# Python里对象赋值传递的引用 arr=[1,2,3,4,5] newArr=arr arr[1]=9 print('arr='+str(arr)) print('newArr='+str(ne ...