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!

只要稍微等一段時間,一般一個小時左右,畢竟有幾萬個節點。就會畫出整個關係圖了。

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