Linux下的檢測工具valgrind的使用(memcheck)

Valgrind 是在linux系統下開發應用程序時用於調試內存問題的工具。它尤其擅長髮現內存管理的問題,它可以檢查程序運行時的內存泄漏問題。

1、Valgrind的安裝

在Ubuntu上安裝Valgrind我們只需輸入相應的命令即可,如下:

一、sudo sudo apt-get install valgrind
在這裏插入圖片描述
二、我們可以在Valgrind的官網上面去下載

Valgrind的官網地址:http://www.valgrind.org/

2、Valgrind一 工具集介紹

Valgrind包含下列工具:

1、memcheck:檢查程序中的內存問題,如泄漏、越界、非法指針等。

2、callgrind:檢測程序代碼的運行時間和調用過程,以及分析程序性能。

3、cachegrind:分析CPU的cache命中率、丟失率,用於進行代碼優化。

4、helgrind:用於檢查多線程程序的競態條件。

5、massif:堆棧分析器,指示程序中使用了多少堆內存等信息。

6、lackey:

7、nulgrind:

這幾個工具的使用是通過命令:valgrand --tool=name 程序名來分別調用的,當不指定tool參數時默認是 --tool=memcheck

3、Valgrind工具Memcheck的介紹

關於Valgrind的工具我只講Memcheck的使用,因爲我們經常使用Memcheck的頻率比較多。

Memcheck
用來檢測程序中出現的內存問題,所有對內存的讀寫都會被檢測到,一切對malloc、free、new、delete的調用都會被捕獲。所以,它能檢測以下問題:

   1、對未初始化內存的使用;

   2、讀/寫釋放後的內存塊;

   3、讀/寫超出malloc分配的內存塊;

   4、讀/寫不適當的棧中內存塊;

   5、內存泄漏,指向一塊內存的指針永遠丟失;

   6、不正確的malloc/free或new/delete匹配;

   7、memcpy()相關函數中的dst和src指針重疊

4、 Memcheck的使用示例

我只介紹它的幾個使用,剩下的用法都是差不多的

(4.1) 對未初始化內存的使用

代碼:

#include <stdio.h>


int main (int argc, char **argv)
{
    int  *p; 
    int  c =*p;

   printf("%d\n", c);
    return 0;
} 

當我們運行它時會出現以下錯誤
在這裏插入圖片描述
將程序編譯生成可執行文件後執行:valgrind --leak-check=full ./a.out 將會出現以下頁面
在這裏插入圖片描述
上面紅色的部分就可以看出,我們使用了未初始化的內存,也就是我們經常說的野指針的使用

(4.2)內存泄漏的檢測

代碼如下:

#include <stdio.h>
#include <stdlib.h>

int *create()
{
    return (int *)malloc(sizeof(int));

}

int main (int argc, char **argv)
{
    int *p = create();
    *p = 100;
    return 0;
} 

我們運行結果及檢測如下:
在這裏插入圖片描述
從上面的圖片看出,很明顯我們在代碼中分配了內存,但是卻沒有釋放內存,如果我們加上free的話,就不存在內存泄漏
代碼如下:加上free釋放函數

#include <stdio.h>
#include <stdlib.h>

int *create()
{
    return (int *)malloc(sizeof(int));

}

int main (int argc, char **argv)
{
    int *p = create();
    *p = 100;
    free(p);
    return 0;
} 

代碼運行結果如下:
在這裏插入圖片描述
其他的使用方法和上面一樣,感興趣的朋友可以自己寫幾個代碼,然後嘗試使用以下Valgrind的使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章