valgrind簡介

绍荣發表於2024-08-07

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 報告中用於標識各種記憶體錯誤的內部識別符號。它們的具體含義如下:

  1. 錯誤程式碼 5269

程式碼 5269 通常表示 Valgrind 發現了一個無效的堆記憶體訪問問題。這個錯誤可能與訪問已經釋放的記憶體、越界寫入等有關。具體的錯誤訊息通常會描述記憶體訪問違規的詳細情況。

  1. 錯誤程式碼 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 工具進行效能分析的基本步驟是:

  1. 安裝 Valgrind。
  2. 編譯程式時包括除錯資訊。
  3. 使用 valgrind --tool=callgrind ./my_program 執行程式。
  4. 使用 kcachegrind 或 qcachegrind 檢視分析結果。

這種方法可以幫助深入瞭解程式的效能瓶頸,並進行相應的最佳化