一个超级实用的源码阅读小技巧

工欲善其事必先利其器;

我发现函数调用图可以让我们更加直观地了解到源码函数直接的调用和层次关系,提高阅读源码的效率 。

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文件,如果想要方便一些,可能还需要自己写脚本实现自动化,如果大佬有更好的办法,欢迎留言区讨论。

(0)

相关推荐

  • 方法重写

    方法重写 重写都是方法的重写,与属性无关 父类的引用可以指向子类,就是new一个子类的对象数据类型可以写为父类,new子类是可以指向父类的 重写的快捷键:Alt+insert 对静态方法调用的时候,调 ...

  • 超级实用的4个电脑小技巧,1分钟教会你成为电脑高手

    现在很多家庭基本都有电脑,比较很多时候工作.学习.娱乐以及一些查询都离不开电脑,很多人都只会对电脑进行简单的操作,但是很多时候实用方便的操作你却一无所知,那么小编今天就来分享几个实用的电脑小技巧,希望 ...

  • 超级实用:前景的使用小技巧!

    讲到构图,你会想到啥? 三分线,九宫格,黄金大法好? 构图的各种招式,谈之不尽- 那我们就先不谈了(诶? -就跟大家分享一些有意思的构图小窍门 今天来讲一个比较喜欢的构图小技巧--前景运用 前景是什么 ...

  • 股市中最精辟的选股公式,涨停板一看一个准(附源码)

    股市给那些缺乏经济基础的人带来了以小钱赚大钱的机会.对那些才高志大者来说,股市简直就是一块经济福地.然而这个"有经验的人获得很多金钱,有金钱的人获得很多经验"的地方杀机四伏,偶有斩 ...

  • 6.17-【超级主图】一个超级实用的主图指标

    友情提醒: 建立稳定交易模式是在股市长期生存的唯一途径, 指标则是帮助建立稳定交易模式的一个有效工具. 欢迎留言区交流 指标仅供学习参考研究之用,不建议直接作为股票买卖依据,可以结合自身经验和大盘环境 ...

  • 一个超级实用的神仙网站,用了就会离不开?

    一个超级实用的神仙网站,用了就会离不开?

  • 超级实用的8个生活小妙方

    超级实用的8个生活小妙方

  • [视频]介绍一个超级实用的单词前缀:out-

    ✏️笔记: 1)out+单词:在这个方面超过某人.比某人更强 2)如: outsmart:比某人聪明 outlive:比某人活得长 outperform:表现.发挥得比某人好 outnumber:数量 ...

  • spark源码阅读--shuffle过程分析 ShuffleManager(一)

    ShuffleManager(一) 本篇,我们来看一下spark内核中另一个重要的模块,Shuffle管理器ShuffleManager.shuffle可以说是分布式计算中最重要的一个概念了,数据的j ...

  • dubbo源码阅读之服务目录

    服务目录 服务目录对应的接口是Directory,这个接口里主要的方法是 List<Invoker<T>> list(Invocation invocation) throws ...