首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 性能分析利器 gprof 完全指南:原理、編譯、運行、結果解讀、圖形化工具、異常退出處理

     編輯:關於C語言

gprof 是什麼?

GNU Profiler,用於分析程序函數調用次數、執行時間佔比、調用關係圖,定位性能熱點。源碼級、無需修改代碼、編譯器集成。

工作原理

  1. 編譯鏈接加 -pg:GCC 在每個函數入口插桩調用 mcount/_mcount/__mcount。
  2. 運行程序:維護內存中的調用圖,記錄調用次數、父子關係、時間採樣 (基於 ITIMER_PROF 間隔中斷採樣 PC 指針)。
  3. 正常退出:atexit 註冊的寫入函數生成 gmon.out。
  4. 分析:gprof executable gmon.out 生成報告。

編譯與運行步驟


# 1. 編譯鏈接加 -pg (編譯和鏈接都要加)
gcc -pg -o myapp main.c utils.c -lm

# 2. 運行程序 (必須正常退出)
./myapp

# 3. 生成 gmon.out 後分析
gprof myapp gmon.out > profile.txt
# 或交互查看
gprof myapp gmon.out | less

常用分析選項

選項含義
-b簡潔模式,不輸出字段詳細說明
-p僅輸出調用圖
-q僅輸出平坦分析 (函數耗時列表)
-e func排除 func 及其子樹的調用圖
-E func同 -e,且總時間百分比計算中排除 func 時間
-f func僅輸出 func 及其子樹的調用圖
-F func同 -f,且總時間百分比僅計算 func 子樹時間
-z顯示零調用函數

報告字段解讀

Flat Profile (平坦分析)


%   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
 50.00      0.50     0.50   10000     0.05     0.05  func_a
 30.00      0.80     0.30    5000     0.06     0.12  func_b
 ...
  • % time:該函數自佔時間佔總採樣時間百分比。
  • cumulative seconds:該函數及其上方所有函數累計時間。
  • self seconds:該函數本體佔用時間 (不含子函數)。
  • calls:調用次數。
  • self ms/call:平均每次調用自佔時間。
  • total ms/call:平均每次調用總時間 (含子函數)。

Call Graph (調用圖)


index % time    self  children  called     name
                0.50    0.00       1/1           main [1]
[2]     50.0    0.50    0.00       1         func_a [2]
                0.00    0.00       1/1           func_c [3]
...
  • index:條目索引,用於交叉引用。
  • self:函數自佔時間。
  • children:子函數佔用時間。
  • called:調用次數 (非遞歸/遞歸)。
  • name:函數名,[n] 對應索引。

進階技巧

1. 分析庫函數


gcc -pg -lc_p -o myapp main.c # 鏈接 libc_p (profiling 版 libc)

2. 非正常退出也生成 gmon.out (信號處理)


#include 
#include 

void sig_handler(int sig) {
    exit(0); // 正常退出觸發 atexit 寫入 gmon.out
}

int main() {
    signal(SIGUSR1, sig_handler); // kill -USR1 pid 觸發
    signal(SIGINT, sig_handler);  // Ctrl+C 觸發
    // ... 主循環
}

3. 圖形化工具:gprof2dot + Graphviz


# 安裝
pip install gprof2dot
apt install graphviz

# 生成調用圖圖片
gprof myapp gmon.out | gprof2dot | dot -Tpng -o callgraph.png
# 生成火焰圖風格
gprof myapp gmon.out | gprof2dot -f prof -n 0.5 | dot -Tpng -o flame.png

局限性與替代方案

  • 僅用戶態,無法分析內核/系統調用開銷 → perf (Linux 內核性能分析器,硬件計數器支持)。
  • 採樣基於時間中斷,精度受限於中斷頻率 (通常 100-1000Hz) → perf record -g 基於硬件 PMU 採樣,精度更高。
  • 多線程支持有限 → perf / VTune / gperftools (Google CPU Profiler) 支持更好。
  • 需重新編譯 → perf 無需重編譯。

總結

gprof 是經典、輕量、標準工具鏈一體的性能分析器,適合快速定位 CPU 熱點函數、調用關係。現代 Linux 開發推薦優先使用 perf (功能更強、無需重編譯、支持硬件計數器),gprof 作為補充或嵌入式無 perf 環境時的備選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved