0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分享一個超級實(shí)用的源碼閱讀小技巧

FPGA之家 ? 來源:小麥大叔 ? 作者:小麥大叔 ? 2021-05-29 11:50 ? 次閱讀

工欲善其事必先利其器;

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

1 前言

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

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

43fc1100-bfcf-11eb-9e57-12bb97331649.png

一個例子

2 graphviz 安裝

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

sudo apt-get install graphviz

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

4412a564-bfcf-11eb-9e57-12bb97331649.png

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

4438cd5c-bfcf-11eb-9e57-12bb97331649.png

3 egypt 安裝

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

446a9030-bfcf-11eb-9e57-12bb97331649.png

簡潔的首頁

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

44bf782a-bfcf-11eb-9e57-12bb97331649.png

將egypt移動到/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 測試

編寫程序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

44eb97de-bfcf-11eb-9e57-12bb97331649.png

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

輸入如下指令;

egypt test.c.229r.expand | dot -T png -o test.png

最終生成了順利生成test.png,具體如下圖所示;

44f4efa0-bfcf-11eb-9e57-12bb97331649.png

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

5 結(jié)論

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

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

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7581

    瀏覽量

    135590
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    105

    瀏覽量

    24795
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    630

    瀏覽量

    29074
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62233

原文標(biāo)題:一個超級實(shí)用的源碼閱讀小技巧

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    手搓了ESP32墨水屏閱讀器,蠻簡單的

    工程名稱:3.7寸墨水屏閱讀器時鐘溫濕度TXT/Epub前言帥小伙手搓ESP32墨水屏閱讀器!可輕松續(xù)航100天!01閱讀器功能/亮點(diǎn)?1.具有閱讀器、時鐘、溫濕度監(jiān)測、鬧鐘、番茄鐘功
    的頭像 發(fā)表于 05-27 08:04 ?331次閱讀
    手搓了<b class='flag-5'>一</b><b class='flag-5'>個</b>ESP32墨水屏<b class='flag-5'>閱讀</b>器,蠻簡單的

    什么是源碼?源碼有什么作用?源碼組件是什么?源碼可二次開發(fā)嗎?

    源碼,也稱為源程序,是指未編譯的按照定的程序設(shè)計(jì)語言規(guī)范書寫的文本文件,是系列人類可讀的計(jì)算機(jī)語言指令。
    的頭像 發(fā)表于 05-25 14:55 ?1.3w次閱讀
    什么是<b class='flag-5'>源碼</b>?<b class='flag-5'>源碼</b>有什么作用?<b class='flag-5'>源碼</b>組件是什么?<b class='flag-5'>源碼</b>可二次開發(fā)嗎?

    OpenHarmony開發(fā)學(xué)習(xí):【源碼下載和編譯】

    本文介紹了如何下載鴻蒙系統(tǒng)源碼,如何次性配置可以編譯三目標(biāo)平臺(`Hi3516`,`Hi3518`和`Hi3861`)的編譯環(huán)境,以及如何將源碼編譯為三
    的頭像 發(fā)表于 04-14 09:36 ?825次閱讀
    OpenHarmony開發(fā)學(xué)習(xí):【<b class='flag-5'>源碼</b>下載和編譯】

    超級電容模組的優(yōu)點(diǎn)

    超級電容模組就是將多個超級電容器單體串聯(lián),合作電壓均衡和放電穩(wěn)壓系統(tǒng),用鋁合金外殼組合而成的新式能量包。超級電容模組的誕生,彌補(bǔ)了鉛酸電
    的頭像 發(fā)表于 03-01 15:10 ?507次閱讀
    <b class='flag-5'>超級</b>電容模組的優(yōu)點(diǎn)

    超級電容器比電池更好嗎?

    超級電容器是種新型的儲能器件,主要用于斷電后提供短期能量的后備電源,其能量密度介于普通電容和二次電池之間,同時具有高比容量和比功率的特點(diǎn)。那超級電容器比電池更好嗎?讓我們來從以下幾點(diǎn)看看超級
    發(fā)表于 02-18 15:38

    Apache Doris聚合函數(shù)源碼解析

    筆者最近由于工作需要開始調(diào)研 Apache Doris,通過閱讀聚合函數(shù)代碼切入 Apache Doris 內(nèi)核,同時也秉承著開源的精神,開發(fā)了 array_agg 函數(shù)并貢獻(xiàn)給社區(qū)。筆者通過這篇文章記錄下對源碼些理解,同時
    的頭像 發(fā)表于 01-16 09:52 ?887次閱讀
    Apache Doris聚合函數(shù)<b class='flag-5'>源碼</b>解析

    OneFlow Softmax算子源碼解讀之WarpSoftmax

    寫在前面:近來筆者偶然間接觸了深度學(xué)習(xí)框架 OneFlow,所以這段時間主要在閱讀 OneFlow 框架的 cuda 源碼。官方源碼基于
    的頭像 發(fā)表于 01-08 09:24 ?661次閱讀
    OneFlow Softmax算子<b class='flag-5'>源碼</b>解讀之WarpSoftmax

    超級電容器比電池更好嗎?

    超級電容器是種新型的儲能器件,主要用于斷電后提供短期能量的后備電源,其能量密度介于普通電容和二次電池之間,同時具有高比容量和比功率的特點(diǎn)。那超級電容器比電池更好嗎?讓我們來從以下幾點(diǎn)看看超級
    發(fā)表于 01-06 16:33

    超級電容能給汽車加速嗎?

    超級電容器的問世,使大家好奇它的“超級”之處,究竟哪里超級,在哪些領(lǐng)域能體現(xiàn)出它的“超級”。超級電容器在很多應(yīng)用領(lǐng)域都發(fā)揮著重大作用,無論是
    發(fā)表于 01-06 16:31

    AWS成為第一個提供NVIDIA GH200 Grace Hopper超級芯片的提供商

    2023年的AWS re:Invent大會上,AWS和NVIDIA宣布AWS將成為第一個提供NVIDIA GH200 Grace Hopper超級芯片的云服務(wù)提供商。
    的頭像 發(fā)表于 11-30 09:24 ?584次閱讀
    AWS成為第<b class='flag-5'>一個</b>提供NVIDIA GH200 Grace Hopper<b class='flag-5'>超級</b>芯片的提供商

    200經(jīng)典C程序【源碼

    電子發(fā)燒友網(wǎng)站提供《200經(jīng)典C程序【源碼】.zip》資料免費(fèi)下載
    發(fā)表于 11-21 10:34 ?2次下載
    200<b class='flag-5'>個</b>經(jīng)典C程序【<b class='flag-5'>源碼</b>】

    178C語言算法源碼下載

    電子發(fā)燒友網(wǎng)站提供《178C語言算法源碼下載.zip》資料免費(fèi)下載
    發(fā)表于 11-21 09:35 ?3次下載
    178<b class='flag-5'>個</b>C語言算法<b class='flag-5'>源碼</b>下載

    《Android Runtime源碼解析》+深入體會第六章ART的執(zhí)行(4)

    Android的運(yùn)行環(huán)境這個層面。通過閱讀,我了解到ART運(yùn)行不僅僅是運(yùn)行環(huán)境,它還涉及到應(yīng)用進(jìn)程的調(diào)用、類的查找、方法的加載和鏈接、方法的執(zhí)行等過程。這些過程都與應(yīng)用的運(yùn)行息息相關(guān),理解這些過程有助于
    發(fā)表于 11-17 01:33

    epoll源碼分析

    函數(shù)進(jìn)行源碼分析。 源碼來源 由于epoll的實(shí)現(xiàn)內(nèi)嵌在內(nèi)核中,直接查看內(nèi)核源碼的話會有些無關(guān)代碼影響
    的頭像 發(fā)表于 11-13 11:49 ?925次閱讀
    epoll<b class='flag-5'>源碼</b>分析

    使用doxygen分析MCAL源碼的層次架構(gòu)

    閱讀MCAL源碼包中的源碼,猜測MCAL可能只是MCU底層SDK向AutoSAR的適配接口。
    的頭像 發(fā)表于 11-02 12:25 ?1022次閱讀
    使用doxygen分析MCAL<b class='flag-5'>源碼</b>的層次架構(gòu)