首頁 > 科技 > 正文

Linux下內存問題檢測神器:Valgrind


更新日期:2019-10-18 21:02:10來源:網絡點擊:1495885
好醫生繼續教育網,好壓官網,好壓軟件官方下載,磁保持繼電器,磁力加熱攪拌器,磁力攪拌器

在寫大型C/C++工程時難免會發生內存泄漏現象,系統編程中一個重要的方面就是有效地處理與內存相關的問題。你的工作越接近系統,你就需要面對越多的內存問題。有時這些問題非常瑣碎,而更多時候它會演變成一個調試內存問題的惡夢。 常見的內存問題一共七種:1. 動態內存泄露;2. 資源泄露,比如文件指針不關閉;3. 動態內存越界;4.數組內存越界;5.動態內存double free;6.使用野指針,即未初始化的指針;7.釋放野指針,即未初始化的指針。

內存問題非常難定位,對于小工程來說,簡單去檢查代碼中new和delete的匹配對數就基本能定位到問題,但是一旦代碼量上升到以萬單位時,僅靠肉眼檢查來定位問題那就非常困難了,所以我們需要利用工具幫助我們找出問題所在。在Linux系統下內存檢測工具首推Valgrind,一款非常好用的開源內存管理框架。Valgrind其實是一個工具集,內存錯誤檢測只是它眾多功能的一個,但我們用得最多的功能正是它——memcheck。

該工具可以檢測下列與內存相關的問題 :

未釋放內存的使用

對釋放后內存的讀/寫

對已分配內存塊尾部的讀/寫

內存泄露

不匹配的使用malloc/new/new[] 和 free/delete/delete[]

重復釋放內存

首先安裝Valgrind非常簡單:

//valgrind下載:http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2valgrind安裝:1. tar -jxvf valgrind-3.12.0.tar.bz22. cd valgrind-3.12.03. ./configure4. make5. sudo make install

下面開始講解Valgrind的應用場景。

注意: 下面討論的所有測試代碼都應該使用gcc/g++并且加上-g選項。

1. 使用未初始化的內存(使用野指針)

這里我們定義了一個指針p,但并未給他開辟空間,即他是一個野指針,但我們卻使用它了。



Valgrind檢測出我們程序使用了未初始化的變量,但并未檢測出內存泄漏。

2.在內存被釋放后進行讀/寫(使用野指針)

p所指向的內存被釋放了,p變成了野指針,但是我們卻繼續使用這片內存。



Valgrind檢測出我們使用了已經free掉的內存,并給出這片內存是哪里分配哪里釋放的。

3.從已分配內存塊的尾部進行讀/寫(動態內存越界)

我們動態地分配了一段數組,但我們在訪問個數組時發生了越界讀寫,程序crash掉。



Valgrind檢測出越界的位置。



注意:Valgrind不檢查靜態分配數組的使用情況!所以對靜態分配的數組,Valgrind表示無能為力!比如下面的例子,程序crash掉,我們卻不知道為什么。



4.內存泄漏

內存泄漏的原因在于沒有成對地使用malloc/free和new/delete,比如下面的例子。



Valgrind會給出程序中malloc和free的出現次數以判斷是否發生內存泄漏,比如對上面的程序運行memcheck,Valgrind的記錄顯示上面的程序用了1次malloc,卻調用了0次free,明顯發生了內存泄漏!



上面提示了我們可以使用--leak-check=full進一步獲取內存泄漏的信息,比如malloc和free的具體行號。



5. 不匹配地使用malloc/new/new[] 和 free/delete/delete[]

正常使用new/delete和malloc/free是這樣子的:




而不匹配地使用malloc/new/new[] 和 free/delete/delete[]則會被提示mismacth:




6.兩次釋放內存

double free的情況同樣是根據malloc/free的匹配對數來體現的,比如free多了一次,Valgrind也會提示。




當然,Valgrind也不是萬能的。Valgrind也有無法找到問題的時候,有些問題只能通過不斷的review代碼找到了癥結。發現問題,解決問題,畢竟是末流。最好的方法,就是不引入內存問題。這可以通過良好的代碼風格和設計來實現的。

點贊,轉發,私信關鍵詞架構資料 給大更多家分享C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK技術,面試技巧方面的資料技術討論。


相關:

20年路飛粉?《航海王:狂熱行動》公開肖戰特輯《航海王:狂熱行動》尾田手繪海報 2019年是《航海王》動畫播出的第20年,即將于10月18日登上中國銀幕的《航海王:狂熱行動》正是為了這一盛事而特別制作的紀念版電影。《航海王:狂熱行動》是“航海王系列”第14..

《侏羅紀3》選角中 “星爵”克里斯·帕拉特回歸克里斯·帕拉特 在確定了開機時間后,《侏羅紀世界3》就馬不停蹄地進入到了選角的工作里,除了薩姆·尼爾、勞拉·鄧恩、杰夫·高布倫以及星爵克里斯·帕拉特和布萊絲·達拉斯·霍華德等人悉數回歸外,《節哀順變..

新《蝙蝠俠》反派確認!保羅·達諾將出演謎語人保羅·達諾 在確定了佐伊·克拉維茲扮演貓女之后,《蝙蝠俠》中的另一個重要角色,謎語人的人選也有了定論。最終,曾經出演了《血色將至》、《為奴十二年》、《陽光小美女》的保羅·達諾得到了這一角色。謎語人是..

相關熱詞搜索:好醫生繼續教育網,好壓官網,好壓軟件官方下載,磁保持繼電器,磁力加熱攪拌器,磁力攪拌器

上一篇: 努比亞 Z20 上手評測:雙屏手機的體驗與思考
下一篇: 智慧零售海拔再創新高 蘇寧零售云西藏第一店正式開業

140期平特一尾