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的使用