Ubuntu1804 源码阅读神器,egypt+graphviz 图形化显示函数调用关系(超详细+图文并茂)
函数调用图可以让我们更加直观地了解到源码函数直接的调用和层次关系,提高阅读源码的效率,工欲善其事,必先利其器;
文章目录
1 前言
看源码的时候,心血来潮想弄一下函数之前的调用关系,想起以前doxygen
配合graphviz
使用可以生成比较直观的函数调用关系图,但是前提是函数的注释需要严格按照doxygen
的规范,具体可以自己去搜索一下,当然使用source insight
等利器也很方便;本文主要通过gcc
+egypt
+graphviz(dot)
三个工具轻松生成源码的函数调用关系图;下图是本人在阅读FreeRTOS
源码tasks.c
时生成的调用关系图,具体如下所示;
2 graphviz 安装
Graphviz (Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。
ubuntu下可以直接安装;
sudo apt-get install graphviz
成功安装
graphviz
,这里我们就可以使用dot
工具了,具体使用方法如下;
3 egypt 安装
egypt官网: http://www.gson.org/egypt/
下载后的文件为
egypt-1.10.tar.gz
;找到文件所在路径;
sudo find \ -name egypt-1.10.tar.gz
然后解压:
sudo tar -xvf egypt-1.10.tar.gz
解压得到egypt-1.10
;
cd egypt-1.10 && sduo chmod +x egypt
最终可以看到文件结构如下;
将egypt
移动到/usr/bin
,方便后面直接调用,或者将当前egypt
所在路径添加到环境变量中;
sudo cp egypt /usr/bin
以上,已经完成了egypt
的安装;
使用方法如下;
egypt [--omit function,function,...] [--include-external] <rtl-file>... | dotty -
egypt [--omit function,function,...] [--include-external] <rtl-file>... | dot <dot-options>
4 测试
编写程序test.c
,具体如下所示;
#include <stdio.h>
void test0();
void test1();
void test2();
void test3();
int main()
{
test1();
test2();
test3();
return 0;
}
void test0(void){
printf("hello");
}
void test1(void)
{
test0();
}
void test2(void)
{
test1();
}
void test3(void)
{
}
编译需要加上参数-fdump-rtl-expand
生成相应的dump文件;
gcc -fdump-rtl-expand -c test.c
这里有我们需要的文件
test.c.229r.expand
;
输入如下指令;
egypt test.c.229r.expand | dot -T png -o test.png
最终生成了顺利生成test.png
,具体如下图所示;
5 结论
对C语言源码的阅读用这个办法还是有点小麻烦,无法一键生成调用关系,另外还需要gcc编译源码生成dumpfile
文件,如果想要方便一些,可能还需要自己写脚本实现自动化,本人能力有限,如果大佬有更好的办法,欢迎留言告知;
笔者能力和水平有限,文中难免有错误和纰漏之处,请大佬们不吝赐教;
创作不易,如果本文帮到了您;
如果本文帮到了您,请帮忙点个赞Ubuntu1804 源码阅读神器,egypt+graphviz 图形化显示函数调用关系(超详细+图文并茂)的更多相关文章
- Android源码阅读技巧--查找开发者选项中显示触摸操作源码
在开发者模式下,在开发者选项中,可以勾选“显示触摸操作”,然后只要点击屏幕就会在点击的位置有圈圈显示.如何找到绘制圈圈的代码部分,有什么技巧来阅读代码量这么大的android系统源码呢?以下请跟着小老 ...
- Apache Spark源码走读之3 -- Task运行期之函数调用关系分析
欢迎转载,转载请注明出处,徽沪一郎. 概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚运行着的task其输入的数据从哪获取,处理的结果返回到哪里,如何 ...
- fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...
- JDK 1.8源码阅读 TreeMap
一,前言 TreeMap:基于红黑树实现的,TreeMap是有序的. 二,TreeMap结构 2.1 红黑树结构 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗 ...
- JDK 1.8源码阅读 HashMap
一,前言 HashMap实现了Map的接口,而Map的类型是成对出现的.每个元素由键与值两部分组成,通过键可以找对所对应的值.Map中的集合不能包含重复的键,值可以重复:每个键只能对应一个值. 存储数 ...
- JDK 1.8源码阅读 HashSet
一,前言 类实现Set接口,由哈希表支持(实际上是一个 HashMap集合).HashSet集合不能保证的迭代顺序与元素存储顺序相同.HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依 ...
- JDK 1.8源码阅读 LinkList
一,前言 LinkedList是一个实现了List接口和Deque接口的双端链表.有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端. LinkedL ...
- JDK 1.8源码阅读 ArrayList
一,前言 ArrayList是Java开发中使用比较频繁的一个类,通过对源码的解读,可以了解ArrayList的内部结构以及实现方法,清楚它的优缺点,以便我们在编程时灵活运用. 二,ArrayList ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
随机推荐
- 空间小姐姐生活照,我用python破解加密压缩包,无忧查看
事情的经过是这样的: 又是奶茶,行吧行吧. 快点开工,争取李大伟回来之前搞定. 李大伟说是6位数字密码 那么我们可以利用python生成全部的六位数字密码 #生成从000000到99999的密码表f ...
- cool-yogurt小组采访感想
“对于这个小组项目的选题,其实最初的那个版本我还是被“感动”到的,因为我自己以前确实有这样的类似体验和需求,以前非常喜欢一个球星,因此想知道关于他所有的事情,想知道他每一场比赛的数据,新闻有哪些报道, ...
- F - Robot Motion 栈加BFS
A robot has been programmed to follow the instructions in its path. Instructions for the next direct ...
- C. Standard Free2play --div
https://codeforces.com/contest/1238/problem/C 题意:下台阶的时候只有一种方式,拉动当前台阶x的 level,然后当前的台阶关闭,调到下边的台阶x-1,如果 ...
- vue2.x学习笔记(十七)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12616847.html. 动态组件&异步组件 在前面学习组件基础的时候学习过动态组件,官方文档给出过一个例 ...
- [护网杯2018] easy_laravel
前言 题目环境 buuoj 上的复现,和原版的题目不是完全一样.原题使用的是 nginx + mysql 而 buuoj 上的是 apache + sqlite composer 这是在 PHP5.3 ...
- SVM家族(一)
SVM家族简史 故事要从20世纪50年代说起,1957年,一个叫做感知器的模型被提出, 1963年, Vapnikand Chervonenkis, 提出了最大间隔分类器,SVM诞生了. 1992年, ...
- 一图了解redis
了解redis,这一张图就够了,话不多说,看图: 版权所有,转载请注明出处,欢迎讨论交流
- B站百大UP主党妹被黑客勒索!!!
4月27日,哔哩哔哩视频网站的UP主“机智的党妹”发布消息称,自己被黑客勒索了.她的视频表示:“事发突然,我被勒索了,你也有可能继续被诈骗!这种诈骗的页面是由病毒程序自动生成并留在那里的.”根据她的介 ...
- Spring Boot中的测试
文章目录 简介 添加maven依赖 Repository测试 Service测试 测试Controller @SpringBootTest的集成测试 Spring Boot中的测试 简介 本篇文章我们 ...