0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

FPGA之家 来源:小麦大叔 作者:小麦大叔 2021-05-29 11:50 次阅读

工欲善其事必先利其器;

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

1 前言

看源码的时候,心血来潮想弄一下函数之前的调用关系,想起以前doxygen配合graphviz使用可以生成比较直观的函数调用关系图,但是前提是函数的注释需要严格按照doxygen的规范,具体可以自己去搜索一下,当然使用source insight等利器也很方便;

本文主要通过gcc+egypt+graphviz(dot)三个工具轻松生成源码的函数调用关系图;下图是本人在阅读FreeRTOS源码tasks.c时生成的调用关系图,具体如下所示;

43fc1100-bfcf-11eb-9e57-12bb97331649.png

一个例子

2 graphviz 安装

Graphviz (Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。ubuntu下可以直接安装;

sudo apt-get install graphviz

直接输入指令后,系统开始安装;

4412a564-bfcf-11eb-9e57-12bb97331649.png

成功安装graphviz,这里我们就可以使用dot工具了,具体使用方法如下;

4438cd5c-bfcf-11eb-9e57-12bb97331649.png

3 egypt 安装

egypt官网: http://www.gson.org/egypt/

446a9030-bfcf-11eb-9e57-12bb97331649.png

简洁的首页

下载后的文件为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

最终可以看到文件结构如下;

44bf782a-bfcf-11eb-9e57-12bb97331649.png

将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

44eb97de-bfcf-11eb-9e57-12bb97331649.png

这里有我们需要的文件test.c.229r.expand;

输入如下指令;

egypt test.c.229r.expand | dot -T png -o test.png

最终生成了顺利生成test.png,具体如下图所示;

44f4efa0-bfcf-11eb-9e57-12bb97331649.png

最终调用关系图

5 结论

C语言源码的阅读用这个办法还是有点小麻烦,无法一键生成调用关系,,

另外还需要gcc编译源码生成dumpfile文件,如果想要方便一些,可能还需要自己写脚本实现自动化,如果大佬有更好的办法,欢迎留言区讨论。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136885
  • GCC
    GCC
    +关注

    关注

    0

    文章

    107

    浏览量

    24847
  • 源码
    +关注

    关注

    8

    文章

    641

    浏览量

    29221
  • 函数
    +关注

    关注

    3

    文章

    4332

    浏览量

    62638

原文标题:一个超级实用的源码阅读小技巧

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SSM框架的源码解析与理解

    SSM框架(Spring + Spring MVC + MyBatis)是种在Java开发中常用的轻量级企业级应用框架。它通过整合Spring、Spring MVC和MyBatis三框架,实现了
    的头像 发表于 12-17 09:20 265次阅读

    libmodbus源码框架分析

    libmodbus作为优秀且免费开源的跨平台支持RTU 和 TCP模式的Modbus开发库,非常值得大家借鉴和学习。本章对libmodbus源代码进行阅读和分析。
    的头像 发表于 11-21 13:47 368次阅读
    libmodbus<b class='flag-5'>源码</b>框架分析

    基于无操作系统的STM32单片机开发附源码

    现在非常多的的MCU性能都还不错,同时用户也会去扩展些外部RAM,这样如果高效便捷的管理这些内存是重要话题。 今天给大家分享源码
    的头像 发表于 11-15 11:24 470次阅读

    手搓了ESP32墨水屏阅读器,蛮简单的

    工程名称:3.7寸墨水屏阅读器时钟温湿度TXT/Epub前言帅小伙手搓ESP32墨水屏阅读器!可轻松续航100天!01阅读器功能/亮点?1.具有阅读器、时钟、温湿度监测、闹钟、番茄钟功
    的头像 发表于 05-27 08:04 331次阅读
    手搓了<b class='flag-5'>一</b><b class='flag-5'>个</b>ESP32墨水屏<b class='flag-5'>阅读</b>器,蛮简单的

    什么是源码源码有什么作用?源码组件是什么?源码可二次开发吗?

    源码,也称为源程序,是指未编译的按照定的程序设计语言规范书写的文本文件,是系列人类可读的计算机语言指令。
    的头像 发表于 05-25 14:55 1.6w次阅读
    什么是<b class='flag-5'>源码</b>?<b class='flag-5'>源码</b>有什么作用?<b class='flag-5'>源码</b>组件是什么?<b class='flag-5'>源码</b>可二次开发吗?

    超级电容怎么充电?超级电容可以直充电吗?

    超级电容器的充电过程是基于其独特的双电层结构和电解质的特性进行的。
    的头像 发表于 04-15 17:29 7614次阅读

    超级电容的容量能达到多少?超级电容的容量有多大?

    超级电容器的容量是其关键的技术参数,直接影响着其在各种应用中的性能表现。
    的头像 发表于 04-15 16:44 1649次阅读

    OpenHarmony开发学习:【源码下载和编译】

    本文介绍了如何下载鸿蒙系统源码,如何次性配置可以编译三目标平台(`Hi3516`,`Hi3518`和`Hi3861`)的编译环境,以及如何将源码编译为三
    的头像 发表于 04-14 09:36 938次阅读
    OpenHarmony开发学习:【<b class='flag-5'>源码</b>下载和编译】

    超级电容是什么?超级电容的性能特性

    超级电容是什么?超级电容的性能特性。超级电容是种新型储能装置,是以石墨烯等复合材料为正极材料、在活性炭材料中包裹碳纳米管或石墨烯等导电高分子材料,利用充放电过程中的电荷迁移来储存电能
    的头像 发表于 03-15 09:53 1408次阅读
    <b class='flag-5'>超级</b>电容是什么?<b class='flag-5'>超级</b>电容的性能特性

    超级电容模组的优点

    超级电容模组就是将多个超级电容器单体串联,合作电压均衡和放电稳压系统,用铝合金外壳组合而成的新式能量包。超级电容模组的诞生,弥补了铅酸电
    的头像 发表于 03-01 15:10 652次阅读
    <b class='flag-5'>超级</b>电容模组的优点

    超级电容器比电池更好吗?

    超级电容器是种新型的储能器件,主要用于断电后提供短期能量的后备电源,其能量密度介于普通电容和二次电池之间,同时具有高比容量和比功率的特点。那超级电容器比电池更好吗?让我们来从以下几点看看超级
    发表于 02-18 15:38

    Apache Doris聚合函数源码解析

    笔者最近由于工作需要开始调研 Apache Doris,通过阅读聚合函数代码切入 Apache Doris 内核,同时也秉承着开源的精神,开发了 array_agg 函数并贡献给社区。笔者通过这篇文章记录下对源码些理解,同时
    的头像 发表于 01-16 09:52 1031次阅读
    Apache Doris聚合函数<b class='flag-5'>源码</b>解析

    OneFlow Softmax算子源码解读之WarpSoftmax

    写在前面:近来笔者偶然间接触了深度学习框架 OneFlow,所以这段时间主要在阅读 OneFlow 框架的 cuda 源码。官方源码基于
    的头像 发表于 01-08 09:24 864次阅读
    OneFlow Softmax算子<b class='flag-5'>源码</b>解读之WarpSoftmax

    超级电容器比电池更好吗?

    超级电容器是种新型的储能器件,主要用于断电后提供短期能量的后备电源,其能量密度介于普通电容和二次电池之间,同时具有高比容量和比功率的特点。那超级电容器比电池更好吗?让我们来从以下几点看看超级
    发表于 01-06 16:33

    超级电容能给汽车加速吗?

    超级电容器的问世,使大家好奇它的“超级”之处,究竟哪里超级,在哪些领域能体现出它的“超级”。超级电容器在很多应用领域都发挥着重大作用,无论是
    发表于 01-06 16:31