【工具】valgrind檢測C++程式碼記憶體洩漏
阿新 • • 發佈:2018-12-15
一、valgrind介紹:
valgrind是Linux下的一個開源工具,該工具用來檢測c++程式是否有非法使用記憶體的問題,例如訪問了未初始化的記憶體、訪問陣列時越界、忘記釋放動態記憶體等問題。Linux下使用命令或者原始碼安裝: 命令簡單安裝:
yum install valgrind
體系結構圖如下:
二、引數:
--log-file=日誌檔名稱
--num-callers=錯誤記錄的追蹤行數
--leak-check=full開啟詳細的記憶體洩漏檢測器
三、實戰:
1、檢測記憶體洩漏:
#include<stdio.h> #include<stdlib.h> int main() { int* p = (int*)malloc(sizeof(int)); return 0; }
編譯程式:gcc -g -o mem_discover mem_discover.cpp
gcc編譯程式的4個階段: 預處理階段:根據以#開頭的命令修改原始的c程式,也就是對標頭檔案的替換,可以使用gcc選項的-E來檢視。gcc指令的一般格式是:gcc [選項] 要編譯的檔案 [選項] [目標檔案],目標檔案可以預設,gcc預設生成的可執行檔案是.out。該階段處理過的檔案是.i檔案。 編譯階段:gcc要檢查程式碼的規範性,是否有語法錯誤,gcc把程式碼編譯成彙編程式碼。 使用者可以使用-S選項來檢視。該階段處理過的檔案為.s檔案。 彙編階段:將生成的.s檔案轉換為二進位制的目標檔案.o檔案。 連結階段:目標檔案轉為可執行檔案。
檢測:valgrind --tool=memcheck --leak-check=full ./mem_discover
結果:
2、檢測越界訪問(也是使用了未初始化記憶體):
#include<iostream>
using namespace std;
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
cout << a[10] << endl;
return 0;
}
結果:
3、使用未初始化的記憶體:
#include<iostream> using namespace std; int main() { int a=0,b; std::cout << b << endl; return 0; }
結果:
4、記憶體讀寫越界:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int *p = (int*)malloc(sizeof(int)*10);
*(p+11)=100;
std::cout << *(p+11) << endl;
return 0;
}
結果:
5、使用了無效指標:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* p = (char*)malloc(10);
p[10] = 'x';
free(p);
return 0;
}
結果:
6、重複釋放記憶體:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char* p = (char*)malloc(10);
free(p);
free(p);
return 0;
}
結果:
四、總結:
這是我第一次看到這種工具,只能說明人類大腦的強大!佩服!贊! 這種工具還能檢測程式碼中的死鎖問題,由於目前水平有限,後續會進行更新。 200多天了,感謝遇到的人,感謝大家的幫助,未來我會好好的~~:)