繪製函數調用圖(call graph)(1):專欄開篇

版權聲明:本文爲博主原創文章,如要轉載請標明出處。 https://blog.csdn.net/benkaoya/article/details/79750745

繪製函數調用關係圖(call graph),對開發人員理解源碼有非常大的幫助,特別是在以下情況:

  • 大型項目,龐雜的代碼量;
  • 項目文檔缺失,特別是設計文檔、流程圖的缺失;
  • 第三方代碼庫,如開源項目;
  • 檢查實際函數調用關係跟規劃的設計是否一致,以免出錯。

繪製函數調用關係圖的途徑主要有兩種,一種是人工手動繪製(很多人應該都有一邊看代碼(或藉助調試工具單步跟蹤),一邊在紙上畫函數調用關係圖的經歷),另一種是使用工具自動繪製。

自動分析函數調用關係的工具,主要分爲「靜態分析」和「動態分析」兩種。所謂靜態分析是指在不運行待分析的程序的前提下進行分析,那麼動態分析自然就是記錄程序實際運行時的函數調用情況了。更詳細的分類,可以參考以下文章:
https://blog.csdn.net/solstice/article/details/488865

動態調用圖是精確的,但僅描述程序的一次運行。 靜態調用圖是旨在表示程序的每個可能運行的調用圖。 確切的靜態調用圖是一個不可判定的問題,所以靜態調用圖算法通常是過度的。 也就是說,發生的每個調用關係都在圖中表示,並且可能還有一些調用關係在程序的實際運行中永遠不會發生。

以下網址列舉了這方面的工具:
https://en.wikipedia.org/wiki/Call_graph

大部分的工具,都是將函數調用關係的分析結果以文本的形式輸出,你還需要利用第三方工具將文本文件轉爲圖片文件,大部分都是使用可視化工具 graphviz 轉化爲圖片(這個轉化過程涉及到 dot 語言)。

針對C/C++語言,我體驗了幾款開源的、靜態分析的工具:cflow、codeviz 和 doxygen,看看效果如何。截止書稿,前兩者用的的人已經越來越少了,用doxygen的比較多,從谷歌趨勢圖就能看出這點:


谷歌趨勢圖

以下是我體驗過程,把他們整理出來供大家參考。

繪製函數調用圖(call graph)(2):cflow + graphviz
繪製函數調用圖(call graph)(3):codeviz + graphviz
繪製函數調用圖(call graph)(4):doxygen + graphviz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章