当前位置:   article > 正文

cflow——C语言函数调用关系生成器(1),2024年最新开源至上_tree2dotx

tree2dotx

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

| ±wget_buffer_printf_append()
| ±wget_buffer_memcat()
| ±wget_buffer_strcat()
| ±fwrite()
| ±EnterCriticalSection()
| ±wget_console_set_fg_color()
| ±fflush()
| ±wget_console_reset_fg_color()
| ±LeaveCriticalSection()
| ±write()
| ±close()
| -wget_buffer_deinit()

tree2dotx

为了更直观地展示函数调用关系,我们可以使用 xdot 工具。不过使用 xdot 工具地前提是我们必须要有一份用 xdot 格式表示节点地文件。这就需要使用另外一个工具 tree2dotx,可以从这里获取,将其存为 tree2dotx 文件,然后放入系统路径。
运行一下看看效果

$ cflow log.c | tree2dotx
digraph G{
ranksep = 1;
rankdir=LR;
size=“1920,1080”;
node [fontsize=16,fontcolor=blue,style=filled,fillcolor=Wheat,shape=box];
“log_init” -> “InitializeCriticalSection”;
“log_init” -> “wget_console_init”;
“log_init” -> “wget_logger_set_func”;
“log_init” -> “wget_get_logger”;
“log_init” -> “write_debug_stderr”;
“write_debug_stderr” -> “write_debug”;
“write_debug” -> “write_out”;
“write_out” -> “strcmp”;
“write_out” -> “open”;
“write_out” -> “wget_buffer_init”;
“write_out” -> “isatty”;
“write_out” -> “fileno”;
“write_out” -> “wget_buffer_strcpy”;
“write_out” -> “gettime”;
“write_out” -> “localtime_r”;

}

xdot

xdot 功能能够以图形的方式展示节点之间的关系,在 ubuntu 下使用 apt 命令就可以安装

sudo apt install xdot

运行看下效果

$ cflow log.c | tree2dotx > out.dot
$ xdot out.dot

在这里插入图片描述
可以非常直观的看到 log.c 文件中的函数调用关系,鼠标放在某个函数上,前后的箭头还会变成红色,用来指示被调用和调用关系。

优化

上述 tree2dotx 脚本其实是有点问题的,我对它做了一些优化,如下

  • 去重。经过 tree2dotx 处理过的节点,有重复的,导致连线翻倍,去重后效果如下,和上面对比是不是简洁多了
    在这里插入图片描述
    命令如下

cflow log.c | tree2dotx | awk ‘!a[$0]++’ > out.dot

  • 去除多余空格
    原始 tree2dotx 脚本在将函数调用关系转成节点时,有些函数后面多出了一个空格,将脚本中的 sed -e "s/<.*>.*//g" | tr -d '\(' | tr -d '\)' | tr '|' ' ' 改成 sed -e "s/ <.*>.*//g" | tr -d '\(' | tr -d '\)' | tr '|' ' ',就可以了。
  • 增加子节点
    这样就可以显示当前函数属于哪个 C 文件了

附件

优化后的 tree2dotx 完整代码

$ cat /usr/local/bin/tree2dotx
#!/bin/bash

tree2dotx — transfer a “tree”(such as the result of tree,calltree,cflow -b)

to a picture discribed by DOT language(provided by Graphviz)

Author: falcon wuzhangjin@gmail.com

Update: 2007-11-14, 2015-3-19

Usage:

tree -L 2 -d /path/to/a/directory | bash tree2dotx | dot -Tsvg -o tree.svg

cd /path/to/a/c/project/; calltree -gb -np -m *.c | bash tree2dotx | dot -Tsvg -o calltree.svg

cd /path/to/a/c/project/; cflow -b -m setup_rw_floppy kernel/blk_drv/floppy.c | bash tree2dotx | dot -Tsvg -o cflow.svg

Set the picture size, direction(LR=Left2Right,TB=Top2Bottom) and shape(diamond, circle, box)

size=“1920,1080”
direction=“LR”
shape=“box”

color, X11 color name: http://en.wikipedia.org/wiki/X11_color_names

fontcolor=“blue”
fillcolor=“Wheat”

fontsize

fontsize=16

Specify the symbols you not concern with space as decollator here

filterstr=“”;

input=cat

output: dot, flame

output=“dot”

has_subgraph=“0”
ordering=“0”

Usage

#grep -v ^$ | cat

function usage
{
echo “”
echo " $0 "
echo “”
echo " [ -f “filter1 filter2 …” ]"
echo " [ -s size, ex: 1080,760; 1920,1080 ]"
echo " [ -d direction, ex: LR; TB ]"
echo " -h get help"
echo “”
}

function subgraph() {
echo “KaTeX parse error: Undefined control sequence: \* at position 40: …" \ | sed 's/).\̲*̲ at /)/g;s/:.\*…/\tsubgraph “cluster_\2” { label=”\2";\1;}/’
| sort -u
}

while getopts “f:s:S:d:e:h⭕️r:” opt;
do
case o p t i n f ) f i l t e r s t r = opt in f) filterstr= optinf)filterstr=OPTARG
;;
s)
size= O P T A R G ; ; S ) s h a p e = OPTARG ;; S) shape= OPTARG;;S)shape=OPTARG
;;
d)
direction= O P T A R G ; ; e ) h a s _ s u b g r a p h = OPTARG ;; e) has\_subgraph= OPTARG;;e)has_subgraph=OPTARG
;;
o)
output= O P T A R G ; ; r ) o r d e r i n g = OPTARG ;; r) ordering= OPTARG;;r)ordering=OPTARG
;;
h|?)
usage $0;
exit 1;
;;
esac
done

Transfer the tree result to a file described in DOT language

echo “KaTeX parse error: Expected group after '^' at position 20: …t" | \ grep -v ^̲ | grep -v “1* director”
| sed -e “s/ <.*>.*//g” | tr -d ‘(’ | tr -d ‘)’ | tr ‘|’ ’ ’
| sed -e “s/ [.*].*//g”
| awk '{if(NR==1) system(“basename “$0); else printf(”%s\n”, KaTeX parse error: Expected 'EOF', got '}' at position 4: 0);}̲' \ | awk -v fs…filterstr” '# function for filter the symbols you not concern
function need_filter(node) {
for ( i in farr ) {
if (match(node,farr[i]" “) == 1 || match(node,”^“farr[i]”$") == 1) {
return 1;
}
}
return 0;
}
BEGIN{

Filternode array are used to record the symbols who have been filtered.

oldnodedepth = -1; oldnode = “”; nodep[-1] = “”; filter[nodep[-1]] = 0;
oldnodedepth_orig = -1; nodepre = 0; nodebase = 0; nodefirst = 0;
output = “‘$output’”;

#printf(“output = %s\n”, output);

Store the symbols to an array farr

split(fstr,farr," ");

print some setting info

if (output == “dot”) {
printf(“digraph G{\n”);

if(ordering == “1”) {
printf(“ordering=out;\n”);
}
printf(“ranksep = 1;\n”);

printf(“\trankdir=‘KaTeX parse error: Undefined control sequence: \n at position 12: direction';\̲n̲"); printf("\ts…size’”;\n");
printf(“\tnode [fontsize=‘ f o n t s i z e ′ , f o n t c o l o r = ′ fontsize',fontcolor=' fontsize,fontcolor=fontcolor’,style=filled,fillcolor=‘ f i l l c o l o r ′ , s h a p e = ′ fillcolor',shape=' fillcolor,shape=shape’];\n”);

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
pe’];\n");

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-yTnnOfZI-1713291765722)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


  1. 0-9 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/760370
推荐阅读
相关标签
  

闽ICP备14008679号