小言_互联网的博客

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

426人阅读  评论(0)

大家好,我是小麦。在学习编程的路途漫漫,优秀的源码是非常珍贵的学习资源,阅读源码也是有效提高自己的一个好方法。

工欲善其事必先利其器;

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

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的安装;

使用方法如下;


   
  1.  egypt [--omit function,function,...] [--include-external] <rtl-file>... | dotty -
  2.  egypt [--omit function,function,...] [--include-external] <rtl-file>... | dot <dot-options>

4 测试

编写程序test.c,具体如下所示;


   
  1. #include <stdio.h>
  2. void test0();
  3. void test1();
  4. void test2();
  5. void test3();
  6. int main()
  7. {
  8.         test1();
  9.         test2();
  10.         test3();
  11.          return  0;
  12. }
  13. void test0(void){
  14.         printf( "hello");
  15. }
  16. void test1(void)
  17. {
  18.         test0();
  19. }
  20.  
  21. void test2(void)
  22. {
  23.         test1();
  24. }
  25.  
  26. void test3(void)
  27. {
  28.         
  29. }

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

—— The End ——

推荐好文  点击蓝色字体即可跳转

 如果让你来设计网络

☞ 嵌入式方案设计文档该怎么写?

☞ 硬核操作系统讲解

☞ 赚钱的项目差点被我做亏本了...

☞ 一个超赞的开源串口虚拟示波器项目,玩起来!

☞ 写了这么多年代码,开源协议你确定自己真的知道吗?

原创不易,欢迎转发、留言、点赞、分享给你的朋友,感谢您的支持!

长按识别二维码关注我

你点的每个好看,我都认真当成了喜欢


转载:https://blog.csdn.net/u010632165/article/details/116870151
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场