繪制函數調用圖(call graph):doxygen + graphviz


專欄導讀

本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解。

前言

doxygen 也可以生成函數調用關系圖,但 doxygen 能做的遠不止於此,它是一款優秀的文檔自動生成工具。它可以將代碼中的注釋轉換成幫助文檔(注釋格式要符合 doxygen 要求才行,FFmpeg API Documentation 就是用doxygen自動生成的),它也可以通過靜態分析代碼,生成「頭文件引用關系圖」、「函數調用關系圖」、「繼承圖」以及「協作圖」來可視化文檔之間的關系。

官網:http://www.doxygen.nl/

根據官網介紹,截止書稿,它能支持的語言有:C, C++, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL等。生成的幫助文檔格式可以是CHM、RTF、PostScript、PDF、HTML和Unixman page等。

有了這樣的工具,在發布程序版本的同時,發布幫助文檔也將變得簡單、高效,配合持續集成系統(如Jenkins),自動構建系統,幫助文檔可以跟隨代碼一起實時、輕松的發布版本。

doxygen 是跨平台的工具,支持Linux、Windows、Mac OS X系統,本文將以Windows版本為例,簡要介紹如何使用 doxygen 生成函數調用關系圖,其他功能(如將代碼的注釋生成幫助文檔)不在本文討論范圍內,這是一個入門級的教程。

安裝graphviz

跟前面文章介紹的cflow、codeviz一樣,doxygen 自身沒辦法生成關系圖,需要依賴 graphviz 才行,所以還得安裝 graphviz 先。

官網:http://www.graphviz.org/
下載:https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

在官網上很容易找到 Windows 平台的 Stable 最新版本,如下圖所示,我下載的版本是「graphviz-2.38.msi」,安裝過程一直“Next”即可。



圖 2-1 選擇Stable版本下載graphviz

 

安裝doxygen

官網:http://www.doxygen.nl/
下載:ftp://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14-setup.exe

在官網上很容易找到最新版本的安裝文件,我下載的版本是「doxygen-1.8.14-setup.exe」,安裝過程也是傻瓜式的“Next”。

開始之前

截取 doxygen 安裝目錄樹(只是部分),如下所示:

doxygen
├── bin
│   ├── doxygen.exe            <-- 最核心的可執行文件
│   └── doxywizard.exe         <-- 配置文件向導
└── doxygen_manual.chm         <-- 離線幫助手冊
 

其中 doxygen_manual.chm 是離線幫助手冊(要深入研究 doxygen 的,認真研讀這個手冊就對了), doxywizard.exe 是配置文件向導,通過這個向導可以快捷地生成配置文件,doxygen.exe 再根據配置文件分析源碼,輸出各種圖和文檔。以下這張圖更能直觀的表達出 doxywizard.exe 和 doxygen.exe 之間的關系:



圖 4-1 doxygen工作原理圖

下文將以分析 E:\whoami\whoami.c 源碼為例,演示如何使用 doxygen,源文件 whoami.c 內容如下:

 

/* whoami.c - a simple implementation of whoami utility */
#include <pwd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

int who_am_i(void)
{
    struct passwd *pw;
    char *user = NULL;

    pw = getpwuid (geteuid ());
    if (pw)
        user = pw->pw_name;
    else if ((user = getenv ("USER")) == NULL)
    {
        fprintf (stderr, "I don't know!\n");
        return 1;
    }
    printf ("%s\n", user);
    return 0;
}

int main(int argc, char **argv)
{
    if (argc > 1)
    {
        fprintf (stderr, "usage: whoami\n");
        return 1;
    }
    return who_am_i ();
}

創建doxygen配置文件

Doxywizard是配置和運行doxygen的GUI前端,啟動 doxywizard.exe 向導可以快捷的創建配置文件。

Step1:運行 doxywizard.exe,點擊 Wizard 選項卡,配置 Wizard > Project 頁面,如下圖所示:



圖 5-1 doxywizard 向導步驟1

注意:在使用 doxywizard 的過程發現一個bug,但凡是設置路徑的(如待分析的源碼路徑),都要通過Select按鈕啟動文本對話框去選擇路徑,直接拷貝路徑到編輯框是不生效的。可以通過 File > Save 保存配置文件去查看,或者直接在 Run > Show configuration 查看,待分析的源碼路徑的關鍵詞是INPUT。

 

Step2:點擊 Expert 選項卡,配置 Expert > Project 頁面:



圖 5-2 doxywizard 向導步驟2

Step3:配置 Expert > Build頁面:


圖 5-3 doxywizard 向導步驟3

Step4:配置 Expert > Dot頁面:


圖 5-4 doxywizard 向導步驟4

至此,配置完畢,可以通過 File > Save 菜單將上面所有配置導出(保存)到配置文件,以免丟失配置,配置文件默認保存在 Step1 設置的工作目錄下。當然你也可以通過 File > Open 菜單導入(打開)一個現有的配置文件。可以打開配置文件看看,里面參數非常多,doxywizard 圖形化的便捷性也就體現在這里,沒了這個向導,就要人為手工編輯這個配置文件,可想而知那是多么的痛苦。

 

開始分析源碼

上一章節已經配置好了參數,接下來就可以開始分析源碼了。切換到 doxywizard.exe 向導的 Run 選項卡,點擊 Run doxygen 按鈕,幕后就會根據剛才的配置執行 doxygen.exe 命令:



圖 6-1 開始分析源碼

等分析完畢,最后點擊 Show HTML output 按鈕就會啟動瀏覽器顯示分析結果,如下圖所示:


圖 6-2 查看doxygen分析后的結果

選擇 文件 > 文件列表 > whoami.c 頁面,就可以看到「頭文件包含關系圖」和「函數調用關系圖」:


圖 6-3 頭文件包含關系圖

 

 



圖 6-4 函數調用關系圖

從圖中可以發現,同樣的示例代碼,cflow 分析的函數條用關系圖會顯示系統API(如printf),而doxygen則不會顯示系統API(這更符合我們的需求)。由於我的示例源碼很簡單,所以函數調用關系圖看起來也很「簡陋」。為了體現doxygen的強大性,我特意選了一個相對復雜點的源碼(ffmpeg, 下載地址)來分析:


圖 6-5 doxygen分析復雜點的函數關系圖

 

總結

比起doxygen,之前兩篇文章所體驗的cflow、codeviz簡直弱爆了,doxygen安裝過程簡單,使用便捷,容易上手,用戶體驗較好。

參考:https://blog.csdn.net/benkaoya/article/details/79763668?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_default&utm_relevant_index=10

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM