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

    文章

    7528

    浏览量

    128425
  • GCC
    GCC
    +关注

    关注

    0

    文章

    104

    浏览量

    24715
  • 源码
    +关注

    关注

    8

    文章

    572

    浏览量

    28583
  • 函数
    +关注

    关注

    3

    文章

    3866

    浏览量

    61308

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    Apache Doris聚合函数源码解析

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

    OneFlow Softmax算子源码解读之WarpSoftmax

    写在前面:近来笔者偶然间接触了一个深度学习框架 OneFlow,所以这段时间主要在阅读 OneFlow 框架的 cuda 源码。官方源码基于不同场景分三种方式实现 Softmax,本文主要介绍其中一种的实现过程,即 Warp 级
    的头像 发表于 01-08 09:24 345次阅读
    OneFlow Softmax算子<b class='flag-5'>源码</b>解读之WarpSoftmax

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

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

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

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

    《Android Runtime源码解析》+深入体会第六章ART的执行(4)

    Android的运行环境这个层面。通过阅读,我了解到ART运行不仅仅是运行环境,它还涉及到应用进程的调用、类的查找、方法的加载和链接、方法的执行等过程。这些过程都与应用的运行息息相关,理解这些过程有助于
    发表于 11-17 01:33

    epoll源码分析

    对上述4个函数进行源码分析。 源码来源 由于epoll的实现内嵌在内核中,直接查看内核源码的话会有一些无关代码影响阅读。为此在GitHub上写的简化版TCP/IP协议栈,里面实现了ep
    的头像 发表于 11-13 11:49 512次阅读
    epoll<b class='flag-5'>源码</b>分析

    使用doxygen分析MCAL源码的层次架构

    阅读MCAL源码包中的源码,猜测MCAL可能只是MCU底层SDK向AutoSAR的一个适配接口。
    的头像 发表于 11-02 12:25 516次阅读
    使用doxygen分析MCAL<b class='flag-5'>源码</b>的层次架构

    求助,求示波器上位机的源码

    最好是vcc#实在是有点儿不会。vcVc多少还能看懂些 下位机程序。已经没有什么问题。现在卡在上位机上了 自己试着做了源码但是在核心的问题上,不知道该怎么处理 。 就是这个屏幕打
    发表于 10-25 08:31

    超级电容两50f,给550电机放电,方法是否可行

    电源为两节5号电池,负载为两550电机7v,电流2.7A,用超级电容充放电(只需要电机转10s左右)或者不需要超级电容的方法也行,急用采用必有重谢!
    发表于 07-29 09:20

    如何去阅读源码,我总结了18条心法

    在一个优秀的开源项目中,设计模式处处存在,所以在你开始阅读源码之前最好先了解一下常见的一些设计模式。当你了解了一些设计模式以后,在源码中遇到了相关的设计模式,你就可以快速明白代码结构的设计,从而以整体的视角去
    的头像 发表于 07-17 16:00 428次阅读
    如何去<b class='flag-5'>阅读</b><b class='flag-5'>源码</b>,我总结了18条心法

    "AI"在身边,谢谢我的超级英雄

    阅读原文” ,了解更多华为数字能源资讯!           原文标题:"AI"在身边,谢谢我的超级英雄 文章出处:【微信公众号:华为数字能源】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 06-18 10:40 286次阅读
    "AI"在身边,谢谢我的<b class='flag-5'>超级</b>英雄

    Java算法大全源码包开源源码

    Java算法大全源码包开源源码
    发表于 06-07 14:58 1次下载

    直播源码平台搭建:直播源码技术推拉流的实现(一)

    直播源码推拉流技术成为了直播行业不可或缺的重要支撑部分。今天我就向大家介绍直播源码技术推流的实现。
    的头像 发表于 05-10 16:23 2307次阅读
    直播<b class='flag-5'>源码</b>平台搭建:直播<b class='flag-5'>源码</b>技术推拉流的实现(一)

    用两3000F的超级电容,制作锂电池点焊机,效果比买的还好

    超级电容
    YS YYDS
    发布于 :2023年05月03日 18:00:59