C++調試分析工具


靜態分析工具

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 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

gprofperf 功能類似,也是主要用戶程序性能分析。使用gprof要求在編譯鏈接的時候,添加-pg選項,然后執行程序,會生成包含性能統計信息的 gmon.out 文件,然后再使用 gprof 分析這個 gmon.out 文件來讀取程序相關的性能信息。gprof 默認在程序結束的時候才會生成性能統計信息,因此如果想分析一個長期運行的程序,需要加入信號處理函數來讓程序調用 exit 主動退出而不是 Ctrl C 強制退出(這樣不會產生統計信息)
使用方法:

gprof FILENAME gmon.out


免責聲明!

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



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