fuchsia编译框架生成目标父子节点关系图,脚本实现

该脚本主要是根据ninja生成的graphviz dot file文本文件,然后根据其中一个label节点,查找 其父子节点。方便理清该节点的编译链接关系。该脚本生成某一个label节点的父子节点dot描述内容,存为dot类文件。然后使用dot工具,将dot文件生成png或者Pdf文件。

#!/bin/bash
#set -x
PARA_N=2
if [ $# -lt $PARA_N ];then
	echo usage:$0 label graph
	exit 1
fi
TMP_DOT=tmp.dot #target dot file
TMP_TMP=tmp.tmp #temporary file
TMP_CHILDREN_ID=children.id #temporary file
TMP_PARENT_ID=parent.id #temporary file
label_id=$1
dot_file=$2
dot_n=$3
#echo $label_id $dot_file
IGNORE_ID_TXT=ignore_id.txt
#find current label id
head -n 4 $dot_file > $dot_n.$TMP_DOT
grep "$label_id\" \[label" $dot_file | grep -v "\->" > $TMP_TMP
label_num=`cat $TMP_TMP | wc -l`
if [ $label_num -gt 1 ];then
	echo ignore $label_id
	echo $label_id >> $IGNORE_ID_TXT
	rm $TMP_TMP $dot_n.$TMP_DOT
	exit 1
fi
#label_id=`cat $TMP_TMP|awk -F\" '{ print $2 }'`
grep $label_id $dot_file >> $dot_n.$TMP_DOT
sed -i "s/$label_id\" \[label/$label_id\" \[color=red, label/g" $dot_n.$TMP_DOT

#find label's parents
grep $label_id $dot_file | grep "\-> \"$label_id\"" > $TMP_TMP
cat $TMP_TMP|awk -F\" '{ print $2 }' > $TMP_PARENT_ID
parent_num=`cat $TMP_PARENT_ID|wc -l`
parent_id=

while read line
do
	parent_id=$line
	grep "\"$parent_id\" \[label" $dot_file|grep -v "\->" >> $dot_n.$TMP_DOT
done < $TMP_PARENT_ID

#find label's children
grep $label_id $dot_file | grep "\"$label_id\" \->" > $TMP_TMP
cat $TMP_TMP|awk -F\" '{ print $4 }' > $TMP_CHILDREN_ID
child_num=`cat $TMP_CHILDREN_ID|wc -l`
child_id=

while read line
do
	child_id=$line
	grep "\"$child_id\" \[label" $dot_file|grep -v "\->" >> $dot_n.$TMP_DOT
done < $TMP_CHILDREN_ID
echo } >> $dot_n.$TMP_DOT
rm $TMP_TMP $TMP_CHILDREN_ID $TMP_PARENT_ID
#echo finished!

比如我这里生成了“.tmp.dot文件”,利用dot工具:

Jqh_1@DESKTOP-E2P227J MINGW64 /f/draw_lable
$ ./draw_label.sh fuchsia.zbi fuchsia.graph

Jqh_1@DESKTOP-E2P227J MINGW64 /f/draw_lable
$ dot -Tpdf -o tmp.pdf .tmp.dot

打开tmp.pdf文件,会有一个简图如下:

 

我把当前的label标为红色,其父子节点为黑色。接下来继续分析fuchsia和zircon,所有节点 关系。
为了将zircon.graph整个关系图画出来,我新增了一个脚本文件main_draw.sh,调用draw_label.sh文件,实现全部画出,只是会生成n个文件。脚本内容如下:

#!/bin/bash
PARA_NUM=2
DOT_FILE=$1
FMT_FILE=$2
#set -x
if [ $# -lt $PARA_NUM ];then
	echo usage:$0 dot_file
	exit 1
fi

#save label id to id.tmp file
ID_TMP=id.tmp
grep "\" \[label=" $DOT_FILE | grep -v "\->" | awk -F\" '{ print $2 }'> $ID_TMP

#begain main draw function
label_id=
drawsh=./draw_label.sh
n=0
while read line
do
	label_id=$line
	$drawsh $label_id $DOT_FILE $n
	dot -T$FMT_FILE -o $n.tmp.$FMT_FILE $n.tmp.dot
	rm $n.tmp.dot
	let n=n+1
	echo $n
done < $ID_TMP
rm $ID_TMP
echo finished!

只要稍微等一段时间,一般一个小时左右,毕竟有几万个节点。就会画出整个关系图了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章