0 預備工作
- sudo apt-get update
- sudo apt-get install valgrind
- 編譯debug版本
- gcc -g -o your_program your_program.c
- set(CMAKE_BUILD_TYPE Debug)
1 定位記憶體洩露
Valgrind最著名的工具是memcheck,它用於記憶體錯誤的檢測,執行如下程式碼進行進行記憶體洩漏檢測
-
valgrind --leak-check=full ./your_program # 以下是備選項,會生成不同的輸出,都可以試一試;
--show-leak-kinds=all
-v
--track-origins=yes
-
valgrind --leak-check=full --show-leak-kinds=all -- track-origins=yes -v ./your_program 2> valgrind_output.txt
: 生成可讀性更好的報告
編譯C++程式的Debug版本之後,使用valgrind執行可執行程式,如下:
1.1 錯誤碼含義
在 Valgrind 中,5269 和 5213 是特定的錯誤程式碼,它們出現在 Valgrind 的錯誤報告中,用於標識不同型別的錯誤。具體來說,這些程式碼是 Valgrind 報告中用於標識各種記憶體錯誤的內部識別符號。它們的具體含義如下:
- 錯誤程式碼 5269
程式碼 5269 通常表示 Valgrind 發現了一個無效的堆記憶體訪問問題。這個錯誤可能與訪問已經釋放的記憶體、越界寫入等有關。具體的錯誤訊息通常會描述記憶體訪問違規的詳細情況。
- 錯誤程式碼 5213
程式碼 5213 通常指示一個未初始化的記憶體讀取問題。當程式讀取未初始化的記憶體區域時,Valgrind 會報告此錯誤。這種情況可能導致程式的行為不確定或崩潰,因為讀取未初始化的記憶體可能會導致不正確的結果。
檢視詳細資訊
要獲得這些錯誤程式碼的詳細描述和上下文,你可以檢查 Valgrind 的輸出日誌。Valgrind 的報告通常會包括以下內容:
- 錯誤的描述:描述錯誤的具體型別和位置。
- 程式碼行:指示發生錯誤的程式碼行和函式。
- 堆疊跟蹤:幫助你追蹤錯誤發生的位置和原因。
2 效能最佳化分析
Valgrind 是一個強大的工具,不僅提供memcheck進行記憶體除錯、記憶體洩漏檢測以及其他程式分析,還提供callgrind進行效能分析。
Valgrind 提供了一個叫做 callgrind 的工具,用於效能分析。callgrind 可以幫助你分析程式的呼叫圖和函式執行的時間,找出效能瓶頸。
2.1 執行 callgrind
valgrind --tool=callgrind ./my_program
這將生成一個名為 callgrind.out.<pid>
的檔案,其中 <pid>
是程序 ID。該檔案包含了效能資料。
2.2 分析效能資料
要檢視 callgrind 生成的效能資料,可以使用 kcachegrind
(圖形介面工具)或 qcachegrind
(另一種圖形介面工具)。在 Ubuntu 上,進行如下安裝
sudo apt-get install kcachegrind
然後,使用以下命令開啟生成的檔案:
kcachegrind callgrind.out.<pid>
在 kcachegrind 中,可以檢視各個函式的呼叫次數、每個函式的執行時間以及函式之間的呼叫關係。
2.3 解釋結果
在 kcachegrind 或其他分析工具中,還可以:
- 檢視呼叫圖:分析函式之間的呼叫關係,找出熱點函式。
- 檢視執行時間:找出耗時最多的函式或程式碼段。
- 檢視函式呼叫次數:分析函式呼叫的頻率,以最佳化效能。
2.4 總結
使用 Valgrind 的 callgrind 工具進行效能分析的基本步驟是:
- 安裝 Valgrind。
- 編譯程式時包括除錯資訊。
- 使用 valgrind --tool=callgrind ./my_program 執行程式。
- 使用 kcachegrind 或 qcachegrind 檢視分析結果。
這種方法可以幫助深入瞭解程式的效能瓶頸,並進行相應的最佳化