该脚本主要是根据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!
只要稍微等一段时间,一般一个小时左右,毕竟有几万个节点。就会画出整个关系图了。