一種內(nèi)存越界的定位方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種內(nèi)存越界的定位方法及裝置。
【背景技術(shù)】
[0002]現(xiàn)在嵌入式Iinux設(shè)備的應(yīng)用場(chǎng)景越來(lái)越多,相關(guān)的軟件開(kāi)發(fā)的規(guī)模也越來(lái)越大,對(duì)調(diào)試軟件bug的時(shí)間和難度要求也越來(lái)越高,其中,內(nèi)存越界就是一個(gè)調(diào)試難度很大,也非常耗費(fèi)時(shí)間,卻很容易出現(xiàn)的bug。
[0003]現(xiàn)有技術(shù)中,常用的定位方法只能定位最后發(fā)生問(wèn)題的代碼位置,但內(nèi)存越界是對(duì)越界后內(nèi)存的污染,當(dāng)時(shí)不會(huì)發(fā)生錯(cuò)誤,事后使用被污染的內(nèi)存時(shí),才會(huì)觸發(fā)錯(cuò)誤,所以常見(jiàn)的調(diào)試方法,只能定位到使用被污染內(nèi)存的代碼,但無(wú)法定位到元兇內(nèi)存越界的代碼。內(nèi)存越界可能是數(shù)據(jù)段的內(nèi)存、?;蛘叨?,其中堆內(nèi)存越界是最常見(jiàn),也最難定位的,因?yàn)槎褍?nèi)存是使用最多且全局都可以訪問(wèn)的。所以內(nèi)存越界常見(jiàn)的解決方法是依靠業(yè)務(wù)經(jīng)驗(yàn)和測(cè)試來(lái)不斷縮小范圍,或者移植到其他功能更強(qiáng)大的系統(tǒng)上,依靠強(qiáng)大的硬件和工具來(lái)定位,但往往環(huán)境改變或模擬業(yè)務(wù)很難再?gòu)?fù)現(xiàn)問(wèn)題。
[0004]通過(guò)上述描述可見(jiàn),對(duì)于內(nèi)存越界的定位需要根據(jù)經(jīng)驗(yàn)和測(cè)試不斷縮小范圍,或移植到其他功能更強(qiáng)大的系統(tǒng)上進(jìn)行定位,總之,現(xiàn)有技術(shù)中需要花費(fèi)大量時(shí)間和資源來(lái)進(jìn)行定位,定位效率較低。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明提供了一種內(nèi)存越界的定位方法及裝置,能夠提高內(nèi)存越界定位的效率。
[0006]本發(fā)明提供了一種內(nèi)存越界的定位方法,包括:預(yù)先設(shè)置用于檢測(cè)內(nèi)存越界的檢測(cè)接口,還包括:
[0007]S1:在被申請(qǐng)的有效內(nèi)存的兩端分別增加與所述有效內(nèi)存相鄰的保護(hù)內(nèi)存;
[0008]S2:當(dāng)發(fā)生錯(cuò)誤時(shí),調(diào)用所述檢測(cè)接口 ;
[0009]S3:通過(guò)所述檢測(cè)接口檢測(cè)每個(gè)有效內(nèi)存的保護(hù)內(nèi)存是否被內(nèi)存越界污染,確定所有有效內(nèi)存中發(fā)生內(nèi)存越界的越界內(nèi)存;
[0010]S4:確定所述越界內(nèi)存對(duì)應(yīng)的代碼。
[0011]進(jìn)一步地,所述S3,包括:
[0012]通過(guò)所述檢測(cè)接口檢測(cè)當(dāng)前有效內(nèi)存的保護(hù)內(nèi)存是否滿足:后端的保護(hù)內(nèi)存被內(nèi)存越界污染,且前端的內(nèi)存沒(méi)有被內(nèi)存越界污染,如果是,則判定當(dāng)前有效內(nèi)存發(fā)生內(nèi)存越界,否則,判定當(dāng)前有效內(nèi)存沒(méi)有發(fā)生內(nèi)存越界。
[0013]進(jìn)一步地,還包括:
[0014]在堆棧中記錄每個(gè)有效內(nèi)存在創(chuàng)建時(shí)的第一預(yù)設(shè)值條堆棧信息;
[0015]所述S4,包括:
[0016]獲取所述越界內(nèi)存對(duì)應(yīng)的堆棧信息;
[0017]根據(jù)所述堆棧信息確定所述越界內(nèi)存在代碼中創(chuàng)建的位置。
[0018]進(jìn)一步地,所述根據(jù)所述堆棧信息確定所述越界內(nèi)存在代碼中創(chuàng)建的位置,包括:
[0019]根據(jù)所述堆棧信息獲取函數(shù)調(diào)用關(guān)系;
[0020]根據(jù)所述函數(shù)調(diào)用關(guān)系確定所述越界內(nèi)存在代碼中創(chuàng)建的位置。
[0021]進(jìn)一步地,在所述SI之前,還包括:
[0022]Al:判斷當(dāng)前空閑的內(nèi)存的大小是否小于等于第二預(yù)設(shè)值,如果是,則執(zhí)行SI,否則執(zhí)行BI ;
[0023]B1:在有效內(nèi)存被申請(qǐng)時(shí),創(chuàng)建所述PageHeap,將所述有效內(nèi)存的結(jié)尾放在所述PageHeap頁(yè)的邊緣,在所述有效內(nèi)存后分配與所述有效內(nèi)存相鄰的不能寫(xiě)的內(nèi)存;
[0024]B2:檢測(cè)內(nèi)存越界的信號(hào),當(dāng)檢測(cè)到內(nèi)存越界的信號(hào)時(shí),判定當(dāng)前有效內(nèi)存發(fā)生內(nèi)存越界;
[0025]B3:根據(jù)所述PageHeap確定發(fā)生內(nèi)存越界的有效內(nèi)存對(duì)應(yīng)的代碼。
[0026]另一方面,本發(fā)明提供了一種內(nèi)存越界的定位裝置,包括:
[0027]設(shè)置單元,用于設(shè)置用于檢測(cè)內(nèi)存越界的檢測(cè)接口 ;
[0028]增加單元,用于在被申請(qǐng)的有效內(nèi)存的兩端分別增加與所述有效內(nèi)存相鄰的保護(hù)內(nèi)存;
[0029]調(diào)用單元,用于當(dāng)發(fā)生錯(cuò)誤時(shí),調(diào)用所述檢測(cè)接口 ;
[0030]第一確定單元,用于通過(guò)所述檢測(cè)接口檢測(cè)每個(gè)有效內(nèi)存的保護(hù)內(nèi)存是否被內(nèi)存越界污染,確定所有有效內(nèi)存中發(fā)生內(nèi)存越界的越界內(nèi)存;
[0031]第二確定單元,確定所述越界內(nèi)存對(duì)應(yīng)的代碼。
[0032]進(jìn)一步地,所述第一確定單元,用于通過(guò)所述檢測(cè)接口檢測(cè)當(dāng)前有效內(nèi)存的保護(hù)內(nèi)存是否滿足:后端的保護(hù)內(nèi)存被內(nèi)存越界污染,且前端的內(nèi)存沒(méi)有被內(nèi)存越界污染,當(dāng)檢測(cè)結(jié)果為是時(shí),則判定當(dāng)前有效內(nèi)存發(fā)生內(nèi)存越界,當(dāng)檢測(cè)結(jié)果為否時(shí),則判定當(dāng)前有效內(nèi)存沒(méi)有發(fā)生內(nèi)存越界。
[0033]進(jìn)一步地,還包括:
[0034]記錄單元,用于在堆棧中記錄每個(gè)有效內(nèi)存在創(chuàng)建時(shí)的第一預(yù)設(shè)值條堆棧信息;
[0035]所述第二確定單元,包括:
[0036]獲取子單元,用于獲取所述越界內(nèi)存對(duì)應(yīng)的堆棧信息;
[0037]確定子單元,用于根據(jù)所述堆棧信息確定所述越界內(nèi)存在代碼中創(chuàng)建的位置。
[0038]進(jìn)一步地,所述確定子單元,包括:
[0039]調(diào)用關(guān)系獲取單元,用于根據(jù)所述堆棧信息獲取函數(shù)調(diào)用關(guān)系;
[0040]位置確定單元,用于根據(jù)所述函數(shù)調(diào)用關(guān)系確定所述越界內(nèi)存在代碼中創(chuàng)建的位置。
[0041]進(jìn)一步地,還包括:
[0042]判斷裝置,用于判斷當(dāng)前空閑的內(nèi)存的大小是否小于等于第二預(yù)設(shè)值,當(dāng)判斷結(jié)果為是時(shí),通知所述增加單元,當(dāng)判斷結(jié)果為否時(shí),通知?jiǎng)?chuàng)建單元;
[0043]創(chuàng)建單元,用于在有效內(nèi)存被申請(qǐng)時(shí),創(chuàng)建所述PageHeap,將所述有效內(nèi)存的結(jié)尾放在所述PageHeap頁(yè)的邊緣,在所述有效內(nèi)存后分配與所述有效內(nèi)存相鄰的不能寫(xiě)的內(nèi)存;
[0044]內(nèi)存越界檢測(cè)單元,用于檢測(cè)內(nèi)存越界的信號(hào),當(dāng)檢測(cè)到內(nèi)存越界的信號(hào)時(shí),判定當(dāng)前有效內(nèi)存發(fā)生內(nèi)存越界;
[0045]代碼確定單元,用于根據(jù)所述PageHeap確定發(fā)生內(nèi)存越界的有效內(nèi)存對(duì)應(yīng)的代碼。
[0046]本發(fā)明提供的一種內(nèi)存越界的定位方法及裝置,在有效內(nèi)存兩端增加保護(hù)內(nèi)存,通過(guò)預(yù)先設(shè)置的檢測(cè)接口檢測(cè)保護(hù)內(nèi)存是否被內(nèi)存越界污染來(lái)定位越界內(nèi)存,然后根據(jù)越界內(nèi)存確定對(duì)應(yīng)的代碼,該方法無(wú)需反復(fù)測(cè)試,節(jié)省時(shí)間,也無(wú)需在其他系統(tǒng)上進(jìn)行定位,節(jié)省資源,提高了內(nèi)存越界定位的效率。
【附圖說(shuō)明】
[0047]為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0048]圖1是本發(fā)明一實(shí)施例提供的一種內(nèi)存越界的定位方法流程圖;
[0049]圖2是本發(fā)明一實(shí)施例提供的另一種內(nèi)存越界的定位方法流程圖;
[0050]圖3是本發(fā)明一實(shí)施例提供的一種內(nèi)存越界的定位裝置的示意圖;
[0051]圖4是本發(fā)明一實(shí)施例提供的另一種內(nèi)存越界的定位裝置的示意圖。
【具體實(shí)施方式】
[0052]為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例,基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)的前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0053]如圖1所示,本發(fā)明實(shí)施例提供了一種內(nèi)存越界的定位方法,該方法可以包括以下步驟:
[0054]SO:預(yù)先設(shè)置用于檢測(cè)內(nèi)存越界的檢測(cè)接口 ;
[0055]S1:在被申請(qǐng)的有效內(nèi)存的兩端分別增加與所述有效內(nèi)存相鄰的保護(hù)內(nèi)存;
[0056]S2:當(dāng)發(fā)生錯(cuò)誤時(shí),調(diào)用所述檢測(cè)接口 ;
[0057]S3:通過(guò)所述檢測(cè)接口檢測(cè)每個(gè)有效內(nèi)存的保護(hù)內(nèi)存是否被內(nèi)存越界污染,確定所有有效內(nèi)存中發(fā)生內(nèi)存越界的越界內(nèi)存;
[0058]S4:確定所述越界內(nèi)存對(duì)應(yīng)的代碼。
[0059]本發(fā)明實(shí)施例提供的一種內(nèi)存越界的定位方法,在有效內(nèi)存兩端增加保護(hù)內(nèi)存,通過(guò)預(yù)