使用gprof2dot和graphivz生成程序運行調用圖


使用gprof2dot和graphivz生成程序運行調用圖

gprof2dot是一個將gprof生成的輸出轉換為dot腳本的工具。通過給定一個gprof的輸出文件,將其轉換為生成程序調用圖的dot腳本。dot腳本可以生成圖像來進行查看。

1、下載gprof2dot工具

gprof2dot工具由JoséFronseca維護,並托管在Google代碼(http://code.google.com/p/jrfonseca/w/list),但是這個已經無法訪問了。這里提供一個github的地址https://github.com/jrfonseca/gprof2dot.git

git clone https://github.com/jrfonseca/gprof2dot.git

這個工具需要python環境的支持,請提前安裝好python3

2、使用gprof生成概要分析數據

2.1 gprof簡介

Gprof 是GNU gnu binutils工具之一,默認情況下linux系統當中都帶有這個工具。

    1. 可以顯示“flat profile”,包括每個函數的調用次數,每個函數消耗的處理器時間。
    1. 可以顯示“Call graph”,包括函數的調用關系,每個函數調用花費了多少時間。
    1. 可以顯示“注釋的源代碼”--是程序源代碼的一個副本,標記有程序中每行代碼的執行次數。

2.2 使用gprof生成分析數據

1、在編譯的時候使用-pg選項,可以寫入makefile中。(鏈接時不需要)

# 普通程序編譯
$ gcc -pg -g source.c -o binary
# cuda程序編譯
$ nvcc -Xcompiler“-g -pg”-g -pg -arch = sm_20 source.cu -o binary

2、執行編譯出的程序。
執行方式與沒有加pg選項前是一樣的,執行后將在程序運行目錄下生成gmon.out文件。這是一個二進制文件,需要進一步分析生成文本文件。如果已經存在了gmon.out文件,將會被覆蓋。

./binary	# 必須先運行一遍生成gmon.out文件,后面才能使用gprof工具繼續操作

3、用gprof工具生成概要分析數據文件。

$ gprof ./binary> gprof_output.txt

3、生成調用圖

配置好gprof2dot運行環境后,就可以使用其來生成dot腳本。

$ graph2dot.py gprof_output.txt> call_graph.dot

我這里是直接使用git克隆下來的,提前安裝好了python3和graphivz`,所以直接運行即可。

4、生成可視化的圖形

這里需要安裝好Graphivz軟件。
Windows下可以直接下載安裝包安裝,或者下載編寫版本
Linux下可以使用下面命令直接安裝

# debian系列
sudo apt install graphivz
# Archlinux系列
sudo pacman -S graphivz
# fedora
sudo dnf install graphivz

然后使用dot命令將前面生成的call_graph.dot文件轉換為圖像文件。
生成png文件

$ dot -Tpng call_graph.dot -o call_graph.png

生成PostScript文件

$ dot -Tps call_graph.dot -o call_graph.ps

如果要生成其他格式的圖像,可以使用-T選項指定,支持eps/gif/jpeg/ps/svg/png/ps2/svgz等格式/
如果需要對布局引擎進行選擇,可以使用-K進行指定,支持circo/dot/fdp/neato/nop/nop1/nop2/osage/patchwork/sfdp/twopi等。
例如,生成png圖像,使用fdp布局引擎的命令如下:

$ dot -Tsvg -Kfdp call_graph.dot -o call_graph.svg

注:布局引擎可以根據自己的喜好選擇,個人傾向使用fdp。默認是上下方向布局的,可以在call_graph.dot中添加一行rankdir=LR改為左向右方向布局。

參考

Linux性能評測工具之一:gprof篇
Linux下性能分析工具和內存泄露檢測工具的簡介(Valgrind和gprof)
gprof_call-graph_visualization


免責聲明!

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



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