專(zhuān)利名稱(chēng):一種內(nèi)存檢測(cè)方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于存儲(chǔ)器領(lǐng)域,尤其涉及一種內(nèi)存檢測(cè)方法及裝置。
背景技術(shù):
內(nèi)存管理在計(jì)算機(jī)系統(tǒng)設(shè)計(jì)中是極其重要的,高效的內(nèi)存分配、釋放和整理在應(yīng)用中已越來(lái)越重要,內(nèi)存在使用過(guò)程中經(jīng)常出現(xiàn)內(nèi)存溢出、內(nèi)存異常或者野指針等現(xiàn)象,導(dǎo)致計(jì)算機(jī)程序異常或者錯(cuò)誤,嚴(yán)重時(shí)將導(dǎo)致計(jì)算機(jī)死機(jī),因此內(nèi)存的檢測(cè)對(duì)計(jì)算機(jī)系統(tǒng)和計(jì)算機(jī)程序是非常重要的。其中內(nèi)存溢出是指計(jì)算機(jī)程序按照指定的大小分配內(nèi)存區(qū)域存儲(chǔ)數(shù)據(jù)后,寫(xiě)入內(nèi)存的數(shù)據(jù)超出預(yù)先分配的內(nèi)存區(qū)域,從而導(dǎo)致改寫(xiě)了其他內(nèi)存區(qū)域的數(shù)據(jù)。內(nèi)存異常是指計(jì)算機(jī)程序按照指定的大小分配內(nèi)存區(qū)域后,該內(nèi)存區(qū)域內(nèi)的數(shù)據(jù)被非法改寫(xiě)。野指針是指向"垃圾"內(nèi)存的指針, 一般是指未被初始化的指針變量,或者指針變量已被釋放但在其他地方依舊使用的指針。
在大型的計(jì)算機(jī)程序中, 一般需要從計(jì)算機(jī)操作系統(tǒng)中為該計(jì)算機(jī)程序分配一塊內(nèi)存,并有計(jì)算才幾程序自行對(duì)這塊內(nèi)存進(jìn)行管理以獲得更快的內(nèi)存分配和釋放速度。在現(xiàn)有的需要自行進(jìn)行內(nèi)存管理的計(jì)算才幾程序中, 一般不對(duì)內(nèi)存進(jìn)行檢測(cè),或者僅對(duì)內(nèi)存的申請(qǐng)和釋放進(jìn)行管理,再在計(jì)算機(jī)程序退出時(shí)簡(jiǎn)單的檢測(cè)內(nèi)存泄漏,這種內(nèi)存檢測(cè)方法難以在計(jì)算機(jī)程序運(yùn)行過(guò)程中檢測(cè)出內(nèi)存異常、內(nèi)存溢出或者野指針等現(xiàn)象,在計(jì)算機(jī)程序出錯(cuò)時(shí),增加了定位內(nèi)存異常、內(nèi)存溢出或者野指針等現(xiàn)象的難度,降低了計(jì)算機(jī)程序效率。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例的目的在于提供一種內(nèi)存4全測(cè)方法,旨在解決現(xiàn)有內(nèi)存才企測(cè)方法難以及時(shí)檢測(cè)出內(nèi)存溢出、異常等錯(cuò)誤的問(wèn)題。
本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的, 一種內(nèi)存檢測(cè)方法,所述方法包括下述步驟
A、 為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值;
B、 對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根椐內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤。
本發(fā)明實(shí)施例的另一目的在于提供一種內(nèi)存檢測(cè)裝置,所述裝置包括狀態(tài)值設(shè)置單元,用于為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值;內(nèi)存檢測(cè)單元,用于對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),才艮據(jù)所述狀態(tài)值設(shè)置單元設(shè)置的內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤。
在本發(fā)明實(shí)施例中,根據(jù)內(nèi)存的不同狀態(tài)為內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值,對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存溢出、異常或者野指針現(xiàn)象,/人而可以及時(shí)、快速、有效的在計(jì)算才幾程序運(yùn)4亍過(guò)程中檢測(cè)出內(nèi)存中發(fā)生的內(nèi)存溢出、異?;蛘咭爸羔樀儒e(cuò)誤現(xiàn)象,減少了計(jì)算機(jī)程序的隱患,給程序調(diào)試帶來(lái)方便。
圖1是本發(fā)明實(shí)施例提供的內(nèi)存檢測(cè)方法的實(shí)現(xiàn)流程圖;圖2是本發(fā)明實(shí)施例提供的內(nèi)存檢測(cè)裝置的結(jié)構(gòu)框圖。
具體實(shí)施例方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
在本發(fā)明實(shí)施例中,根據(jù)內(nèi)存的使用狀態(tài)為內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值,在使用內(nèi)存或者內(nèi)存中的數(shù)據(jù)時(shí),通過(guò)檢測(cè)該內(nèi)存的狀態(tài)值判斷該內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤,如內(nèi)存溢出、異?;蛘咭爸羔槵F(xiàn)象。
6圖1示出了本發(fā)明實(shí)施例提供的內(nèi)存檢測(cè)方法的實(shí)現(xiàn)流程,詳述如下在步驟S101中,為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值。其具體步驟如下
A、 在對(duì)內(nèi)存進(jìn)行初始化時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已初始化。在本發(fā)明實(shí)施例中,可以通過(guò)將該內(nèi)存中的數(shù)據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已初始化的數(shù)據(jù),如可以將該內(nèi)存中的數(shù)據(jù)填充為Oxab,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已初始4t。
B、 在釋放一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已釋放。在本發(fā)明實(shí)施例中,可以通過(guò)將該內(nèi)存中的數(shù)據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已釋放的數(shù)據(jù),如可以將該內(nèi)存中的數(shù)據(jù)填充為Oxfe,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已釋放。
C、 在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化,并為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存,用于存儲(chǔ)申請(qǐng)到的內(nèi)存的初始值(以后稱(chēng)為magic值)。該magic值一般選擇用戶(hù)數(shù)據(jù)出現(xiàn)概率較小的一個(gè)值。在本發(fā)明實(shí)施例中,可以通過(guò)將已申請(qǐng)到的內(nèi)存中的數(shù)據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化的數(shù)據(jù),如可以將已申請(qǐng)到的內(nèi)存中的數(shù)據(jù)填充為0xcd,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但未^:初始化。其具體步驟如下
a、 在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),在內(nèi)存地址管理器中記錄分配內(nèi)存代碼所對(duì)應(yīng)的文件名和行號(hào),并為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存。其中n為大于或者等于2的自然數(shù)。如申請(qǐng)或者重新分配一塊內(nèi)存時(shí),為申請(qǐng)的內(nèi)存多分配8個(gè)字節(jié)的內(nèi)存;
b、 在申請(qǐng)到的內(nèi)存的前x字節(jié)填充第一初始值(以后稱(chēng)為第一 magic值),在申請(qǐng)到的內(nèi)存的最后y字節(jié)填充第二初始值(以后稱(chēng)為第二magic值),以標(biāo)識(shí)申請(qǐng)到的內(nèi)存的上、下限。其中x、 y均為大于或者等于l且小于n的自然數(shù),lx + y=n。如給申請(qǐng)到的內(nèi)存的前4字節(jié)填充第一magic值為F1F2F3F4,給申請(qǐng)到的內(nèi)存的最后4個(gè)字節(jié)填充第二 magic值為F5F6F7F8;
c、 設(shè)置已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化。如可以將已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù)據(jù)填充為Oxcd,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化。即該內(nèi)存中存儲(chǔ)的數(shù)據(jù)是未被初始化的。
請(qǐng)參閱表l.l,為本發(fā)明實(shí)施例提供的計(jì)算機(jī)程序申請(qǐng)前、申請(qǐng)到、釋放一塊內(nèi)存時(shí)內(nèi)存中的實(shí)際數(shù)據(jù)的一個(gè)示例。其中ptr(CD)是指申請(qǐng)到的給計(jì)算機(jī)程序使用的內(nèi)存。對(duì)于已經(jīng)初始化的內(nèi)存,該內(nèi)存中的數(shù)據(jù)被填充為Oxab,對(duì)于已釋放的內(nèi)存,該內(nèi)存中的數(shù)據(jù)被填充為Oxfe,對(duì)于已經(jīng)申請(qǐng)到的內(nèi)存,該內(nèi)存的前端部分的數(shù)據(jù);陂填充為F1F2F3F4,該內(nèi)存的后端部分的數(shù)據(jù)被填充為F5F6F7F8,已申請(qǐng)到給計(jì)算才/l4呈序使用的內(nèi)存,其內(nèi)存中的數(shù)據(jù)被填充為Oxcd。
表l.l
…ABABABABABABABAB...ABABABAB...
…F1F2F3F4ptr (CD)F5F6F7F8…
…FEFEFEFEFEFEFEFE…FEFEFEFE…
…F1F2F3F4CDCDCDCD…F5F6F7F8…
在步驟S102中,對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生錯(cuò)誤。其中內(nèi)存發(fā)生錯(cuò)誤包括但不限于內(nèi)存溢出、內(nèi)存異常、使用未初始化變量或者野指4t"等現(xiàn)象。其具體步驟如下
A、 檢測(cè)已申請(qǐng)的內(nèi)存的magic值是否與申請(qǐng)內(nèi)存時(shí)設(shè)置的magic值相同,以判斷已申請(qǐng)的內(nèi)存是否發(fā)生了內(nèi)存溢出或者內(nèi)存異常。其具體過(guò)程如下
檢測(cè)已申請(qǐng)的內(nèi)存的第一 magic值是否被改寫(xiě),如果是,則判定此內(nèi)存發(fā)生了內(nèi)存異常,檢測(cè)已申請(qǐng)的內(nèi)存的第二 magic值是否被覆蓋,如果是,則判定該內(nèi)存發(fā)生了內(nèi)存溢出。
如當(dāng)檢測(cè)到已申請(qǐng)的內(nèi)存的前端部分的第一 magic值F1F2F3F4被改寫(xiě)了 ,則判定此內(nèi)存發(fā)生了內(nèi)存異常,當(dāng)檢測(cè)到該內(nèi)存的后端部分的第二 magic值F5F6F7F8^皮覆蓋了,則判定該內(nèi)存發(fā)生了內(nèi)存溢出。
B、 檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或者已釋放,以判斷未被分配的內(nèi)存是否發(fā)生了內(nèi)存異常。其具體過(guò)程如下
檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或者已釋放,如果不是,則判定未被分配的內(nèi)存發(fā)生了內(nèi)存異常,即判定未被分配的內(nèi)存被非法改寫(xiě)了 。
為了達(dá)到更好的內(nèi)存檢測(cè)效果,在本發(fā)明另一實(shí)施例中,該方法還包括下述步驟
C、 檢測(cè)計(jì)算機(jī)程序使用的數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了變量未被初始化就使用的現(xiàn)象。其具體判斷過(guò)程如下
檢測(cè)計(jì)算機(jī)程序使用的數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中的數(shù)據(jù),如果是,則判定發(fā)生了變量未被初始化就使用的現(xiàn)象。如當(dāng)通過(guò)將已申請(qǐng)到的給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù)據(jù)填充為Oxcd來(lái)設(shè)置該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化時(shí),則如果檢測(cè)到計(jì)算機(jī)程序使用的數(shù)據(jù)是Oxcd,則判定發(fā)生了變量未被初始化就使用的現(xiàn)象。
為了更好的內(nèi)存檢測(cè)效果,在本發(fā)明另一實(shí)施例中,該方法還包括下述步
驟
D、 檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù)是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了野指針引用現(xiàn)象。其具體判斷過(guò)程如下
檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù)是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),如果是,則判定發(fā)生了野指針引用現(xiàn)象。如當(dāng)通過(guò)將已釋放的內(nèi)存中的數(shù)據(jù)填充為Oxfe來(lái)設(shè)置該內(nèi)存的狀態(tài)值為已釋放時(shí),則如果檢測(cè)到計(jì)算機(jī)程序使用的指針數(shù)據(jù)是Oxfe,則判定發(fā)生了野指針引用現(xiàn)象。
為了及時(shí)的將內(nèi)存4企測(cè)結(jié)果呈現(xiàn)給用戶(hù),以使用戶(hù)盡快的定位到內(nèi)存錯(cuò)誤的位置和原因,在本發(fā)明另一實(shí)施例中,該方法還包"^下述步驟
在步驟S103中,輸出內(nèi)存檢測(cè)結(jié)果。
在本發(fā)明實(shí)施例中,對(duì)S102中出現(xiàn)的各種異常的輸出過(guò)程具體如下
A、輸出發(fā)生了何種異常,根據(jù)對(duì)應(yīng)檢測(cè)的到內(nèi)存異常的地址,在內(nèi)存地
9址管理器查詢(xún)對(duì)應(yīng)的文件名和行數(shù),并在內(nèi)存地址管理器查詢(xún)此內(nèi)存地址的前一塊和后一塊已分配的內(nèi)存所對(duì)應(yīng)的文件名和行數(shù),輸出對(duì)應(yīng)的異常內(nèi)存的文件名和行數(shù),以及對(duì)應(yīng)可能導(dǎo)致此內(nèi)存異常的緊鄰的前后內(nèi)存所對(duì)應(yīng)的文件名和行數(shù)。
B、 輸出發(fā)生了何種異常,根據(jù)產(chǎn)生異常的內(nèi)存地址,在內(nèi)存地址管理器查詢(xún)此內(nèi)存地址的前一塊和后一塊已分配的內(nèi)存所對(duì)應(yīng)的文件名和行數(shù),輸出異常的內(nèi)存地址和對(duì)應(yīng)可能導(dǎo)致此內(nèi)存異常的緊鄰的前后內(nèi)存所對(duì)應(yīng)的文件名
和行數(shù)o
C、 輸出發(fā)生了何種異常,并根據(jù)內(nèi)存地址在內(nèi)存地址管理器查詢(xún)對(duì)應(yīng)的文件名和行數(shù),輸出對(duì)應(yīng)的文件名和行數(shù)。
D、 輸出發(fā)生了何種異常,并根據(jù)內(nèi)存地址在內(nèi)存地址管理器查詢(xún)對(duì)應(yīng)的文件名和行it,輸出對(duì)應(yīng)的文件名和行數(shù)。
圖2示出了本發(fā)明實(shí)施例提供的內(nèi)存檢測(cè)裝置的結(jié)構(gòu),為了便于說(shuō)明,僅示出了與本發(fā)明實(shí)施例相關(guān)的部分。該內(nèi)存檢測(cè)裝置可以是內(nèi)置于具有內(nèi)存應(yīng)用的電子設(shè)備中的軟件單元、硬件單元或者軟硬件相結(jié)合的單元,或者作為獨(dú)立的掛件集成到具有內(nèi)存應(yīng)用的電子設(shè)備中。其中
狀態(tài)值設(shè)置單元1為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值。該狀態(tài)值設(shè)置單元1包括初始化狀態(tài)值設(shè)置單元11、釋放狀態(tài)值設(shè)置單元12和已申請(qǐng)狀態(tài)值設(shè)置單元13。其中
初始化狀態(tài)值設(shè)置單元11在對(duì)內(nèi)存進(jìn)行初始化時(shí),i殳置該內(nèi)存的狀態(tài)值為已初始化。在本發(fā)明實(shí)施例中,可以通過(guò)將該內(nèi)存中的彩:據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已初始化的數(shù)據(jù),如可以將該內(nèi)存中的凄t據(jù)填充為Oxab,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已初始化。
釋放狀態(tài)值設(shè)置單元12在釋放一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已釋放。在本發(fā)明實(shí)施例中,可以通過(guò)將該內(nèi)存中的數(shù)據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已釋放的數(shù)據(jù),如可以將該內(nèi)存中的數(shù)據(jù)填充為Oxfe,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已釋i丈。
已申請(qǐng)狀態(tài)值設(shè)置單元13在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的 狀態(tài)值為已申請(qǐng)但未被初始化,并為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存, 用于存儲(chǔ)申請(qǐng)到的內(nèi)存的magic值。在本發(fā)明實(shí)施例中,可以通過(guò)將已申請(qǐng)到 給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù)據(jù)填充為用于標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但 未被初始化的數(shù)據(jù),如可以將已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù)據(jù)填充 為Oxcd,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化。
該已申請(qǐng)狀態(tài)值設(shè)置單元13包括內(nèi)存分配模塊131、初始值設(shè)置模塊132 和已申請(qǐng)狀態(tài)值設(shè)置模塊133。其中
內(nèi)存分配模塊131在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),為申請(qǐng)的內(nèi)存多分配 大小為n字節(jié)的內(nèi)存。其中n為大于或者等于2的自然數(shù)。如申請(qǐng)或者重新分 配一塊內(nèi)存時(shí),為申請(qǐng)的內(nèi)存多分配8個(gè)字節(jié)的內(nèi)存;
初始值設(shè)置模塊132在申請(qǐng)到的內(nèi)存的前x字節(jié)填充第一magic值,給申 請(qǐng)到的內(nèi)存的最后y字節(jié)填充第二 magic值,以標(biāo)識(shí)申請(qǐng)到的內(nèi)存的上、下限。 其中x、 y均為大于或者等于1且小于n的自然數(shù),且x + y-n。如給申請(qǐng)到的 內(nèi)存的前4字節(jié)填充第一 magic值為F1F2F3F4,給申請(qǐng)到的內(nèi)存的最后4個(gè)字 節(jié)填充第二 magic值為F5F6F7F8;
已申請(qǐng)狀態(tài)值設(shè)置模塊133設(shè)置已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存的狀態(tài) 值為已申請(qǐng)但未被初始化。如可以將已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù) 據(jù)填充為0xcd,以標(biāo)識(shí)該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化。即該內(nèi)存中存 儲(chǔ)的數(shù)據(jù)是未被初始化的。
內(nèi)存檢測(cè)單元2對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是 否發(fā)生錯(cuò)誤。其中內(nèi)存發(fā)生錯(cuò)誤包括但不限于內(nèi)存溢出、內(nèi)存異常、使用未初 始化變量或者野指針等現(xiàn)象。該內(nèi)存檢測(cè)單元2包括已申請(qǐng)內(nèi)存檢測(cè)單元21 和未分配內(nèi)存4企測(cè)單元22。其中
已申請(qǐng)內(nèi)存檢測(cè)單元21檢測(cè)已申請(qǐng)的內(nèi)存的magic值 否與申請(qǐng)內(nèi)存時(shí)設(shè)置的magic值相同,以判斷已申請(qǐng)的內(nèi)存是否發(fā)生了內(nèi)存溢出或者內(nèi)存異常。 其具體過(guò)程如下
檢測(cè)已申請(qǐng)的內(nèi)存的第一 magic值是否被改寫(xiě),如果是,則判定此內(nèi)存發(fā) 生了內(nèi)存異常,檢測(cè)已申請(qǐng)的內(nèi)存的第二 magic值是否^史覆蓋,如果是,則判 定該內(nèi)存發(fā)生了內(nèi)存溢出。
如當(dāng)^企測(cè)到已申請(qǐng)的內(nèi)存的前端部分的第一 magic值F1F2F3F4被改寫(xiě)了 , 則判定此內(nèi)存發(fā)生了內(nèi)存異常,當(dāng)檢測(cè)到該內(nèi)存的后端部分的第二 magic值 F5F6F7F8被覆蓋了 ,則判定該內(nèi)存發(fā)生了內(nèi)存溢出。
未分配內(nèi)存檢測(cè)單元22檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或 者已釋放,以判斷未被分配的內(nèi)存是否發(fā)生了內(nèi)存異常。其具體過(guò)程如下
檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或者已釋放,如果不是,則 判定未被分配的內(nèi)存發(fā)生了內(nèi)存異常,即判定未被分配的內(nèi)存被非法改寫(xiě)了 。
為了達(dá)到更好的內(nèi)存檢測(cè)效果,在本發(fā)明另一實(shí)施例中,內(nèi)存檢測(cè)單元2 還包括未初始化檢測(cè)單元23。該未初始化檢測(cè)單元23檢測(cè)計(jì)算機(jī)程序使用的 數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了 變量未被初始化就使用的現(xiàn)象。其具體判斷過(guò)程如下
檢測(cè)計(jì)算機(jī)程序使用的數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中 的數(shù)據(jù),如果是,則判定發(fā)生了變量未被初始化就使用的現(xiàn)象。如當(dāng)通過(guò)將已 申請(qǐng)到的給計(jì)算機(jī)程序使用的內(nèi)存中的數(shù)據(jù)填充為Oxcd來(lái)設(shè)置該內(nèi)存的狀態(tài) 值為已申請(qǐng)但未被初始化時(shí),則如果檢測(cè)到計(jì)算機(jī)程序使用的數(shù)據(jù)是Oxcd,則 判定發(fā)生了變量未被初始化就使用的現(xiàn)象。
為了更好的內(nèi)存檢測(cè)效果,在本發(fā)明另一實(shí)施例中,內(nèi)存檢測(cè)單元2還包 括野指針檢測(cè)單元24。該野指針檢測(cè)單元24檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù) 是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了野指針引用現(xiàn)象。 其具體判斷過(guò)程如下
檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù)是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),
12如果是,則判定發(fā)生了野指針引用現(xiàn)象。如當(dāng)通過(guò)將已釋放的內(nèi)存中的數(shù)據(jù)填
充為Oxfe來(lái)設(shè)置該內(nèi)存的狀態(tài)值為已釋放時(shí),則如果檢測(cè)到計(jì)算機(jī)程序使用的 指針數(shù)據(jù)是Oxfe,則判定發(fā)生了野指針引用現(xiàn)象。
為了及時(shí)的將內(nèi)存4企測(cè)結(jié)辱呈現(xiàn)給用戶(hù),以使用戶(hù)盡快的定位到內(nèi)存錯(cuò)誤 的位置和原因,在本發(fā)明另一實(shí)施例中,該裝置還包括-險(xiǎn)測(cè)結(jié)果輸出單元3。 該檢測(cè)結(jié)果輸出單元3輸出內(nèi)存檢測(cè)結(jié)果。其中輸出單元3輸出內(nèi)存檢測(cè)單元 2檢測(cè)到的各種異常的過(guò)程具體如下
A、 輸出發(fā)生了何種異常,根據(jù)對(duì)應(yīng)檢測(cè)的到內(nèi)存異常的地址,在內(nèi)存地 址管理器查詢(xún)對(duì)應(yīng)的文件名和^f亍數(shù),并在內(nèi)存地址管理器查詢(xún)此內(nèi)存地址的前 一塊和后一塊已分配的內(nèi)存所對(duì)應(yīng)的文件名和行數(shù),輸出對(duì)應(yīng)的異常內(nèi)存的文 件名和行數(shù),以及對(duì)應(yīng)可能導(dǎo)致此內(nèi)存異常的緊鄰的前后內(nèi)存所對(duì)應(yīng)的文件名 和行數(shù)。
B、 輸出發(fā)生了何種異常,根據(jù)產(chǎn)生異常的內(nèi)存地址,在內(nèi)存地址管理器 查詢(xún)此內(nèi)存地址的前一塊和后一塊已分配的內(nèi)存所對(duì)應(yīng)的文件名和4亍數(shù),輸出 異常的內(nèi)存地址和對(duì)應(yīng)可能導(dǎo)致此內(nèi)存異常的緊鄰的前后內(nèi)存所對(duì)應(yīng)的文件名 和行數(shù)0
C、 輸出發(fā)生了何種異常,并根據(jù)內(nèi)存地址在內(nèi)存地址管理器查詢(xún)對(duì)應(yīng)的 文件名和行數(shù),輸出對(duì)應(yīng)的文件名和行數(shù)。
D、 輸出發(fā)生了何種異常,并根據(jù)內(nèi)存地址在內(nèi)存地址管理器查詢(xún)對(duì)應(yīng)的 文件名和行數(shù),輸出對(duì)應(yīng)的文件名和行數(shù)。
在本發(fā)明實(shí)施例中,根據(jù)內(nèi)存的不同狀態(tài)為內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值,對(duì)內(nèi) 存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存溢出、異常或 者野指針現(xiàn)象,可以及時(shí)、快速、有效的檢測(cè)出內(nèi)存中發(fā)生的內(nèi)存溢出、異常 或者野指針現(xiàn)象,減少計(jì)算機(jī)程序的隱患,方^f更程序調(diào)試。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā) 明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1、一種內(nèi)存檢測(cè)方法,其特征在于,所述方法包括下述步驟A、為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值;B、對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤。
2、 如權(quán)利要求l所述的方法,其特征在于,所述內(nèi)存錯(cuò)誤包括內(nèi)存溢出、異常、使用未初始化變量或者野指針現(xiàn)象。
3、 如權(quán)利要求1或2所述的方法,其特征在于,所述步驟A具體包括Al、在對(duì)內(nèi)存進(jìn)行初始化時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已初始化;A2、在釋放一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已釋放;A3、在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化,并為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存,用于存儲(chǔ)申請(qǐng)到的內(nèi)存的初始^直。
4、 如權(quán)利要求3所述的方法,其特征在于,所述步驟A3具體包括在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存,所述n為大于或者等于2的自然數(shù);在申請(qǐng)到的內(nèi)存的前x字節(jié)填充第一初始值,在申請(qǐng)到的內(nèi)存的最后y字節(jié)填充第二初始值,以標(biāo)識(shí)申請(qǐng)到的內(nèi)存的上、下限;設(shè)置已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化。
5、 如權(quán)利要求3所述的方法,其特征在于,所述步驟B具體包括Bl、檢測(cè)已申請(qǐng)的內(nèi)存的初始值是否與申請(qǐng)內(nèi)存時(shí)設(shè)置的初始值相同,以判斷已申請(qǐng)的內(nèi)存是否發(fā)生了內(nèi)存溢出或者內(nèi)存異常;B2、檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或者已釋放,以判斷未被分配的內(nèi)存是否發(fā)生了內(nèi)存異常。
6、 如權(quán)利要求5所述的方法,其特征在于,所述步驟B還包括檢測(cè)計(jì)算機(jī)程序使用的數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了變量未被初始化就使用的現(xiàn)象;和/或檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù)是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了野指針引用現(xiàn)象。
7、 一種內(nèi)存檢測(cè)裝置,其特征在于,所述裝置包括狀態(tài)值設(shè)置單元,用于為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值;內(nèi)存4全測(cè)單元,用于對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),才艮據(jù)所述狀態(tài)值設(shè)置單元設(shè)置的內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤。
8、 如權(quán)利要求7所述的裝置,其特征在于,所述狀態(tài)值設(shè)置單元包括初始化狀態(tài)值設(shè)置單元,用于在對(duì)內(nèi)存進(jìn)行初始化時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已初始化;釋放狀態(tài)值設(shè)置單元,用于在釋放一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已釋放;已申請(qǐng)狀態(tài)值設(shè)置單元,用于在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),設(shè)置該內(nèi)存的狀態(tài)值為已申請(qǐng)但未被初始化,并為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存,用于存儲(chǔ)申請(qǐng)到的內(nèi)存的初始值。
9、 如權(quán)利要求8所述的裝置,其特征在于,所述已申請(qǐng)狀態(tài)值設(shè)置單元具體包括內(nèi)存分配模塊,用于在申請(qǐng)或者重新分配一塊內(nèi)存時(shí),為申請(qǐng)的內(nèi)存多分配大小為n字節(jié)的內(nèi)存,所述n為大于或者等于2的自然數(shù);初始值設(shè)置模塊,用于在申請(qǐng)到的內(nèi)存的前x字節(jié)填充第一初始值,在申請(qǐng)到的內(nèi)存的最后y字節(jié)填充第二初始值,以標(biāo)識(shí)申請(qǐng)到的內(nèi)存的上、下限;已申請(qǐng)狀態(tài)值設(shè)置模塊,用于設(shè)置已申請(qǐng)到給計(jì)算機(jī)程序使用的內(nèi)存的狀態(tài)值為已申請(qǐng)但未4皮初始化。
10、 如權(quán)利要求8所述的裝置,其特征在于,所述內(nèi)存檢測(cè)單元包括已申請(qǐng)內(nèi)存檢測(cè)單元,用于檢測(cè)已申請(qǐng)的內(nèi)存的初始值是否與申請(qǐng)內(nèi)存時(shí)設(shè)置的初始值相同,以判斷已申請(qǐng)的內(nèi)存是否發(fā)生了內(nèi)存溢出或者內(nèi)存異常;未分配內(nèi)存檢測(cè)單元,用于檢測(cè)未被分配的內(nèi)存的狀態(tài)值是否為已初始化或者已釋放,以判斷未被分配的內(nèi)存是否發(fā)生了內(nèi)存異常。
11、如權(quán)利要求IO所述的裝置,其特征在于,所述內(nèi)存檢測(cè)單元還包括未初始化檢測(cè)單元,用于檢測(cè)計(jì)算機(jī)程序使用的數(shù)據(jù)是否為狀態(tài)值為已申請(qǐng)但未被初始化的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了變量未被初始化就使用的現(xiàn)象;和/或野指針檢測(cè)單元,用于檢測(cè)計(jì)算機(jī)程序使用的指針數(shù)據(jù)是否為狀態(tài)值為已釋放的內(nèi)存中的數(shù)據(jù),以判斷是否發(fā)生了野指針引用現(xiàn)象。
全文摘要
本發(fā)明適用于存儲(chǔ)器領(lǐng)域,提供了一種內(nèi)存檢測(cè)方法及裝置,所述方法包括下述步驟A.為不同狀態(tài)的內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值;B.對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存錯(cuò)誤。本發(fā)明實(shí)施例通過(guò)根據(jù)內(nèi)存的不同狀態(tài)為內(nèi)存設(shè)置對(duì)應(yīng)的狀態(tài)值,對(duì)內(nèi)存使用情況進(jìn)行檢測(cè),根據(jù)內(nèi)存的狀態(tài)值判斷內(nèi)存是否發(fā)生內(nèi)存溢出、異常或者野指針現(xiàn)象,從而可以及時(shí)、快速、有效的在計(jì)算機(jī)程序運(yùn)行過(guò)程中檢測(cè)出內(nèi)存中發(fā)生的內(nèi)存溢出、異常或者野指針等錯(cuò)誤現(xiàn)象,減少了計(jì)算機(jī)程序的隱患,給程序調(diào)試帶來(lái)方便。
文檔編號(hào)G06F11/36GK101599046SQ20091010813
公開(kāi)日2009年12月9日 申請(qǐng)日期2009年6月26日 優(yōu)先權(quán)日2009年6月26日
發(fā)明者徐佳宏, 王美聰, 程伯欽, 偉 聶 申請(qǐng)人:深圳市茁壯網(wǎng)絡(luò)股份有限公司