Linux下的兩個輔助編程工具 perf 和 GDB

前幾天在實驗室作了幾個小實驗,受益不淺,寫代碼卻是其次,最重要的是漸漸瞭解了真實的 計算機科學 工做方式。html

不少工做均可以用 linux 下的工具高效完成,例如 要跑一組實驗,其中有兩個參數變更,那麼就不須要手動運行屢次,只用一個 Shell Script 就能完成。配合 awk 效率更高。linux

其中兩個工具真得很受用,一個是 GDB, 一個是 perf。前者用於程序調試,後者用於程序性能偵測。多線程

 

GDB 是linux下很出色的調試器, 不少經常使用的調試工具,例如 breakpoint, call stack 都有很好的實現。函數

對於 GDB, 推薦閱讀這個 tutorial, 很是好,尤爲是後面集成的針對 STL 的 pcontainer 方法。 工具

對於以前常常發生的段錯誤 SF, 以及常常出現的 core dump,都能用 GDB 準肯定位。只不過,在使用 g++ 編譯的時候,要加上 -ggdb 參數,同時儘可能不要打開優化,不然編譯器很難記錄每一個符號。性能

 

perf 是內置在 linux 內核裏的一個程序性能偵測工具。具體源碼應該能夠在 kernel 裏找到。優化

以前使用一個圖系統跑實驗,發現多線程性能不佳,可是不能找到瓶頸,使用 perf 就能輕易看到,是 omp_barrier_wait_end,經過搜索能知道這個函數是 OpenMP 的同步方法,那麼就能推斷出問題出在 OpenMP 的任務分配上,不均衡的任務分配致使不均衡的計算時間。線程

perf 內置了多個工具,具體內容能夠參看 man perf,其中最重要的兩個是 report 和 record。調試

相似於 time 命令同樣, 在程序前面加上 perf record, 能夠生成一個報告,這個報告可以顯示在程序這次運行裏每一個函數佔用的時間比,通常報告的後綴名都是 .perf.data 。htm

生成報告以後就用 perf report,這個工具可以分析 record 生成的報告,顯示具體的函數佔用時間排名。

perf report 界面

相關文章
相關標籤/搜索