一、靜態分析工具
cppcheck###
cppcheck主要用於對C/C++源代碼進行分析檢查的一個開源工具,可以用來檢測未使用的變量、越界訪問、內存泄漏等問題。
使用方法
cppcheck --enable=all NAME.cpp
gcov###
gcov是伴隨gcc發布的一個代碼覆蓋率檢查工具,可以用來檢查代碼中各個語句的執行次數,查看代碼執行邏輯,方便后期對代碼的優化。
使用方法
- 在gcc/g++的編譯選項中添加兩個選項 -fprofile-arcs -ftest-coverage
- 運行可執行程序,生成兩個包含代碼覆蓋信息的兩個文件 .gcno .gcda
- 執行命令
gcov NAME.cpp
會生成包含代碼執行次數的信息的文件NAME.cpp.gcov;通過該文件可以查看每行代碼的調用次數
ldd###
ldd命令可以查看當前可執行程序(或者動態庫)需要依賴哪些動態庫,以及缺少哪些動態庫。ldd -r還可以報告缺少的目標對象和函數
使用方法
ldd FILENAME
對於引用第三方動態庫的程序在運行的時候提示找不到對應的動態庫,通常是因為動態庫並未在ld.config文件中寫明的路徑,且在鏈接的過程中使用了 -L PATH_DIR -lNAME
這樣顯示指明動態庫位置的選項,readelf -d FILENAME
查看調用動態庫的位置。解決問題的方式是:
- 鏈接的時候配合使用
-Wl,-rpath=PATH_DIR
和-L PATH_DIR
兩個參數選項,保證程序在鏈接、運行期間能夠正確找到動態庫的位置(-Wl,-rpath是在運行時起作用,-L是在鏈接時起作用;另外,如果PATH_DIR是相對路徑,在使用-rpath的時候需要使用ORIGIN這個宏,例如-Wl,-rpath='$$ORIGIN/lib'
這個選項就是說,運行的時候在可執行文件所在目錄的lib子目錄中尋找動態庫)。 - 將動態庫所在的目錄添加到/etc/ld.config文件中,然后執行 ldconfig 刷新緩存(這種方式不建議使用)。
file###
file命令可以查看文件的類型,對於可執行文件或者動態庫,可以查看是否需要鏈接動態庫,同時也可以查看是否包含符號表(調試用,可以通過strip去除)
使用方法
file FILENAME
nm###
nm命令用於列出目標文件中的符號,可以通過-C選項來顯示可讀的符號形式,-D選項顯示動態符號,-u顯示未定義的symbol(通常在其他文件中定義)。通常情況下,對於鏈接問題可以通過nm命令的-D -u選項來查看先關的符號。
使用方法
nm -CDu FILENAME
strip###
strip用來清理共享庫或可執行文件中的符號信息和調試信息,通常是程序正式發布前進行。
readelf###
readelf主要用來查看頭信息,符號信息,動態重定位信息等elf內部的各個部分。
readelf -s SONAME | grep FUNC_NAME
用來查看動態庫SONAME中是否包含FUNC_NAME(注:如果是c++的話,函數名會被編碼成類似_ZN4hoot3Log11getInstance 這樣子, 這種情況下,建議采用nm -CD 命令選項來進行函數的查找)
二、調試跟蹤工具
gdb###
gdb是Linux環境下最強大的調試工具,可以調試未運行的程序或者正在運行的程序,還可以分析程序崩潰的coredump文件,這些的前提是,程序在編譯時添加了-g選項打開了調試信息。由於gdb功能過於強大,這里就不多做介紹,回頭專門寫一篇相關的博文。
使用方法
gdb FILENAME #對於有參數的,可以通過gdb內執行 set args PARAM 來設置參數
gdb attach PID #直接掛載PID進程,此時進程會停止運行,需要命令c來繼續運行
gdb FILENAME CORENAME #分析FILENAME程序產生的coredump文件
strace###
strace可以跟蹤並顯示用戶程序中的系統調用的詳細信息(參數、返回值、系統調用耗費時間等)。適用於可執行程序或者運行中的進程,用戶可以觀察程序的運行狀態。
使用方法
strace FILENAME
strace -p PID
常用選項 | 含義 |
---|---|
-c | 統計每次調用的時間、次數等信息 |
-f | 跟蹤fork產生的子進程 |
-tt | 輸出的每行內容前添加時間信息 |
-T | 顯示每次調用耗費的時間 |
-e | 后接相關的系統調用方法,只顯示特定類型的調用信息 |
pstack###
查看進程的實時堆棧信息 pstack PID
valgrind###
valgrind通常被用於程序內存泄漏檢查,同時它還有程序性能分析的功能(用得少)。
使用方法
valgrind --leck-check=full FILENAME
三、性能分析工具
perf###
perf是隨Linux內核代碼一起發布的性能診斷工具可以用來分析應用程序或者內核代碼性能。perf對單個程序做函數調用次數、上下文切換次數、中斷次數等信息進行統計。
使用方法
perf stat FILENAME #統計程序FILENAME的運行信息
perf top #查看系統中各個進程的資源占用率(可以通過-e選項來觀察指定類型的運行數據)
perf record FILENAME; perf report #這兩個命令組合使用,第一個命令將統計信息寫入到文件中,第二個命令從文件中讀取統計信息,然后展示出來
gprof###
gprof與perf功能類似,也是主要用戶程序性能分析。使用gprof要求在編譯鏈接的時候,添加-pg選項,然后執行程序,會生成包含性能統計信息的gmon.out文件,然后再使用gprof分析這個gmon.out文件來讀取程序相關的性能信息。gprof默認在程序結束的時候才會生成性能統計信息,因此如果想分析一個長期運行的程序,需要加入信號處理函數來讓程序調用exit主動退出而不是Ctrl C強制退出(這樣不會產生統計信息)
使用方法
gprof FILENAME gmon.out
火焰圖###
配合perf或者gprof使用,將性能統計信息可視化,方便用戶分析。