valgrind內存檢測泄漏工具使用


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得到如下結果

1556693036788

“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;
}

1556693058095

沒有泄露!

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


免責聲明!

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



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