linux下檢測(cè)內(nèi)存泄漏工具Valgrind |
發(fā)布時(shí)間: 2014/8/12 11:03:36 |
linux下檢測(cè)內(nèi)存泄漏工具Valgrind簡(jiǎn)介 在我們編寫C/C++的時(shí)候,最常見(jiàn)的錯(cuò)誤之一就是內(nèi)存泄露,這樣的問(wèn)題其實(shí)跟程序員的編程習(xí)慣密不可分。如果你在虛擬主機(jī)申請(qǐng)內(nèi)存空間之后能夠馬上在合適的位置釋放內(nèi)存。會(huì)極大程度的避免內(nèi)存泄漏的情況。但是人非圣賢,孰能無(wú)過(guò)。有時(shí)候我們確實(shí)忘記釋放內(nèi)存而導(dǎo)致了比較嚴(yán)重的錯(cuò)誤,所以這個(gè)時(shí)候我們需要借助valgrind這個(gè)工具來(lái)判斷內(nèi)存泄漏。 Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的內(nèi)存調(diào)試工具,它可以對(duì)編譯后的二進(jìn)制程序進(jìn)行內(nèi)存使用監(jiān)測(cè)(C語(yǔ)言中的malloc和free,以及C++中的new和delete),找出內(nèi)存泄漏問(wèn)題。 Valgrind 中包含的 Memcheck 工具可以檢查以下的程序錯(cuò)誤: 使用未初始化的內(nèi)存 (Use of uninitialised memory) 使用已經(jīng)釋放了的內(nèi)存 (Reading/writing memory after it has been free’d) 使用超過(guò)malloc分配的內(nèi)存空間(Reading/writing off the end of malloc’d blocks) 對(duì)堆棧的非法訪問(wèn) (Reading/writing inappropriate areas on the stack) 申請(qǐng)的空間是否有釋放 (Memory leaks – where pointers to malloc’d blocks are lost forever) malloc/free/new/delete申請(qǐng)和釋放內(nèi)存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete []) src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions) 重復(fù)free valgrind的使用實(shí)例: 在官網(wǎng)上找到valgrind的tar包,解壓,編譯。完成后make安裝:
編譯到制定位置:
安裝valgrind:
完成之后我們就可以對(duì)系統(tǒng)中的程序進(jìn)行檢測(cè)了,首先我們用ls顯示根目錄下的文件,ls命令是沒(méi)有內(nèi)存泄漏的:
為了體現(xiàn)valgrind 的檢錯(cuò)功能,我們故意編寫一個(gè)只malloc沒(méi)有free的C程序:
編譯鏈接后使用valgrind進(jìn)行檢測(cè),發(fā)現(xiàn)有內(nèi)存泄漏:
然后我們?cè)贑程序中釋放內(nèi)存:
再次編譯鏈接完成后使用valgrind檢測(cè):
這次則顯示我們申請(qǐng)并且釋放了400B的空間,體現(xiàn)了valgrind的強(qiáng)大作用。 有這樣的檢錯(cuò)工具當(dāng)然很好,但是我更認(rèn)為程序員應(yīng)該始終頭腦清醒,知道自己的程序在做什么,記得這個(gè)忠告,如果你的語(yǔ)言沒(méi)有垃圾回收機(jī)制。那么在申請(qǐng)一塊內(nèi)存之后先不要做任何操作,先在合適的位置釋放內(nèi)存。畢竟好借好還,再借不難么。 本文出自:億恩科技【www.allwellnessguide.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |