程序分析工具不同於調試器,它只產生程序運行時某些函數的調用次數、執行時間等等宏觀信息,而不是每條語句執行時的詳細信息。Gprof是Linux下一個強有力的程序分析工具。對於C、Pascal或者Fortran77語言的程序,它能夠以“日志”的形式記錄程序運行時的統計信息:程序運行中各個函數消耗的時間和函數調用關系,以及每個函數被調用的次數等等。從而可以幫助程序員找出眾多函數中耗時最多的函數,也可以幫助程序員分析程序的運行流程。相信這些功能對於分析開源代碼的程序員來說,有着相當大的誘惑力。
用gprof分析程序
用gprof對程序進行分析主要分以下三個步驟:
l 用編譯器對程序進行編譯,加上-pg參數。
l 運行編譯后的程序。
l 用gprof命令查看程序的運行時信息。
-g
產生帶有調試信息的目標代碼
Ignored. Provided for compatibility with other tools.
gcc 的 -g ,應該沒有人不知道它是一個調試選項,因此在一般需要進行程序調試的場景下,我們都會加上該選項,並且根據調試工具的不同,還能直接選擇更有針對性的說明,比如 -ggdb 。-g是一個編譯選項,即在源代碼編譯的過程中起作用,讓gcc把更多調試信息(也就包括符號信息)收集起來並將存放到最終的可執行文件內。
相比-g選項, -rdynamic 卻是一個 連接選項 ,它將指示連接器把所有符號(而不僅僅只是程序已使用到的外部符號)都添加到動態符號表(即.dynsym表)里,以便那些通過 dlopen() 或 backtrace() (這一系列函數使用.dynsym表內符號)這樣的函數使用。
gprof可以對C\C++等應用程序進行剖析,可以打印出程序運行中各個函數消耗時間,方便優化代碼以及分析程序的運行流程。
為直觀查看gprof結果,可以使用gprof2dot工具生成圖
gprof2dot官方文檔: https://github.com/jrfonseca/gprof2dot
使用流程
一、編譯時加上-pg
例如有一個例子example.c程序
gcc example.c -pg -o example
二、運行程序
./example arg1 arg2...
運行完程序之后,會在當前目錄生成一個文件gmou.out,這個文件會展示一些信息,但是分析結果不夠直觀,特別是函數的調用,因此可以進行步驟三
三、利用可視化工具展示結果
1. 安裝
gprof2dot工具需要
python: 2.7或3.3版本
Graphviz
在Linux系統安裝
pip install gprof2dot
2. 使用
gprof ./example gmon.out|less -S 可以直接查看文字
gprof ./example gmon.out |gprof2dot |dot -Tpng -o example.png 可視化展示
會生成類似圖:
http://ftp.gnu.org/old-gnu/Manuals/gprof-2.9.1/html_mono/gprof.html
https://www.cnblogs.com/LiuYanYGZ/p/5550544.html
https://blog.csdn.net/weixin_42670653/article/details/82147911