性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

一個(gè)超級(jí)實(shí)用的源碼閱讀小技巧

大家好,我是小麥。在學(xué)習(xí)編程的路途漫漫,優(yōu)秀的源碼是非常珍貴的學(xué)習(xí)資源,閱讀源碼也是有效提高自己的一個(gè)好方法。

工欲善其事必先利其器;

我發(fā)現(xiàn)函數(shù)調(diào)用圖可以讓我們更加直觀地了解到源碼函數(shù)直接的調(diào)用和層次關(guān)系,提高閱讀源碼的效率 。

1 前言

看源碼的時(shí)候,心血來(lái)潮想弄一下函數(shù)之前的調(diào)用關(guān)系,想起以前doxygen配合graphviz使用可以生成比較直觀的函數(shù)調(diào)用關(guān)系圖,但是前提是函數(shù)的注釋需要嚴(yán)格按照doxygen的規(guī)范,具體可以自己去搜索一下,當(dāng)然使用source insight等利器也很方便;

本文主要通過(guò)gcc+egypt+graphviz(dot)三個(gè)工具輕松生成源碼的函數(shù)調(diào)用關(guān)系圖;下圖是本人在閱讀FreeRTOS源碼tasks.c時(shí)生成的調(diào)用關(guān)系圖,具體如下所示;

一個(gè)例子

2 graphviz 安裝

Graphviz (Graph Visualization Software的縮寫(xiě))是一個(gè)由AT&T實(shí)驗(yàn)室啟動(dòng)的開(kāi)源工具包,用于繪制DOT語(yǔ)言腳本描述的圖形。ubuntu下可以直接安裝;

sudo apt-get install graphviz

直接輸入指令后,系統(tǒng)開(kāi)始安裝;

成功安裝graphviz,這里我們就可以使用dot工具了,具體使用方法如下;

3 egypt 安裝

egypt官網(wǎng): http://www.gson.org/egypt/

簡(jiǎn)潔的首頁(yè)

下載后的文件為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

最終可以看到文件結(jié)構(gòu)如下;

egypt移動(dòng)到/usr/bin,方便后面直接調(diào)用,或者將當(dāng)前egypt所在路徑添加到環(huán)境變量中;

sudo cp egypt /usr/bin

以上,已經(jīng)完成了egypt的安裝;

使用方法如下;

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

4 測(cè)試

編寫(xiě)程序test.c,具體如下所示;

#include <stdio.h>

void test0();
void test1();
void test2();
void test3();

int main()
{
        test1();
        test2();
        test3();
        return 0;
}

void test0(void){
        printf("hello");
}

void test1(void)
{
        test0();
}
 
void test2(void)
{
        test1();
}
 
void test3(void)
{
        
}

編譯需要加上參數(shù)-fdump-rtl-expand生成相應(yīng)的dump文件;

gcc -fdump-rtl-expand -c test.c

這里有我們需要的文件test.c.229r.expand;

輸入如下指令;

egypt test.c.229r.expand | dot -T png -o test.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg==,t_20

最終生成了順利生成test.png?x-oss-process=image/watermark,g_center,image_YXJ0aWNsZS9wdWJsaWMvd2F0ZXJtYXJrLnBuZz94LW9zcy1wcm9jZXNzPWltYWdlL3Jlc2l6ZSxQXzQwCg==,t_20,具體如下圖所示;

最終調(diào)用關(guān)系圖

5 結(jié)論

對(duì)C語(yǔ)言源碼的閱讀用這個(gè)辦法還是有點(diǎn)小麻煩,無(wú)法一鍵生成調(diào)用關(guān)系,,

另外還需要gcc編譯源碼生成dumpfile文件,果想要方便一些,可能還需要自己寫(xiě)腳本實(shí)現(xiàn)自動(dòng)化,如果大佬有更好的辦法,歡迎留言區(qū)討論。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關(guān)注 144
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧