1. 程式人生 > >valgrind內存檢測泄漏工具使用

valgrind內存檢測泄漏工具使用

ESS 寫代碼 res 執行 hab 分享 編寫代碼 忽略 官方

valgrind內存檢測泄漏工具使用

1、為什麽要使用 Valgrind

? 內存泄漏的產生:內存泄漏(Memory Leak)是指程序中己動態分配的堆內存由於某種原因程序未釋放

或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果!

? Valgrind使用的目的:在人為編寫代碼不能預防消除內存泄漏的情況下,使用該工具對代碼進行檢測。

2、安裝 Valgrind

sudo apt-get install valgrind

3、如何使用

? 編寫如下程序malloc.c

#include <stdlib.h>
int main()
{
        void *p;
        p=malloc(20);
        return 0;
}

然後通過 gcc –g malloc.c,加入-g參數的目的是為了定位在第幾行

執行 valgrind --tool=memcheck --leak-check=full ./a.out得到如下結果

技術分享圖片

“definitely lost”:確認丟失。程序中存在內存泄露,應盡快修復。當程序結束時如果一塊動態分配的內存沒有被釋放且通過程序內的指針變量均無法訪問這塊內存則會報這個錯誤。

“indirectly lost”:間接丟失。當使用了含有指針成員的類或結構時可能會報這個錯誤。這類錯誤無需直接修復,他們總是與”definitely lost”一起出現,只要修復”definitely lost”即可。例子可參考我的例程。

“possibly lost”:可能丟失。大多數情況下應視為與”definitely lost”一樣需要盡快修復,除非你的程序讓一個指針指向一塊動態分配的內存(但不是這塊內存起始地址),然後通過運算得到這塊內存起始地址,再釋放它。當程序結束時如果一塊動態分配的內存沒有被釋放且通過程序內的指針變量均無法訪問這塊內存的起始地址,但可以訪問其中的某一部分數據,則會報這個錯誤。

“still reachable”:可以訪問,未丟失但也未釋放。如果程序是正常結束的,那麽它可能不會造成程序崩潰,但長時間運行有可能耗盡系統資源,因此筆者建議修復它。如果程序是崩潰(如訪問非法的地址而崩潰)而非正常結束的,則應當暫時忽略它,先修復導致程序崩潰的錯誤,然後重新檢測。

“suppressed”:已被解決。出現了內存泄露但系統自動處理了。可以無視這類錯誤。這類錯誤我沒能用例程觸發,看官方的解釋也不太清楚是操作系統處理的還是valgrind,也沒有遇到過。所以無視他吧~

修改程序為,並再次gcc –g malloc.c進行編譯

#include <stdlib.h>

int main()
{
        void *p;
        p=malloc(20);
        free(p);
        return 0;
}

技術分享圖片

沒有泄露!

4、valgrind還能幹什麽
? Memcheck。這是valgrind應用最廣泛的工具,一個重量級的內存檢查器,能夠發現開發中絕大多數內存錯誤使用情況,比如:使用未初始化的內存,使用已經釋放了的內存,內存訪問越界等。
? Callgrind。它主要用來檢查程序中函數調用過程中出現的問題。
? Cachegrind。它主要用來檢查程序中緩存使用出現的問題。
? Helgrind。它主要用來檢查多線程程序中出現的競爭問題。
? Massif。它主要用來檢查程序中堆棧使用中出現的問題。
? Extension。可以利用core提供的功能,自己編寫特定的內存調試工具

valgrind內存檢測泄漏工具使用