1. 程式人生 > >使用CodeViz生成C/C++函式呼叫關係圖

使用CodeViz生成C/C++函式呼叫關係圖

     執行環境:虛擬機器下的Ubuntu 11.04

    結合Graphviz工具,使用CodeViz可以生成直觀和漂亮的C/C++程式函式之間的呼叫關係圖。

    1、安裝graphviz

    在安裝CodeViz之前,必須先安裝它所依賴的工具dot,否則將無法完成./configure操作並提示以下錯誤資訊:

checking for dot...not found
FATAL: The program dot was not in your path. This is probably available for your distribution
       with the graphviz package. Install this before running configure again
    既可以從http://www.graphviz.org/Download_linux_ubuntu.php 上下載最新版本的graphviz安裝程式手動安裝,也可以使用以下命令自動安裝:
$ sudo apt-get install graphviz graphviz-dev graphviz-doc

    程式簡要說明:

graphviz - rich set of graph drawing tools
graphviz-dev - transitional package for graphviz-dev rename
graphviz-doc - additional documentation for graphviz

    安裝相關庫:

$ sudo apt-get install libgv-*

    相關庫簡要說明: 

libgv-guile - Guile bindings for graphviz
libgv-lua - Lua bindings for graphviz
libgv-ocaml - OCaml bindings for graphviz
libgv-perl - Perl bindings for graphviz
libgv-php5 - Php5 bindings for graphviz
libgv-python - Python bindings for graphviz
libgv-ruby - Ruby bindings for graphviz
libgv-tcl - Tcl bindings for graphviz

    2、安裝CodeViz

    然後解壓CodeViz安裝包,並把gcc-3.4.6.tar.gz拷貝到codeviz-1.0.10/compiler目錄下:

$ tar zvxf codeviz-1.0.10.tar.gz
$ cd codeviz-1.0.10/
$ cp ../gcc-3.4.6.tar.gz compilers/  //也可以略過這一步,讓ncftp(Ubuntu預設未安裝)在make執行過程中自動下載gcc-3.4.6.tar.gz
$ ./configure

    Patched GCC預設安裝在/usr/local/gccgraph目錄下。

    在執行make之前,先通過以下命令建立一個連結檔案asm:

$ sudo ln -sf /usr/include/asm-generic/ /usr/include/asm

    否則,在make執行過程中會出現在/usr/include/linux/errno.h檔案中找不到asm/errno.h檔案的錯誤資訊並中止編譯。

    接下來執行make和make install命令即可在/usr/local/gccgraph目錄下建立打過補丁的GCC編譯器以及在/usr/local/bin目錄下建立兩個perl指令碼程式genfull和gengraph。

$ make
$ sudo make install

    3、CodeViz的使用舉例

    例子原始碼如下: 

/* test.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(char *p)
{
    p = (char *)malloc(20);
}

int main(void)
{
    char *str = NULL;

    func(str);

    strcpy(str, "hello world");

    printf("string is %s\n", str);

    return 0;
}

    使用剛生成的編譯器編譯test.c,會相應地生成一個test.c.cdepn檔案。 

$ /usr/local/gccgraph/bin/gcc test.c

    test.c.cdepn檔案資訊: 

F {func} {test.c:6}
C {func} {test.c:7} {malloc}
F {main} {test.c:11}
C {main} {test.c:18} {printf}
C {main} {test.c:16} {strcpy}
C {main} {test.c:14} {func}

    然後執行genfull指令碼生成full.graph。 

$ genfull

    full.graph檔案資訊: 

digraph fullgraph {
node [ fontname=Helvetica, fontsize=12 ];
"func" [label="func\ntest.c:5:"];
"main" [label="main\ntest.c:10:"];
"func" -> "malloc" [label="test.c:7"];
"main" -> "func" [label="test.c:14"];
"main" -> "strcpy" [label="test.c:16"];
"main" -> "printf" [label="test.c:18"];
}

    最後執行gengraph生成函式關係調用圖。 

$ gengraph -f main --output-type "png"

 

    -f指定最頂層的函式,--output-type指定圖片的輸出格式。

    至於genfull和gengraph的詳細使用說明請參考man手冊,使用以下命令檢視:

$ sudo apt-get install perl-doc //須先安裝perl-doc
$ genfull --man
$ gengraph --man

相關推薦

利用graphviz軟體和pycallgraph庫自動生成Python程式碼函式呼叫關係.md

利用graphviz軟體和pycallgraph庫自動生成Python程式碼函式呼叫關係圖 1.下載並安裝graphviz 安裝(路徑可任意選擇) 配置環境變數,在Path中新增: 例如我安裝在F:\Program Files (x86),那麼就新增

使用CodeViz生成C/C++函式呼叫關係

     執行環境:虛擬機器下的Ubuntu 11.04     結合Graphviz工具,使用CodeViz可以生成直觀和漂亮的C/C++程式函式之間的呼叫關係圖。     1、安裝graphviz     在安裝CodeViz之前,必須先安裝它所依賴的工具dot,否則將無法完成./configure操

分析函式呼叫關係(call graph)的幾種方法

繪製函式呼叫關係圖對理解大型程式大有幫助。我想大家都有過一邊讀原始碼(並在頭腦中維護一個呼叫棧),一邊在紙上畫函式呼叫關係,然後整理成圖的經歷。如果運氣好一點,藉助偵錯程式的單步跟蹤功能和call stack視窗,能節約一些腦力。不過如果要分析的是指令碼語言的程式碼,那多半隻

各類分析函式呼叫關係的工具

graphviz (在ubuntu/debian下直接用apt-get安裝即可,需要它的一個dot工具)    http://www.graphviz.org/ 1. introduction     對於一個C語言編寫的專案,它的框架可以反應為一棵函式呼叫樹。如果在分析專案之前,能夠得到這樣一

使用egypt+graphviz分析ffplay的函式呼叫關係

在《Ffplay視訊播放流程》文章中我給出了一個ffplay的函式呼叫關係圖,在分析程式碼上會有不小的幫助。那麼本文就詳細的描述如何從原始碼中一步步的得到我們想要的函式呼叫關係圖。 前置條件 下載ffmpeg原始碼 安裝graphviz:sudo>http://www

靜態分析C語言生成函式呼叫關係的利器——cflow

        除了《靜態分析C語言生成函式呼叫關係的利器——calltree》一文中介紹的calltree,我們還可以藉助cflow輔助我們閱讀理解程式碼。(轉載請指明出於breaksoftware的csdn部落格) cflow的說明和安裝 &nbs

c語言函式呼叫模型

對於記憶體四區不懂得戳這裡 記憶體講解 這篇文章需要知道記憶體四區的知識 首先分級呼叫函式 使需要的資料入棧 然後逐級出棧,返回數值,將棧區的記憶體進行釋放    在main函式執行完之前 fa fb 都可以呼叫ma

從彙編角度檢視C語言函式呼叫約定【非常有用】

轉自:https://blog.csdn.net/Holmofy/article/details/76094986   為了防止出現不必要的程式碼影響組合語言的檢視,所以程式中不使用任何庫函式,以保持彙編程式碼的簡潔。 這裡所使用的彙編是VC的MASM。 預設函式呼叫方式_

C語言函式呼叫過程的彙編分析

轉自:   http://www.cnblogs.com/xiaojianliu/articles/8733560.html   下面一段C程式: int bar(int c, int d) { int e = c + d; return e; }

C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式C++中函式呼叫時實參個數和函式定義時的形參個數不一致時的處理。

1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”

c語言函式呼叫過程中棧的工作原理理解

差不多每個程式設計師都知道,函式呼叫過程,就是層層入棧出棧的過程。 那麼這個過程中的詳細的細節是什麼樣子的呢? 閱讀了以下幾篇文章之後,對整個過程基本理解了: C函式呼叫過程原理及函式棧幀分析 閱讀經典——《深入理解計算機系統》04 函式返回值與棧 針對自己的理解,做個記錄:

關於C語言函式呼叫的學習【待解決】

在學習關於函式呼叫時,仿照最大函式的呼叫,編寫了一個求最小值的程式,程式碼如下: 1 #include<stdio.h> 2 3 int min(int x,int y); 4 int main() 5 { 6 int a=10,b=20; 7 int c;

託管C++中函式呼叫的雙重轉換(Double Thunking)

 在VC.Net中使用預設設定/clr編譯時,一個託管函式會產生兩個入口點,一個是託管的,供託管程式碼呼叫,另外一個是非託管的,供非託管程式碼呼叫。但是函式地址,特別是虛擬函式指標只能有一個值,所以需要有一個預設的入口。非託管入口點可能是所有呼叫的預設入口(在 Visual

C#建構函式呼叫其他建構函式(轉)

其實就是使用this來實現的。看一下例子就會明白的了。 class Class1 { public Class1() { //Code 1 } public Class1(string s) : this() { //Code 2 } publ

C語言函式呼叫的底層機制

這是一篇介紹C語言中的函式呼叫是如何用實現的文章。寫給那些對C語言各種行為的底層實現感興趣人的入門級文章。如果你是C語言或者彙編、底層技術 的老鳥或是對這個問題不感興趣,那麼這篇文章只會耽誤您的時間,您大可不必閱讀他。當然如果前輩們願意為我指出不足,我將十分感謝您的指導,並

Mac程式碼生成呼叫關係工具(Understand)

參考 1.建立工程 ====>File =====>工程名和原始碼目錄 =====>選擇語言 =====>Add source files and

C語言函式呼叫棧(一)

程式的執行過程可看作連續的函式呼叫。當一個函式執行完畢時,程式要回到呼叫指令的下一條指令(緊接call指令)處繼續執行。函式呼叫過程通常使用堆疊實現,每個使用者態程序對應一個呼叫棧結構(call stack)。編譯器使用堆疊傳遞函式引數、儲存返回地址、臨時儲存暫

C語言函式呼叫時引數壓棧的順序以及函式指標的作用

1、函式引數壓棧的順序 很多人都知道壓棧的順序時從右向左進行壓棧,具體的可觀測的結果如下程式執行。我們都知道Pascal的引數入棧順序時自左向右的,但是為什麼C語言會選擇自右向左呢?這也是C語言比pascal高階的一個地方-C語言通過這種引數入棧的順序實現了對變長引數函式的

C語言函式呼叫及棧幀結構

一、地址空間與實體記憶體 (1)地址空間與實體記憶體是兩個完全不同的概念,真正的程式碼及資料都存在實體記憶體中。 物理儲存器是指實際存在的具體儲存器晶片,CPU在操縱物理儲存器的時候都把他們當做記憶體來對待,把他們看成由若干個儲存單元組成的邏輯儲存器,這個邏

C語言函式呼叫引數壓棧的相關問題

引數入棧的順序 以前在面試中被人問到這樣的問題,函式呼叫的時候,引數入棧的順序是從左向右,還是從右向左。引數的入棧順序主要看呼叫方式,一般來說,__cdecl 和__stdcall 都是引數從右到左入棧。看下面的程式碼: #include <stdio