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

    文章

    7633

    浏览量

    142192
  • GCC
    GCC
    +关注

    关注

    0

    文章

    111

    浏览量

    25516
  • 源码
    +关注

    关注

    8

    文章

    672

    浏览量

    30395
  • 函数
    +关注

    关注

    3

    文章

    4385

    浏览量

    65159

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    绝了!耐达讯自动化EtherCAT转RS232盘活RFID阅读

    。EtherCAT是工业以太网协议界的“速度担当”,实时性强、数据传输快;RS232是串行通信老大哥,稳定性流;RFID阅读器则是识别标签信息的“火眼金睛”。但EtherCAT和RS232就像两列轨道
    发表于 07-23 15:34

    科技云报到:企业级AI超级应用,下一个关键筹码?

    超级应用生态正在形成
    的头像 发表于 07-15 22:51 ?90次阅读

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】01初读体验

    代码都混在起的操作就是坑,导致了第三方内核源码过大,甚至找找不到能像看单片机代码那样快速跳转的工具来阅读linux源码,但实际使用的
    发表于 06-30 21:49

    【「零基础开发AI Agent」阅读体验】操作实战,开发编程助手智能体

    . 首先要理解智能体的相关概念 ,比如角色,限定,技能:包括插件等,知识:包括知识库,文档等等. 创建步骤: 二.创建智能体: 预览和调试 智能体发布: 最后是使用智能体: 1.从coze
    发表于 05-27 11:16

    什么是超级电容?你对超级电容了解多少?

    什么是超级电容?你对超级电容了解多少?1、双电层电容:是在电极/溶液界面通过电子或离子的定向排列造成电荷的对峙而产生的。对电极/溶液体系,会在电子导电的电极和离子导电的电解质溶液界
    的头像 发表于 05-16 08:52 ?356次阅读
    什么是<b class='flag-5'>超级</b>电容?你对<b class='flag-5'>超级</b>电容了解多少?

    超级电容和锂电池有什么区别,超级电容有哪些优势?

    超级电容和锂电池有什么区别,超级电容有哪些优势?、什么是超级电容?超级电容超级电容
    的头像 发表于 05-16 08:51 ?643次阅读
    <b class='flag-5'>超级</b>电容和锂电池有什么区别,<b class='flag-5'>超级</b>电容有哪些优势?

    为什么选择超级电容?优势有哪些?

    为什么选择超级电容?优势有哪些?为什么选择超级电容,就不得不仔细说说它的优势了。超级电容作为种新型电化学储能装置,与传统电容和锂电池相比,超级
    的头像 发表于 05-16 08:47 ?560次阅读
    为什么选择<b class='flag-5'>超级</b>电容?优势有哪些?

    超级电容器均压电路状况与展望

    电压均压电路的基本原理是比较相邻的两超级电容器的电压是否致,如果不同电路动作,将电压相对高的超级电容器旁路部分电流降低充电电压升高的速率,使两
    发表于 03-24 15:13

    在下载的源码进入bsp目录下的板子中执行menuconfig报错,怎么解决?

    在下载的源码进入bsp目录下的板子中执行menuconfig报错,如下: Kconfig:3:warning: ignoring unsupported character
    发表于 03-07 06:35

    【「鸿蒙操作系统设计原理与架构」阅读体验】-前四章阅读有感

    超级终端包含各种类型的智能终端,是HarmonyOS管理的抽象终端,对用户而言,它就像终端。HarmonyOS的设计理念,是切从体验入手,为用户提供
    发表于 01-31 11:33

    SSM框架的源码解析与理解

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

    【「嵌入式系统设计与实现」阅读体验】+ 学习STM32的案例

    感谢电子发烧友论坛和电子工业出版社的赠书。 在[上篇帖子](【新提醒】【「嵌入式系统设计与实现」阅读体验】+ 初步印象 - 社区活动专版 - 电子技术论坛 - 广受欢迎的专业电子论坛!)中介绍了
    发表于 12-06 22:22

    libmodbus源码框架分析

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

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

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

    为什么被称为超级电容?超级电容怎么用?

    说起电容的作用,很多电子人脱口而出:滤波。没错,这是大部分电容在电路中的作用,但有种电容生而不是为了滤波,那就是超级电容。本期贸泽科普实验室,momo就为大家说超级电容。
    的头像 发表于 10-24 10:15 ?3600次阅读
    为什么被称为<b class='flag-5'>超级</b>电容?<b class='flag-5'>超级</b>电容怎么用?