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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144556
  • GCC
    GCC
    +关注

    关注

    0

    文章

    112

    浏览量

    26064
  • 源码
    +关注

    关注

    8

    文章

    682

    浏览量

    31082
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66812

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    医院随访管理系统源码,三级随访系统源码,Java+Springboot,Vue,Ant-Design+MySQL5

    :MySQL5及以上 随访系统菜单功能介绍: 1.首页 首页分区域展示随访概览,表单占比, 科室占比以及Top榜单数四模块 2.医护随访系统 该模块主要包括级随访,二级随
    的头像 发表于 11-08 14:48 196次阅读
    医院随访管理系统<b class='flag-5'>源码</b>,三级随访系统<b class='flag-5'>源码</b>,Java+Springboot,Vue,Ant-Design+MySQL5

    【高速数字设计(基础篇)】阅读体验之--书籍排版设计和目录架构及初步阅读

    书籍排版设计首先感谢电子发烧友举办这个试读活动,使得本人有幸能够得到【高速数字设计(基础篇)】的试读机会。对于到手的书籍、杂志、报纸之类的纸质阅读物,我向有习惯就是闻闻纸张的味道
    发表于 11-06 22:49

    【「高速数字设计(基础篇)」阅读体验】+初步上手阅读

    区域,就造成了失真。讲解的非常简单,容易接收。也对信号完整性有了初步的了解。 这是第张的阅读,后面会阅读后续章节。
    发表于 10-21 20:50

    6超级电容能存多少电

    超级电容凭借法拉级电容、高充放电效率和长循环寿命,成为新型储能器件,突破传统电容器局限,应用于能源存储与高效动力系统。
    的头像 发表于 10-20 09:18 479次阅读
    6<b class='flag-5'>个</b><b class='flag-5'>超级</b>电容能存多少电

    智能小车设计源码和图纸资料

    智能小车设计源码和图纸
    发表于 08-25 15:38 1次下载

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

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

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

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

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

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

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

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

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

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

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

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