Linux 平臺下閱讀源碼的工具鏈

来源:http://www.cnblogs.com/acmwangpeng/archive/2016/05/24/5524823.html
-Advertisement-
Play Games

原文:http://blog.jobbole.com/101322/ 前言 看源代碼是一個程式員必須經歷的事情,也是可以提升能力的一個捷徑.個人認為: 要完全掌握一個軟體的方法只有閱讀源碼。 在Windows下有sourceinsight這個源碼閱讀軟體(雖然我沒用過,但是網上評價還不錯),由於我是 ...


原文:http://blog.jobbole.com/101322/

 

前言

看源代碼是一個程式員必須經歷的事情,也是可以提升能力的一個捷徑.個人認為: 要完全掌握一個軟體的方法只有閱讀源碼。

在Windows下有sourceinsight這個源碼閱讀軟體(雖然我沒用過,但是網上評價還不錯),由於我是個Linuxer,並不喜歡用Windows,所以自然是選擇在Linux下閱讀源碼的工具了.

下麵我將逐一介紹在Linux下閱讀源碼的工具.

vim + ctags + cscope

源碼閱讀三劍客.vim配合ctags和cscope,足以在源代碼裡面自由翱翔,在函數和變數間自由跳轉.

安裝

 

   
1 sudo apt-get install vim ctags cscope

 

使用

vim

vim的使用就略過了,網上資料很多,不是一篇文章能說完的,未來我可能會寫一篇vim的使用心得。推薦一篇《簡明 Vim 練級攻略》,看完就差不多會用了.

ctags

ctags的使用很簡單,vim已經內置了對ctags的支持

首先在源代碼根目錄執行ctags -R,遞歸的為源碼建立tags,在根目錄會生成一個Tags的文件,存放各種函數和變數的tag,便於跳轉

  • 使游標在函數或變數上,Ctrl + ]即可跳轉到其定義處
  • Ctrl + t可以回到你跳轉之前的位置

對於簡單的代碼,ctags就夠用了,但是對於比較複雜的代碼來說,ctags顯得有點力不從心,於是,下一位劍客就登場了.

cscope

vim同樣內置了對cscope的支持.

首先在源代碼根目錄執行cscope -Rbq,就會生成cscope.out文件(索引資料庫)

  • -R: 在生成索引文件時,搜索子目錄樹中的代碼
  • -b: 只生成索引文件,不進入cscope的界面
  • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

然後在vim中執行:cs add cscope.out,添加資料庫.
接下來就可以使用:cs find x var進行查找.(x代表查詢選項,var表示要查找的函數或變數名)
cscope支持8種查詢方式

  • s: 查找C語言符號,即查找函數名、巨集、枚舉值等出現的地方
  • g: 查找函數、巨集、枚舉等定義的位置,類似ctags所提供的功能
  • d: 查找本函數調用的函數
  • c: 查找調用本函數的函數
  • t: 查找指定的字元串
  • e: 查找egrep模式,相當於egrep功能,但查找速度快多了
  • f: 查找並打開文件,類似vim的find功能
  • i: 查找包含本文件的文件

例如,我們想在vim 7.0的源代碼中查找調用do_cscope()函數的函數,我們可以輸入:”:cs find c do_cscope“,回車後發現沒有找到匹配的功能,可能並沒有函數調用do_cscope()。我們再輸入”:cs find s do_cscope“,查找這個C符號出現的位置,現在vim列出了這個符號出現的所有位置。

每次都有輸入cs find來查找數據是不是有點麻煩,有沒有更方便的方法呢.當然有,vim的神奇之處在其可定製性.提供一份cscope的配置,將其放在.vimrc中即可.

   
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " cscope setting """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" if has("cscope")   set csprg=/usr/bin/cscope   set csto=1   set cst   set nocsverb   " add any database in current directory   if filereadable("cscope.out")       cs add cscope.out   endif   set csverb endif   nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

上面的配置即把Ctrl + @作為:cs find的快捷鍵,也就是說要查找某個函數名,只需要把游標放在函數名上,按下Ctrl + @ + s即可,簡直不能更方便.而且你可以自己修改配置,映射到自己覺得舒服的快捷鍵上.

本著不重覆造輪子的原則,我就簡單的寫了cscope的基本用法,其實基本上就夠用了,進階的用法參考這篇文章vi/vim使用進階: 程式員的利器 – cscope

doxygen

上面我們講的是用vim來查看源代碼,但是面對幾十萬代碼的時候,想要看清楚各個結構體之間的關係就不是vim能夠做到的了.這時候我們就需要doxygen來幫手了.

Doxygen is the de facto standard tool for generating documentation from annotated C++ sources, but it also supports other popular programming languages such as C, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, and to some extent D.

doxygen是一個根據源代碼生成文檔的工具,這貨雖然主要是給C++用的,但是它也對其他語言有支持.安裝直接去官網,按照其指導安裝即可。

下麵介紹一下doxygen的使用方法.

首先,在源代碼根目錄執行doxygen -g,然後在根目錄就會突然冒出一個名為Doxyfile的文件,這個文件就是doxygen生成文檔的配置文件了.

那麼,重點來了,怎麼配置這個文件,預設的配置是根據代碼生成各個結構體的成員數據,然後生成html和latex兩個文件夾,分別是網頁和latex文檔.

說實話,預設生成的文檔並沒有什麼卵用,除了讓你更方便的看到各個結構體的組成成員.我們關心的是各個結構體之間的關係,這是針對C而言的.對與C++和java而言,關心的是類之間的關係.所以,預設的配置肯定是要修改的.至於怎麼改,看官方文檔.

當然了,如果這篇文章唯一給出的建議就是看文檔,那這篇文章有什麼意義呢.大家都知道看文檔可以解決問題,但是時間成本太高,而且是英文的.寫這篇文章的目的是分享自己學習得到的經驗,讓大家少走彎路,如果不能解決你的問題,只能去看文檔了

接下來我根據我自己看文檔用到的配置跟大家解釋一下.

首先,Doxygen裡面的配置可謂又臭又長,你絕對不會有讀完它的欲望.所以我給出幾個關鍵的配置項,到時候搜索它修改即可

  • 這是針對各種語言優化輸出的選項,預設都是NO,因為它不清楚你用的是什麼語言(話說看一下尾碼不就知道了嗎…)
       
    1 2 3 4 OPTIMIZE_OUTPUT_FOR_C OPTIMIZE_OUTPUT_JAVA OPTIMIZE_FOR_FORTRAN OPTIMIZE_OUTPUT_VHDL
  • 這個是生成文檔的類型的選項,預設生成html和latex,共支持六種類型的文檔,每種類型的生成配置也是很多,具體根據需要配置
       
    1 2 3 4 5 6 GENERATE_HTML GENERATE_LATEX GENERATE_RTF GENERATE_XML GENERATE_DOCBOOK GENERATE_MAN
  • 關於生成圖像的選項.doxygen使用dot這個工具來繪圖,所以要先執行sudo apt-get install graphviz安裝dot.在設置好這個繪圖選項之後,doxygen就會生成各個結構體的關係,對於類會生成函數調用關係(我沒試過,因為只試過C的).
       
    1 2 3 4 5 6 7 8 HAVE_DOT (一定要置為YES,後面的選項都依賴這個) DOT_NUM_THREADS (使用dot繪圖的線程數量,越多越快,我一般是設置跟cpu的核數一樣) //以下兩個選項跟生成函數調用關係圖有關 CALL_GRAPH CALLER_GRAPH EXTRACT_ALL //把所有實體都輸出到文檔,不管它是否能被描述 EXTRACT_STATIC //把靜態變數也輸出到文檔中 EXTRACT_PRIVATE //把私有變數也輸出到文檔中

    給一個結構體關係圖,就是doxygen生成的.
    machine_class
  • 關於源碼搜索路徑,預設是搜索本目錄的源代碼,大部分情況下源碼是分佈在各個子目錄的.
       
    1 RECURSIVE = YES

    預設RECURSIVE是NO,所以記得把它設置為YES,遞歸搜索子目錄. 感謝soglad的留言提醒

最後一步,在源碼根目錄執行doxygen,它會自動找到Doxygen配置,根據配置生成文檔.

gdb

最後一個工具,大名鼎鼎的gdb.分析源碼執行流程的最好方式的是運行它,然後一步步執行.用來觀察它最好的工具當然是gdb了(針對C/C++).

gdb的使用我也不打算造輪子,直接參考用GDB調試程式,這篇寫的很好,通俗易懂.

後記

以上就是我在閱讀源碼的時候使用的Linux工具,三劍客vim+ctags+cscope,兩板斧doxygen gdb,足以馳騁源代碼的江湖.

以上工具,vim和gdb是最難學的,學習曲線很陡峭.但是學好之後,就能守得雲開見月明.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們把表中的每一行叫做一個“記錄”,每一個記錄包含這行中的所有信息,就像在通訊錄資料庫中某個人全部的信息,但記錄在資料庫中並沒有專門的記錄名,常常用它所在的行數表示這是第幾個記錄。在資料庫中存放在表行列交叉處的數據叫做“值”,它是資料庫中最基本的存儲單元,它的位置要由這個表中的記錄和欄位來定義。 ...
  • 1、資料庫的4個基本概念: 數據(data) 資料庫(DB) 資料庫管理系統(DBMS) 資料庫系統(DBS) 2、數據模型 對現實世界數據特征的抽象,是用來描述數據、組織數據和對數據進行操作的。 數據模型是資料庫系統的核心和基礎。 數據模型通常由數據結構、數據操作、和數據的完整性約束條件三部分組成 ...
  • 本文是Linux Shell系列教程的第(三)篇,更多shell教程請看:Linux Shell系列教程 Shell作為一種高級的腳本類語言,也是支持自定義變數的。今天就為大家介紹下Shell中的變數相關知識。 為使Shell編程更有效,系統提供了一些Shell變數。Shell變數可以保存諸如路徑名 ...
  • 相信做Web開發的同學們,經常會遇到需要將本地部署的Web應用能夠讓公網環境直接訪問到的情況,例如微信應用調試、支付寶介面調試等。這個時候,一個叫ngrok的神器可能會幫到你,它提供了一個能夠在公網安全訪問內網Web主機的工具,能捕獲所有HTTP請求的內容,也支持TCP埠映射,支持Linux、Wi ...
  • 9.虛擬存儲器 為了更加有效地管理 存儲器 且少出錯,現代系統提供了對 主存 的抽象概念,叫做 。 是硬體異常,硬體地址翻譯,主存,磁碟文件和內核軟體的完美交互。 為每個進程提供一個 大的 , 一致的 和 私有的 地址空間。 提供了3個重要能力。 將主存看成磁碟地址空間的 高速緩存 。 只保留了活動 ...
  • 1. deepin終端: sudo apt-get install virtualbox 2. 下載win7 iso文件 3. deepin終端啟動virtualbox : ./virtualbox 4. 選擇win7 iso文件 5. 進入win7安裝: 快速格式化4個分區 ,開始安裝 6. li ...
  • 前言 STM32F1系列晶元算是在STM32中最早的一系列,在實際生活中應用的比較廣泛。因此,彙總一下STM32F1系列晶元常見片內資源,每一篇文章把重點提出來講解,並提供軟體源代碼工程。 彙總常見資源:基本IO、定時器TIM、串口USART、ADC模數轉換、DAC數模轉換、SPI串列通信、EXIT ...
  • 1.利用命令模式 捕獲整個屏幕 : $ gnome-screenshot 截完屏之後我們可以設置自定義圖片存儲位置,如圖: 捕獲當前終端Terminal : $ gnome-screenshot -w 捕獲自定義區域 :$ gnome-screenshot -a 利用-B參數可以去除終端視窗的名稱狀 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...