亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種監(jiān)控應(yīng)用程序內(nèi)存的方法、裝置及電子設(shè)備與流程

文檔序號(hào):11475639閱讀:251來源:國(guó)知局
一種監(jiān)控應(yīng)用程序內(nèi)存的方法、裝置及電子設(shè)備與流程

本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及一種監(jiān)控應(yīng)用程序內(nèi)存的方法以及一種監(jiān)控應(yīng)用程序內(nèi)存的裝置;本申請(qǐng)同時(shí)涉及一種電子設(shè)備。



背景技術(shù):

隨著現(xiàn)代系統(tǒng)規(guī)模日益擴(kuò)大,系統(tǒng)中運(yùn)行的應(yīng)用程序數(shù)量顯著增加。這些應(yīng)用程序通常都會(huì)消耗一定量的資源,比如內(nèi)存。其中某些應(yīng)用程序有可能會(huì)造成內(nèi)存泄漏、對(duì)象doublefree以及訪問地址越界等,在計(jì)算機(jī)科學(xué)中,內(nèi)存泄露是指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄露并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于設(shè)計(jì)錯(cuò)誤,失去了對(duì)該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi);doublefree其實(shí)就是同一個(gè)指針釋放兩次,雖然一般把它叫做doublefree,其實(shí)只要是多次釋放一個(gè)指向堆內(nèi)存的指針都有可能產(chǎn)生漏洞;訪問地址越界是向系統(tǒng)申請(qǐng)了一塊內(nèi)存,在使用這塊內(nèi)存的時(shí)候,超出了申請(qǐng)的范圍。造成的直接后果是修改了其它內(nèi)存塊的內(nèi)容,如果被修改的地址是正在使用中內(nèi)存,會(huì)造成應(yīng)用程序異常。

在應(yīng)用程序開發(fā)的過程中,由于往往需要隨著業(yè)務(wù)流或控制流的處理而進(jìn)行大量的內(nèi)存申請(qǐng)和釋放,很容易造成在一些異常分支中遺漏釋放而出現(xiàn)內(nèi)存泄露的情形,然而這種內(nèi)存泄露的事件一般都是少量、且隱蔽的,需要經(jīng)過很長(zhǎng)時(shí)間的積累甚至已經(jīng)造成了嚴(yán)重后果才能被察覺,難以檢測(cè)和恢復(fù)泄露的內(nèi)存。

目前,雖然已經(jīng)有一些輔助工具可以協(xié)助進(jìn)行內(nèi)存泄漏、對(duì)象doublefree以及訪問地址越界的檢測(cè)。在現(xiàn)有技術(shù)下檢測(cè)內(nèi)存的常用工具包括:valgrind、glibc的mtrace/muntrace功能以及tcmalloc。其中,valgrind的執(zhí)行不需要重新編譯,而是和應(yīng)用程序在同一個(gè)進(jìn)程中,動(dòng)態(tài)的修改即將執(zhí)行的代碼,但正是因?yàn)関algrind的工作方式,導(dǎo)致程序性能驟降,根據(jù)注入代碼量的不同,性能會(huì)下降10-50倍,因?yàn)槠鋵?duì)性能的影響,降低了其在復(fù)雜系統(tǒng)中的可用性;glibc的mtrace/muntrace功能利用malloc_hook機(jī)制,需要在記錄完成后重置malloc_hook函數(shù),所以其只能工作在單進(jìn)程程序中,對(duì)于多進(jìn)程程序因?yàn)? malloc_hook函數(shù)更改混亂會(huì)造成誤報(bào)或漏報(bào),所以對(duì)于復(fù)雜的大型應(yīng)用程序可用性不高;tcmalloc可以檢查程序中是否有內(nèi)存泄露及內(nèi)存泄露點(diǎn)信息以及內(nèi)存性能及空間熱點(diǎn)分析,幫助分析內(nèi)存的使用分布情況。但需要調(diào)用backtrace函數(shù)獲取調(diào)用棧信息,而這個(gè)操作是一個(gè)慢操作,所以tcmalloc使用采樣的方式降低對(duì)應(yīng)用程序性能的影響,而采樣就可能存在偏差,從而影響結(jié)果的可靠性。

由此可見,在現(xiàn)有的監(jiān)控內(nèi)存的方案下,由于誤報(bào)、漏報(bào)或者由于其插樁的實(shí)現(xiàn)方法或算法復(fù)雜性因素引起程序運(yùn)行緩慢降低性能的問題,從而影響結(jié)果的可靠性,對(duì)于復(fù)雜的大型應(yīng)用程序可用性不高,并且使用成本較高。



技術(shù)實(shí)現(xiàn)要素:

本申請(qǐng)?zhí)峁┮环N監(jiān)控應(yīng)用程序內(nèi)存的方法以及一種監(jiān)控應(yīng)用程序內(nèi)存的裝置,以解決現(xiàn)有技術(shù)中的上述問題。本申請(qǐng)同時(shí)涉及一種電子設(shè)備。

本申請(qǐng)?zhí)峁┝艘环N監(jiān)控應(yīng)用程序內(nèi)存的方法,所述監(jiān)控應(yīng)用程序內(nèi)存的方法包括:

應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間;

對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息;

對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

可選的,在所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間的步驟之前,包括:

將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中。

可選的,所述預(yù)設(shè)的重載函數(shù)庫(kù),至少包括如下內(nèi)存管理函數(shù):

內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)以及內(nèi)存調(diào)整函數(shù)。

可選的,所述將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中,包括:

若所述應(yīng)用程序是采用靜態(tài)鏈接的應(yīng)用程序,則在編譯時(shí)將靜態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序;

若所述應(yīng)用程序是采用動(dòng)態(tài)連接的應(yīng)用程序,則在編譯時(shí)將動(dòng)態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序或者應(yīng)用程序運(yùn)行時(shí),通過注入的方式把動(dòng)態(tài)鏈接庫(kù)注入應(yīng)用程序。

可選的,所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,包括:

應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間。

可選的,所述額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間是:用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

可選的,所述標(biāo)簽記錄的信息,至少包括:

內(nèi)存塊狀態(tài)、內(nèi)存分配棧標(biāo)識(shí)、時(shí)間戳、線程標(biāo)識(shí)、桶標(biāo)識(shí)以及標(biāo)簽標(biāo)識(shí)。

可選的,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息,包括:

應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)分配申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),判斷所述內(nèi)存管理函數(shù)是否成功分配申請(qǐng)的內(nèi)存運(yùn)行空間;

若是,則在所述標(biāo)簽中記錄本次內(nèi)存分配信息。

可選的,所述在所述標(biāo)簽中記錄本次內(nèi)存分配信息,包括:

將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài);

調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí);

獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間;

獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

根據(jù)申請(qǐng)的內(nèi)存運(yùn)行空間的大小,將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作,并按照分桶操作的順序?qū)γ總€(gè)桶設(shè)置桶標(biāo)識(shí),在所述標(biāo)簽中的桶標(biāo)識(shí)中記錄當(dāng)前內(nèi)存大小對(duì)應(yīng)桶的桶標(biāo)識(shí);

將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

可選的,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息,包括:

應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)釋放申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),在所述標(biāo)簽中記錄本次內(nèi)存釋放信息。

可選的,所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息,包括:

將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài);

調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的內(nèi)存塊的釋放函數(shù)調(diào)用棧的標(biāo)識(shí);

獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間;

獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

可選的,所述調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),包括:

采用編譯器開關(guān)記錄回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí)。

可選的,所述采用編譯器開關(guān)記錄回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),包括:

在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù);

通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)。

可選的,在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的步驟之前,包括:

判斷所述標(biāo)簽中的內(nèi)存塊狀態(tài)是否為已分配狀態(tài);

若是,則執(zhí)行所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的步驟;

若否,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息。

可選的,在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)的步驟之前,還包括:

在所述跟蹤函數(shù)中預(yù)設(shè)內(nèi)存寫壞的判斷條件;

在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)的步驟之后,包括:

判斷內(nèi)存塊是否滿足預(yù)設(shè)內(nèi)存寫壞的判斷條件;

若是,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息;

若否,則執(zhí)行所述通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,并通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)的步驟。

可選的,在所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配或釋放時(shí),還包括:

根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的內(nèi)存鏡像信息,創(chuàng)建與該進(jìn)程內(nèi)存鏡像相同的子進(jìn)程。

可選的,當(dāng)應(yīng)用程序發(fā)生異常時(shí),獲取當(dāng)前應(yīng)用程序的內(nèi)存布局,可以采用如下方式實(shí)現(xiàn):

調(diào)用終止函數(shù)使子進(jìn)程終止運(yùn)行,并轉(zhuǎn)存進(jìn)程信息獲取應(yīng)用程序的內(nèi)存布局。

相應(yīng)的,本申請(qǐng)還提供了一種監(jiān)控應(yīng)用程序內(nèi)存的裝置,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置包括:

監(jiān)控空間請(qǐng)求單元,用于應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間;

內(nèi)存分配信息記錄單元,用于對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息;

內(nèi)存釋放信息記錄單元,用于對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:

重載函數(shù)庫(kù)鏈接單元,用于在所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間之前,將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中。

可選的,所述重載函數(shù)庫(kù)鏈接單元,鏈接到應(yīng)用程序中的至少包括如下內(nèi)存管理函數(shù):內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)以及內(nèi)存調(diào)整函數(shù)。

可選的,所述重載函數(shù)庫(kù)鏈接單元,包括:

靜態(tài)鏈接子單元,用于若所述應(yīng)用程序是采用靜態(tài)鏈接的應(yīng)用程序,則在編譯時(shí)將靜態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序;

動(dòng)態(tài)鏈接子單元,用于若所述應(yīng)用程序是采用動(dòng)態(tài)連接的應(yīng)用程序,則在編譯時(shí)將動(dòng)態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序或者應(yīng)用程序運(yùn)行時(shí),通過注入的方式把動(dòng)態(tài)鏈接庫(kù)注入應(yīng)用程序。

可選的,所述監(jiān)控空間請(qǐng)求單元,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外 請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間。

可選的,所述監(jiān)控空間請(qǐng)求單元,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外請(qǐng)求用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

可選的,所述內(nèi)存分配信息記錄單元,包括:

判斷子單元,用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)分配申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),判斷所述內(nèi)存管理函數(shù)是否成功分配申請(qǐng)的內(nèi)存運(yùn)行空間;

內(nèi)存分配信息記錄子單元,用于接收所述判斷子單元的判斷結(jié)果,若是,則在所述標(biāo)簽中記錄本次內(nèi)存分配信息。

可選的,所述內(nèi)存分配信息記錄子單元,包括:

已分配狀態(tài)設(shè)置子單元,用于將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài);

調(diào)用棧標(biāo)識(shí)設(shè)置子單元,用于調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí);

時(shí)間設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間;

線程標(biāo)識(shí)設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

桶標(biāo)識(shí)設(shè)置子單元,用于根據(jù)申請(qǐng)的內(nèi)存運(yùn)行空間的大小,將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作,并按照分桶操作的順序?qū)γ總€(gè)桶設(shè)置桶標(biāo)識(shí),在所述標(biāo)簽中的桶標(biāo)識(shí)中記錄當(dāng)前內(nèi)存大小對(duì)應(yīng)桶的桶標(biāo)識(shí);

標(biāo)簽標(biāo)識(shí)設(shè)置子單元,用于將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

可選的,所述內(nèi)存釋放信息記錄單元,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)釋放申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),在所述標(biāo)簽中記錄本次內(nèi)存釋放信息。

可選的,所述內(nèi)存釋放信息記錄單元,包括:

已釋放狀態(tài)設(shè)置子單元,用于將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài);

調(diào)用棧標(biāo)識(shí)設(shè)置子單元,用于調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的內(nèi)存塊的釋放函數(shù)調(diào)用棧的標(biāo)識(shí);

釋放時(shí)間設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間;

線程標(biāo)識(shí)更新子單元,用于獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

標(biāo)簽標(biāo)識(shí)添加子單元,用于將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

可選的,所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,具體用于采用編譯器開關(guān)記錄回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí)。

可選的,所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,包括:

跟蹤函數(shù)調(diào)用子單元,用于在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù);

標(biāo)識(shí)獲取子單元,用于通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:

狀態(tài)判斷單元,用于在所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息之前,判斷所述標(biāo)簽中的內(nèi)存塊狀態(tài)是否為已分配狀態(tài);

內(nèi)存釋放信息記錄觸發(fā)單元,用于接收所述狀態(tài)判斷單元的判斷結(jié)果,若是,則執(zhí)觸發(fā)所述內(nèi)存釋放信息記錄單元;

終止函數(shù)調(diào)用單元,用于接收所述狀態(tài)判斷單元的判斷結(jié)果,若否,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:

條件設(shè)置單元,用于在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)之前,在所述跟蹤函數(shù)中預(yù)設(shè)內(nèi)存寫壞的判斷條件;

條件判斷單元,用于在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)之后,判斷內(nèi)存塊是否滿足預(yù)設(shè)內(nèi)存寫壞的判斷條件;

終止函數(shù)調(diào)用單元,用于接收所述條件判斷單元的判斷結(jié)果,若是,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息;

標(biāo)識(shí)接收觸發(fā)單元,用于接收所述條件判斷單元的判斷結(jié)果,若否,則觸發(fā)所述標(biāo)識(shí)獲取子單元。

可選的,所述內(nèi)存分配信息記錄單元,還包括:

子進(jìn)程創(chuàng)建子單元,用于在所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配或釋放時(shí),根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的內(nèi)存鏡像信息,創(chuàng)建與該進(jìn)程內(nèi)存鏡像相同的子進(jìn)程。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:

內(nèi)存信息獲取單元,用于當(dāng)應(yīng)用程序發(fā)生異常時(shí),調(diào)用終止函數(shù)使子進(jìn)程終止運(yùn)行,并轉(zhuǎn)存進(jìn)程信息獲取應(yīng)用程序的內(nèi)存布局。

此外,本申請(qǐng)還提供了一種電子設(shè)備,包括:

顯示器;

處理器;

存儲(chǔ)器,用于存儲(chǔ)內(nèi)存監(jiān)控程序,所述程序在被所述處理器讀取執(zhí)行時(shí),執(zhí)行如下操作:應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間;對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息;對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

與現(xiàn)有技術(shù)相比,本申請(qǐng)具有以下優(yōu)點(diǎn):

本申請(qǐng)?zhí)峁┑囊环N監(jiān)控應(yīng)用程序內(nèi)存的方法、裝置以及一種電子設(shè)備,通過申請(qǐng)內(nèi)存空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存空間;對(duì)申請(qǐng)的內(nèi)存空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存空間中記錄本次內(nèi)存分配信息;對(duì)申請(qǐng)的內(nèi)存空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存空間中記錄本次內(nèi)存釋放信息。所述技術(shù)方案解決了由于誤報(bào)、漏報(bào)或者由于其插樁的實(shí)現(xiàn)方法或算法復(fù)雜性因素引起程序運(yùn)行緩慢降低性能的問題,從而提高了結(jié)果的可靠性,解決了c/c++程序內(nèi)存使用中遇到的多種問題,對(duì)于復(fù)雜的大型應(yīng)用程序可用性高,并且使用成本較低。

附圖說明

為了更清楚地說明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請(qǐng)中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,還可以根據(jù)這些附圖獲得其他的附圖。

圖1示出了根據(jù)本申請(qǐng)的實(shí)施例提供的監(jiān)控應(yīng)用程序內(nèi)存的方法的流程圖;

圖2示出了根據(jù)本申請(qǐng)的實(shí)施例提供的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息的方法的流程圖;

圖3示出了根據(jù)本申請(qǐng)的實(shí)施例提供的在所述標(biāo)簽中記錄本次內(nèi)存分配信息的方法的流程圖;

圖4示出了根據(jù)本申請(qǐng)的實(shí)施例提供的采用編譯器將回溯函數(shù)注入應(yīng)用程序獲取函數(shù)調(diào)用棧的標(biāo)識(shí)的方法的流程圖;

圖5示出了根據(jù)本申請(qǐng)的實(shí)施例提供的在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的方法的流程圖;

圖6示出了根據(jù)本申請(qǐng)的實(shí)施例提供的監(jiān)控應(yīng)用程序內(nèi)存的裝置的示意圖;

圖7示出了根據(jù)本申請(qǐng)的實(shí)施例提供的電子設(shè)備的示意圖。

具體實(shí)施方式

為了能夠更清楚地理解本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn),下面結(jié)合附圖和具體實(shí)施方式對(duì)本申請(qǐng)進(jìn)行進(jìn)一步的詳細(xì)描述。需要說明的是,在不沖突的情況下,本申請(qǐng)的實(shí)施例及實(shí)施例中的特征可以相互組合。

在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本申請(qǐng)。但是,本申請(qǐng)能夠以很多不同于在此描述的其它方式來實(shí)施,本領(lǐng)域技術(shù)人員可以在不違背本申請(qǐng)內(nèi)涵的情況下做類似推廣,因此,本申請(qǐng)不受下面公開的具體實(shí)施的限制。

本申請(qǐng)的實(shí)施例提供了一種監(jiān)控應(yīng)用程序內(nèi)存的方法以及一種監(jiān)控應(yīng)用程序內(nèi)存的裝置,本申請(qǐng)的實(shí)施例同時(shí)提供了一種電子設(shè)備。在下面的實(shí)施例中逐一進(jìn)行詳細(xì)說明。

目前,雖然已經(jīng)有一些輔助工具可以協(xié)助進(jìn)行內(nèi)存泄漏、對(duì)象doublefree以及訪問地址越界的檢測(cè)。在現(xiàn)有技術(shù)下檢測(cè)內(nèi)存的常用工具包括:valgrind、glibc的mtrace/muntrace功能以及tcmalloc。其中,valgrind的執(zhí)行不需要重新編譯,而是和應(yīng)用程序在同一個(gè)進(jìn)程中,動(dòng)態(tài)的修改即將執(zhí)行的代碼,但正是因?yàn)関algrind的工作方式,導(dǎo)致程序性能驟降,根據(jù)注入代碼量的不同,性能會(huì)下降10-50倍,因?yàn)槠鋵?duì)性能的影響,降低了其在復(fù)雜系統(tǒng)中的可用性;glibc的mtrace/muntrace功能利用malloc_hook機(jī)制,需要在記錄完成后重置malloc_hook函數(shù),所以其只能工作在單進(jìn)程程序中,對(duì)于多進(jìn)程程序因?yàn)閙alloc_hook函數(shù)更改混亂會(huì)造成誤報(bào)或漏報(bào),所以對(duì)于復(fù)雜的大型應(yīng)用程序可用性不高;tcmalloc可以檢查程序中是否有內(nèi)存泄露及內(nèi)存泄露點(diǎn)信息以及內(nèi)存性能及空間熱點(diǎn)分析,幫助分析內(nèi)存的使用分布情況。但需要調(diào)用backtrace函數(shù)獲取調(diào)用棧信息,而這個(gè)操作是一個(gè)慢操作,所以tcmalloc使用采樣的方式降低對(duì)應(yīng)用程序性能的影響,而采樣就可能存在偏差,從而影響結(jié)果的可靠性。由此可見,在現(xiàn)有的監(jiān)控內(nèi)存的方案下,由于誤報(bào)、漏報(bào)或者由于其插樁的實(shí)現(xiàn)方法或算法復(fù)雜性因素引起程序運(yùn)行緩慢降低性能的問題,從而影響結(jié)果的可靠性,對(duì)于復(fù)雜的大型應(yīng)用程序可用性不高,并且使用成本較高。針對(duì)這一問題,本申請(qǐng)的技術(shù)方案通過應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,并在內(nèi)存監(jiān)控空間中記錄內(nèi)存分配信息以及內(nèi)存釋放信息,從而實(shí)現(xiàn)了監(jiān)控內(nèi)存的功能。

本申請(qǐng)的實(shí)施例提供了一種監(jiān)控應(yīng)用程序內(nèi)存的方法,一般性的,本實(shí)施例所述的監(jiān)控應(yīng)用程序內(nèi)存的方法由內(nèi)存監(jiān)控程序完成,該方法通過應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,并在內(nèi)存監(jiān)控空間中記錄內(nèi)存分配信息以及內(nèi)存釋放信息,完成對(duì)內(nèi)存的監(jiān)控。所述監(jiān)控應(yīng)用程序內(nèi)存的方法實(shí)施例如下:

請(qǐng)參考圖1,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的監(jiān)控應(yīng)用程序內(nèi)存的方法的流程圖。

所述監(jiān)控應(yīng)用程序內(nèi)存的方法包括:

步驟s101,應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間。

一個(gè)應(yīng)用程序在開始運(yùn)行之后,會(huì)根據(jù)需求的內(nèi)存運(yùn)行空間的大小向操作系統(tǒng)申請(qǐng)內(nèi)存空間,但是,在本實(shí)施例中,所述應(yīng)用程序除了向操作系統(tǒng)申請(qǐng)內(nèi)存運(yùn)行空間外,還會(huì)向操作系統(tǒng)申請(qǐng)內(nèi)存監(jiān)控空間,所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,可以采用如下方式實(shí)現(xiàn):應(yīng)用程序在開始運(yùn)行之后,所述應(yīng)用程序會(huì)根據(jù)需求的內(nèi)存運(yùn)行空間的大小和預(yù)設(shè)大小的內(nèi)存監(jiān)控空間向操作系統(tǒng)申請(qǐng)內(nèi)存空間,該內(nèi)存空間的大小是所述應(yīng)用程序需求的內(nèi)存運(yùn)行空間和內(nèi)存監(jiān)控空間的大小的總和。

例如:預(yù)設(shè)內(nèi)存監(jiān)控空間的大小占用n個(gè)字節(jié),則應(yīng)用程序在每次申請(qǐng)內(nèi)存運(yùn)行空間時(shí),實(shí)際申請(qǐng)內(nèi)存的空間可以比應(yīng)用程序所需的內(nèi)存運(yùn)行空間多n個(gè)字節(jié),該n個(gè)字節(jié)的內(nèi)存監(jiān)控空間可以用于存放記錄該應(yīng)用程序的內(nèi)存分配信息以及內(nèi)存釋放信息。

需要說明的是,所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間是該應(yīng)用程序在運(yùn)行時(shí)需要使用的內(nèi)存空間,所述內(nèi)存運(yùn)行空間可以預(yù)先根據(jù)具體的應(yīng)用場(chǎng)景設(shè)定的閾值來確定的,在應(yīng)用程序的初始化過程中,就可以將該閾值傳遞進(jìn)來,并按照該閾值向操作系統(tǒng)進(jìn)行申請(qǐng)內(nèi)存空間;所述內(nèi)存監(jiān)控空間用于記錄該應(yīng)用程序的內(nèi)存分配信息以及內(nèi)存釋放信息。

由于所述內(nèi)存監(jiān)控空間是通過預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)進(jìn)行申請(qǐng)以及記錄該應(yīng)用程序的內(nèi)存分配信息以及內(nèi)存釋放信息的,所以在所述應(yīng)用程序在向操作系統(tǒng)進(jìn)行申請(qǐng)預(yù)設(shè)大小的內(nèi)存監(jiān)控空間之前,需要將預(yù)設(shè)的內(nèi)存管理函數(shù)鏈接進(jìn)所述應(yīng)用程序中。

在本實(shí)施例中,在執(zhí)行步驟s101應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間的步驟之前,將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中。

需要說明的是,c語(yǔ)言中有一些函數(shù)不需要進(jìn)行編譯,有一些函數(shù)也可以在多個(gè)文件中使用。一般來說,可以事先對(duì)這些函數(shù)進(jìn)行編譯,然后將它們放置在一些特殊的目標(biāo)代碼文件中,這些目標(biāo)代碼文件就稱為函數(shù)庫(kù)。函數(shù)庫(kù)文件中的函數(shù)可以通過連接程序與應(yīng)用程序進(jìn)行連接。

函數(shù)庫(kù)可以有三種使用的形式:靜態(tài)、導(dǎo)入和動(dòng)態(tài)。靜態(tài)鏈接庫(kù)的代碼在編 譯時(shí)就已連接到應(yīng)用程序中,函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(通常windows下擴(kuò)展名為.lib,linux/unix下擴(kuò)展名為.a)。在使用靜態(tài)鏈接庫(kù)的情況下,在編譯鏈接可執(zhí)行文件時(shí),鏈接器從函數(shù)庫(kù)中復(fù)制這些函數(shù)和數(shù)據(jù)并把它們和應(yīng)用程序的其它模塊組合起來創(chuàng)建最終的可執(zhí)行文件。而導(dǎo)入函數(shù)庫(kù)只是在程序開始運(yùn)行時(shí)才載入,在編譯時(shí),只是簡(jiǎn)單地指定需要使用的庫(kù)函數(shù)。動(dòng)態(tài)鏈接庫(kù)也是在程序運(yùn)行時(shí)載入,但與導(dǎo)入函數(shù)庫(kù)不同的是,使用的庫(kù)函數(shù)不是在應(yīng)用程序運(yùn)行開始,而是在應(yīng)用程序中的語(yǔ)句需要使用該函數(shù)時(shí)才載入在使用動(dòng)態(tài)鏈接庫(kù)的時(shí)候。在編譯鏈接可執(zhí)行文件時(shí),動(dòng)態(tài)鏈接庫(kù)中的函數(shù)代碼和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,在運(yùn)行的時(shí)候,再去加載,訪問庫(kù)中導(dǎo)出的函數(shù)。動(dòng)態(tài)鏈接庫(kù)可以在應(yīng)用程序運(yùn)行期間釋放動(dòng)態(tài)鏈接庫(kù)所占用的內(nèi)存,騰出空間供其它應(yīng)用程序使用。由于導(dǎo)入函數(shù)庫(kù)和動(dòng)態(tài)鏈接庫(kù)并沒有在應(yīng)用程序中包括庫(kù)函數(shù)的內(nèi)容,只是包含了對(duì)庫(kù)函數(shù)的引用,因此代碼的規(guī)模比較小。

在本實(shí)施例中,提供一個(gè)動(dòng)態(tài)鏈接版本及一個(gè)靜態(tài)鏈接版本的重載函數(shù)庫(kù),所述將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中,可以采用如下方式實(shí)現(xiàn):若所述應(yīng)用程序是采用靜態(tài)鏈接的應(yīng)用程序,則在編譯時(shí)將靜態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序;若所述應(yīng)用程序是采用動(dòng)態(tài)連接的應(yīng)用程序,則在編譯時(shí)將動(dòng)態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序或者應(yīng)用程序運(yùn)行時(shí),通過注入的方式把動(dòng)態(tài)鏈接庫(kù)注入應(yīng)用程序。

需要說明的是,在編譯時(shí)將靜態(tài)鏈接庫(kù)靜態(tài)鏈接進(jìn)應(yīng)用程序的時(shí)候,載入代碼就會(huì)把應(yīng)用程序會(huì)用到的動(dòng)態(tài)代碼或動(dòng)態(tài)代碼的地址確定下來靜態(tài)鏈接庫(kù)的鏈接可以使用靜態(tài)鏈接,動(dòng)態(tài)鏈接庫(kù)也可以使用這種方法鏈接導(dǎo)入庫(kù);在應(yīng)用程序調(diào)用內(nèi)存管理函數(shù)時(shí)通過注入的方式把動(dòng)態(tài)鏈接庫(kù)注入應(yīng)用程序使用的動(dòng)態(tài)鏈接方法并不在一開始就完成動(dòng)態(tài)鏈接,而是直到真正調(diào)用動(dòng)態(tài)鏈接庫(kù)代碼時(shí),載入程序才計(jì)算(被調(diào)用的那部分)動(dòng)態(tài)代碼的邏輯地址,然后等到某個(gè)時(shí)候,應(yīng)用程序又需要調(diào)用另外某塊動(dòng)態(tài)代碼時(shí),載入程序又去計(jì)算這部分代碼的邏輯地址,所以,這種方式使程序初始化時(shí)間較短,但運(yùn)行期間的性能比不上靜態(tài)鏈接的程序??梢岳斫獾模o態(tài)鏈接庫(kù)和應(yīng)用程序編譯在一起,在任何情況下都能運(yùn)行,而動(dòng)態(tài)鏈接庫(kù)是動(dòng)態(tài)鏈接,顧名思義就是在應(yīng)用程序啟動(dòng)的時(shí)候才會(huì)鏈接,所以,當(dāng)操作系統(tǒng)上沒有該動(dòng)態(tài)鏈接庫(kù)時(shí),應(yīng)用程序就會(huì)運(yùn)行失敗。

需要說明的是,所述預(yù)設(shè)的重載函數(shù)庫(kù)中重新實(shí)現(xiàn)了函數(shù)庫(kù)中的各種內(nèi)存管 理函數(shù),至少包括如下內(nèi)存管理函數(shù):內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)以及內(nèi)存調(diào)整函數(shù),在本實(shí)施例中,所述預(yù)設(shè)的重載函數(shù)庫(kù)中重新實(shí)現(xiàn)了函數(shù)庫(kù)中的各種內(nèi)存管理函數(shù),可以采用如下方式實(shí)現(xiàn):對(duì)c語(yǔ)言函數(shù)庫(kù)最基本的內(nèi)存分配函數(shù)、內(nèi)存調(diào)整函數(shù)等作宏定義重載,即:用自定義的同名函數(shù)系列覆蓋標(biāo)準(zhǔn)c語(yǔ)言中的malloc等內(nèi)存管理函數(shù),增加申請(qǐng)以及記錄內(nèi)存監(jiān)控空間的相關(guān)代碼,用已封裝后的代碼替換原函數(shù),從而實(shí)現(xiàn)函數(shù)的宏定義重載,以下簡(jiǎn)稱重載函數(shù),對(duì)重載后的函數(shù)庫(kù)稱為重載函數(shù)庫(kù)。通過重載函數(shù)策略,確保了重載前后應(yīng)用程序?qū)語(yǔ)言庫(kù)函數(shù)的接口調(diào)用的一致性,同時(shí)也實(shí)現(xiàn)了在應(yīng)用程序運(yùn)行的過程中,重載函數(shù)庫(kù)中的新內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存監(jiān)控空間和記錄內(nèi)存分配信息和內(nèi)存釋放信息的功能。

例如:在編碼實(shí)現(xiàn)中,可以通過將c語(yǔ)言函數(shù)庫(kù)提供的malloc、free、calloc以及realloc函數(shù)改造成宏函數(shù),使之后對(duì)函數(shù)進(jìn)行調(diào)用時(shí)感受不到編碼上的差異。具體實(shí)施方式可以為:可以自定義new_malloc函數(shù)、new_calloc函數(shù)、new_realloc函數(shù)實(shí)現(xiàn)申請(qǐng)內(nèi)存監(jiān)控空間,可以自定義new_free函數(shù)實(shí)現(xiàn)釋放內(nèi)存監(jiān)控空間。

下面對(duì)所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)進(jìn)行詳細(xì)說明。

c語(yǔ)言函數(shù)庫(kù)提供了內(nèi)存分配函數(shù)malloc、內(nèi)存釋放函數(shù)free、內(nèi)存調(diào)整函數(shù)realloc等基于內(nèi)存的管理函數(shù),負(fù)責(zé)分配可用內(nèi)存以及釋放用過的內(nèi)存。

其中,內(nèi)存分配函數(shù)malloc的作用是向操作系統(tǒng)申請(qǐng)分配指定若干個(gè)字節(jié)的內(nèi)存空間,并返回類型是void*類型,void*表示未確定類型的指針。malloc不能分配的時(shí)候返回null。malloc函數(shù)的實(shí)質(zhì)體現(xiàn)在,它有一個(gè)將可用的內(nèi)存塊連接為一個(gè)長(zhǎng)長(zhǎng)的列表,調(diào)用malloc函數(shù)時(shí),它沿表尋找一個(gè)大到足以滿足用戶請(qǐng)求所需要的內(nèi)存塊。如果無法獲得符合要求的內(nèi)存塊,malloc函數(shù)會(huì)返回null指針。

內(nèi)存釋放函數(shù)free是釋放malloc(或calloc、realloc)函數(shù)給指針變量分配的內(nèi)存空間的函數(shù)。free函數(shù)與malloc函數(shù)配對(duì)使用,free函數(shù)獲得指向由malloc分配的內(nèi)存片段的指針,釋放malloc函數(shù)申請(qǐng)的動(dòng)態(tài)內(nèi)存,以便以后的程序或操作系統(tǒng)使用。free函數(shù)清除指向的地址,它只作清除的工作,并告訴操作系統(tǒng)這塊地址已經(jīng)被釋放和清除,可以重新被分配。

內(nèi)存調(diào)整函數(shù)realloc以所指地址為首址,分配若干個(gè)字節(jié)的內(nèi)存,并返回 所指地址。realloc不會(huì)初始化分配到的內(nèi)存塊,如果所指地址為null則相當(dāng)于malloc,如果分配的若干個(gè)字節(jié)的內(nèi)存為null則相當(dāng)于free,如果重新分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針null。在使用realloc函數(shù)時(shí)先判斷當(dāng)前的指針是否有足夠的連續(xù)內(nèi)存空間,如果有則擴(kuò)大指向的地址,如果內(nèi)存空間不夠,則按照指定的大小分配空間,將原有數(shù)據(jù)從頭到尾拷貝到新分配的內(nèi)存空間,而后釋放原來所指內(nèi)存區(qū)域,同時(shí)返回新分配的內(nèi)存空間的首地址。即重新分配存儲(chǔ)器塊的地址。

需要說明的是,所述預(yù)設(shè)的重載函數(shù)庫(kù)中除了內(nèi)存分配函數(shù)malloc、內(nèi)存釋放函數(shù)free、內(nèi)存調(diào)整函數(shù)realloc還包括:valloc、memalign以及posix_memalign函數(shù),由于在調(diào)用上述函數(shù)時(shí)都會(huì)在應(yīng)用程序運(yùn)行的過程中申請(qǐng)內(nèi)存監(jiān)控空間和記錄內(nèi)存分配信息和內(nèi)存釋放信息,上述函數(shù)的具體功能在此不再贅述。

在本實(shí)施例中,所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,可以采用如下方式實(shí)現(xiàn):應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間。所述額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間是:用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

需要說明的是,所述標(biāo)簽的數(shù)據(jù)結(jié)構(gòu)具體如下:

其中,allocate_or_free_marker記錄的是該內(nèi)存塊狀態(tài),標(biāo)識(shí)此內(nèi)存塊的狀態(tài)是否為使用中,例如:若該內(nèi)存塊狀態(tài)為allocate則說明該內(nèi)存塊處于已分配狀態(tài);若該內(nèi)存塊狀態(tài)為free則說明該內(nèi)存塊處于釋放狀態(tài)。

allocate_or_free_backtrace_id記錄的是當(dāng)前函數(shù)調(diào)用棧的標(biāo)識(shí),通過分配函數(shù)調(diào)用棧的標(biāo)識(shí)可以獲得內(nèi)存塊最后操作的函數(shù)地址,例如:分配函數(shù)調(diào)用棧的標(biāo)識(shí)可以是分配函數(shù)調(diào)用棧的id。

allocate_or_free_timestamp記錄的是時(shí)間戳,例如:對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間以及對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間。

allocate_or_free_tid記錄的是對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí)以及對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí)。

memory_bucket_id記錄的是重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)根據(jù)申請(qǐng)的內(nèi)存運(yùn)行空間的大小,將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作的順序?qū)Ξ?dāng)前內(nèi)存大小對(duì)應(yīng)桶設(shè)置的桶標(biāo)識(shí),記錄后通過memory_bucket_id可以獲取本內(nèi)存塊的空間信息。

memory_tracer_tag_marker記錄的是用于區(qū)分在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間的標(biāo)識(shí),可以理解的,由于該標(biāo)簽是在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,所以通過該標(biāo)簽標(biāo)識(shí)可以在應(yīng)用程序內(nèi)存中標(biāo)識(shí)以及區(qū)分該標(biāo)簽的位置,便于讀取。

可以理解的,所述標(biāo)簽中記錄的數(shù)據(jù)分別對(duì)應(yīng)于內(nèi)存分配信息和內(nèi)存釋放信息中的設(shè)置的內(nèi)存塊狀態(tài)、內(nèi)存分配棧標(biāo)識(shí)、時(shí)間戳、線程標(biāo)識(shí)、桶標(biāo)識(shí)以及標(biāo)簽標(biāo)識(shí)。

為了能在不影響應(yīng)用程序運(yùn)行的情況下獲取完整的內(nèi)存使用信息,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配或釋放時(shí),根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的內(nèi)存鏡像信息,創(chuàng)建與該進(jìn)程內(nèi)存鏡像相同的子進(jìn)程。

需要說明的是,可以采用fork函數(shù)實(shí)現(xiàn),根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的資源信息(內(nèi)存空間、堆、棧等資源),創(chuàng)建與該進(jìn)程資源相同的子進(jìn)程。fork函數(shù)是計(jì)算機(jī)程序設(shè)計(jì)中的分叉函數(shù),將運(yùn)行著的應(yīng)用程序分成2個(gè)完全一樣的進(jìn)程,每個(gè)進(jìn)程都啟動(dòng)一個(gè)從代碼的同一位置開始執(zhí)行的進(jìn)程。這兩個(gè)進(jìn)程中的進(jìn)程繼續(xù)執(zhí)行,就像是兩個(gè)用戶同時(shí)啟動(dòng)了該應(yīng)用程序的兩個(gè)副本,由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程id。

在所述根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的內(nèi)存鏡像信息,創(chuàng)建與該進(jìn)程內(nèi)存鏡像相同的子進(jìn)程的步驟之后,根據(jù)與該進(jìn)程內(nèi)存鏡像相同的子進(jìn)程,獲取父進(jìn)程在額外請(qǐng)求的內(nèi)存監(jiān)控空間中完整記錄的內(nèi)存分配信息及內(nèi)存釋放信息。

在本實(shí)施例中,所述當(dāng)應(yīng)用程序發(fā)生異常時(shí),獲取當(dāng)前應(yīng)用程序的內(nèi)存布局,可以采用如下方式實(shí)現(xiàn):

調(diào)用終止函數(shù)使子進(jìn)程終止運(yùn)行,并轉(zhuǎn)存進(jìn)程信息獲取應(yīng)用程序的內(nèi)存布局。

可以理解的,轉(zhuǎn)存進(jìn)程信息獲取的應(yīng)用程序的內(nèi)存布局,實(shí)際就是父進(jìn)程在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄的完整內(nèi)存分配信息及內(nèi)存釋放信息。

需要說明的是,調(diào)用abort()函數(shù)使子進(jìn)程終止運(yùn)行,獲取該應(yīng)用程序的完整內(nèi)存鏡像,并在內(nèi)存鏡像中獲取在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄的完整內(nèi)存分配信息及內(nèi)存釋放信息,從而獲得任何一個(gè)內(nèi)存地址的使用狀態(tài)及最后的屬主信息。

可以理解的,在子進(jìn)程終止運(yùn)行時(shí),該應(yīng)用程序還可以在所在的父進(jìn)程中正常運(yùn)行。

步驟s103,對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息。

在本實(shí)施例中,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息,可以采用如下方式實(shí)現(xiàn):應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)分配申請(qǐng)的內(nèi)存運(yùn)行空間,并將本次內(nèi)存分配信息記錄在額外請(qǐng)求的內(nèi)存監(jiān)控空間中。所述額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間是:用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

為了使在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄的本次內(nèi)存分配信息更加準(zhǔn)確,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息,具體包括步驟s103-1至s103-2,下面結(jié)合附圖2作進(jìn)一步說明。

請(qǐng)參考圖2,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息的方法的流程圖。

步驟s103-1,應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)分配申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),判斷所述內(nèi)存管理函數(shù)是否成功分配申請(qǐng)的內(nèi)存運(yùn)行空間。

在本實(shí)施例中,所述判斷所述內(nèi)存管理函數(shù)是否成功分配申請(qǐng)的內(nèi)存運(yùn)行空間,可以采用如下方式實(shí)現(xiàn):判斷內(nèi)存分配函數(shù)malloc的返回值是否不為null,若是,則執(zhí)行步驟s103-2,若是,則在所述標(biāo)簽中記錄本次內(nèi)存分配信息。

需要說明的是,內(nèi)存分配函數(shù)malloc的返回類型是void*類型。當(dāng)malloc函數(shù)的返回值為null時(shí)表示內(nèi)存分配不成功,返回值不為null時(shí)表示分配正常,程序繼續(xù)向下運(yùn)行。

步驟s103-2,若是,則在所述標(biāo)簽中記錄本次內(nèi)存分配信息。

在本實(shí)施例中,若接收到內(nèi)存分配函數(shù)malloc的返回值不為null的判斷結(jié)果,則將本次內(nèi)存分配信息記錄在額外請(qǐng)求的內(nèi)存監(jiān)控空間中。

在本實(shí)施例中,所述在所述標(biāo)簽中記錄本次內(nèi)存分配信息,具體包括步驟s103-2-1至s103-2-6,下面結(jié)合附圖3作進(jìn)一步說明。

請(qǐng)參考圖3,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的在所述標(biāo)簽中記錄本次內(nèi)存分配信息的方法的流程圖。

步驟s103-2-1,將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài)。

在本實(shí)施例中,所述將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài),可以采用如下方式實(shí)現(xiàn):當(dāng)malloc函數(shù)的返回值不為null時(shí),則將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài)。

例如:將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為allocate。

步驟s103-2-2,調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí)。

需要說明的是,所述回溯函數(shù),例如:intbacktrace(void**buffer,intsize)用于獲取函數(shù)調(diào)用堆棧,將獲取的信息存放在buffer中,buffer是一個(gè)指針列表,參數(shù)size用來指定buffer中可以保存多少個(gè)void*元素。函數(shù)返回值是實(shí)際獲取的指針個(gè)數(shù),最大不超過size大小,在本實(shí)施例中,通過所述回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),并將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí)。

需要說明的是,分配內(nèi)存塊的客戶或擁有者可以通過請(qǐng)求了內(nèi)存分配和/ 或釋放的應(yīng)用程序的可執(zhí)行代碼序列或者棧的回溯來表示。在復(fù)雜的應(yīng)用程序中,回溯對(duì)于更精確地識(shí)別應(yīng)用程序活動(dòng)的特定子集是很有用的。全局分配表中的每一個(gè)條目記錄了內(nèi)存分配的一條回溯路徑,這些路徑使用散列值進(jìn)行索引。隨后,在內(nèi)存分配/釋放過程中,更新相應(yīng)回溯路徑上分配/釋放的內(nèi)存大小。

由于backtrace操作性能較低,所以默認(rèn)只會(huì)對(duì)特定的backtrace_id進(jìn)行抽樣調(diào)用,若全部調(diào)用則將導(dǎo)致大型的應(yīng)用程序不能正常運(yùn)行。為了解決backtrace性能問題,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下,所述調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),可以采用編譯器開關(guān)記錄回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí),具體說,就是采用編譯器開關(guān)逐層記錄回溯函數(shù)所需內(nèi)容以替換backtrace操作。所述采用編譯器開關(guān)記錄回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí),具體包括步驟s103-2-2-1至s103-2-2-2,下面結(jié)合附圖4作進(jìn)一步說明。

請(qǐng)參考圖4,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的采用編譯器將回溯函數(shù)注入應(yīng)用程序獲取函數(shù)調(diào)用棧的標(biāo)識(shí)的方法的流程圖。

步驟s103-2-2-1,在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)。

在本實(shí)施例中,所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù),可以采用如下方式實(shí)現(xiàn):使用gcc(gnucompilercollection)添加-finstrument-functions編譯器在編譯的過程中插入相應(yīng)的代碼,-finstrument-functions使在每個(gè)函數(shù)調(diào)用之前調(diào)用一個(gè)名為__cyg_profile_func_enter的跟蹤函數(shù),在每個(gè)函數(shù)退出時(shí)調(diào)用一個(gè)名為__cyg_profile_func_exit的跟蹤函數(shù)。

例如:在函數(shù)調(diào)用的入口調(diào)用:void__cyg_profile_func_enter(void*func_address,void*call_site);在函數(shù)調(diào)用的出口調(diào)用:void__cyg_profile_func_exit(void*func_address,void*call_site)。

由于應(yīng)用程序bug造成申請(qǐng)的內(nèi)存不足或者野指針操作會(huì)造成應(yīng)用程序內(nèi)存被寫壞,而且內(nèi)存被寫壞后訪問這些內(nèi)存將導(dǎo)致應(yīng)用程序行為不可預(yù)期,且觸發(fā)時(shí)間和問題時(shí)間間隔可能較長(zhǎng),從而現(xiàn)場(chǎng)破壞,問題難于調(diào)查,為了解決內(nèi)存被寫壞的問題,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下,在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)的步驟之前,在所述跟蹤函數(shù)中預(yù)設(shè)內(nèi)存寫壞的判斷條件。

例如:在跟蹤函數(shù)__cyg_profile_func_enter和__cyg_profile_func_exit中加入檢查點(diǎn),即滿足內(nèi)存寫壞的判斷條件pattern。

與在所述跟蹤函數(shù)中預(yù)設(shè)內(nèi)存寫壞的判斷條件的步驟相對(duì)應(yīng)的,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下步驟s103-2-2-1在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)之后,具體包括如下步驟:

判斷內(nèi)存塊是否滿足預(yù)設(shè)內(nèi)存寫壞的判斷條件;

若是,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息;

若否,則執(zhí)行所述通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,并通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)的步驟。

可以理解的,判斷內(nèi)存塊是否滿足預(yù)設(shè)內(nèi)存寫壞的判斷條件的步驟是在調(diào)用__cyg_profile_func_enter和__cyg_profile_func_exit函數(shù)之后,通過在上述函數(shù)中的檢查點(diǎn)判斷當(dāng)前內(nèi)存塊是否被寫壞。

需要說明的是,所述終止函數(shù)是abort()函數(shù),該函數(shù)的作用是異常終止一個(gè)進(jìn)程,具體的,abort()函數(shù)首先解除進(jìn)程對(duì)sigabrt信號(hào)的阻止,然后向調(diào)用進(jìn)程發(fā)送該信號(hào)。abort()函數(shù)會(huì)導(dǎo)致進(jìn)程的異常終止除非sigabrt信號(hào)被捕捉并且信號(hào)處理句柄沒有返回。

步驟s103-2-2-2,通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)。

在本實(shí)施例中,所述通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí),可以采用如下方式實(shí)現(xiàn):在重載函數(shù)庫(kù)中定義線程局部變量,并接收在函數(shù)調(diào)用的入口調(diào)用的__cyg_profile_func_enter函數(shù)和在函數(shù)調(diào)用的出口調(diào)用的__cyg_profile_func_exit函數(shù)實(shí)時(shí)更新當(dāng)前線程函數(shù)調(diào)用棧,并在線程局部變量中記錄,之后通過回溯函數(shù)匯總棧信息,并獲取和此分配函數(shù)調(diào)用棧匹配的標(biāo)識(shí)。

需要說明的是,在所述通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)的步驟之后,將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為記錄分配函數(shù)調(diào)用棧的標(biāo)識(shí)。

步驟s103-2-3,獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間。

在本實(shí)施例中,所述獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,可以采用如下方式實(shí)現(xiàn):利用操作系統(tǒng)提供的接口獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,并將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間。

例如:例如,可以使用操作系統(tǒng)提供的gettimeofday函數(shù)實(shí)現(xiàn)上述獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間的功能。

步驟s103-2-4,獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí)。

在本實(shí)施例中,所述獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),可以采用如下方式實(shí)現(xiàn):當(dāng)應(yīng)用程序的線程對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求時(shí),會(huì)根據(jù)請(qǐng)求的內(nèi)存大小獲取符合預(yù)置條件的內(nèi)存空間,分配給該線程并獲取線程的標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間請(qǐng)求內(nèi)存的線程的標(biāo)識(shí)。

例如:假設(shè)線程請(qǐng)求的內(nèi)存大小是1m,則操作系統(tǒng)會(huì)在內(nèi)存中選擇同樣為1m的內(nèi)存空間分配給該線程,此時(shí),操作系統(tǒng)選擇的這1m的內(nèi)存空間被稱為一個(gè)內(nèi)存塊,當(dāng)線程將這1m的內(nèi)存釋放之后,該內(nèi)存塊就成為空閑的內(nèi)存空間,即該內(nèi)存塊可以分配給其他的線程。

步驟s103-2-5,根據(jù)申請(qǐng)的內(nèi)存運(yùn)行空間的大小,將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作,并按照分桶操作的順序?qū)γ總€(gè)桶設(shè)置桶標(biāo)識(shí),在所述標(biāo)簽中的桶標(biāo)識(shí)中記錄當(dāng)前內(nèi)存大小對(duì)應(yīng)桶的桶標(biāo)識(shí)。

需要說明的是,所述分桶操作相當(dāng)于對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行預(yù)分配的過程,即在向操作系統(tǒng)申請(qǐng)到內(nèi)存運(yùn)行空間之后,首先將其劃分為多個(gè)內(nèi)存塊,然后再將其劃分為多個(gè)內(nèi)存桶,也就是說,在程序進(jìn)行具體的內(nèi)存請(qǐng)求之前已經(jīng)對(duì)申請(qǐng)到的內(nèi)存空間進(jìn)行了劃分。當(dāng)一個(gè)進(jìn)程請(qǐng)求內(nèi)存空間時(shí),會(huì)攜帶有需要的內(nèi)存空間大小的信息,根據(jù)請(qǐng)求的內(nèi)存空間大小,選擇符合預(yù)置條件的內(nèi)存桶。例如,可以選擇大于用戶請(qǐng)求的內(nèi)存大小的最小內(nèi)存桶;換言之,當(dāng)某進(jìn)程請(qǐng)求內(nèi)存時(shí),意味著有數(shù)據(jù)需要存放在內(nèi)存中,因此,請(qǐng)求的內(nèi)存空間大小取決于需要存放的數(shù)據(jù)的大小。

在本實(shí)施例中,內(nèi)存桶是預(yù)先劃分好的,在進(jìn)行內(nèi)存空間分配時(shí)也是按內(nèi)存桶進(jìn)行分配,而進(jìn)程請(qǐng)求的內(nèi)存空間大小是不確定的。

例如,申請(qǐng)的內(nèi)存運(yùn)行空間的大小為10m,則將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作,將該內(nèi)存運(yùn)行空間劃分為1m,2m,3m,4m4個(gè)內(nèi)存桶,并按照分桶操作的順序?qū)γ總€(gè)桶設(shè)置桶標(biāo)識(shí),即第一個(gè)1m的內(nèi)存桶的桶標(biāo)識(shí)為1,第二個(gè)2m的內(nèi)存桶的桶標(biāo)識(shí)為2,第三個(gè)3m的內(nèi)存桶的桶標(biāo)識(shí)為3,第四個(gè)4m的內(nèi)存桶的桶標(biāo)識(shí)為4,并在所述標(biāo)簽中的桶標(biāo)識(shí)中記錄每個(gè)桶的桶標(biāo)識(shí),通過桶標(biāo)識(shí)就可以可以獲得本內(nèi)存分配塊的空間信息。

步驟s103-2-6,將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

需要說明的是,所述標(biāo)簽標(biāo)識(shí)是用于區(qū)分在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間的標(biāo)識(shí),可以理解的,由于該標(biāo)簽是在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,所以通過該標(biāo)簽標(biāo)識(shí)可以在應(yīng)用程序內(nèi)存中標(biāo)識(shí)以及區(qū)分該標(biāo)簽的位置,便于讀取。例如:所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)可以是“已添加標(biāo)簽”或者是其他能區(qū)分內(nèi)存監(jiān)控空間和內(nèi)存運(yùn)行空間的標(biāo)識(shí)。

步驟s105,對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

在本實(shí)施例中,所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息,可以采用如下方式實(shí)現(xiàn):對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄該申請(qǐng)的內(nèi)存運(yùn)行空間釋放后的內(nèi)存塊狀態(tài)、內(nèi)存分配棧標(biāo)識(shí)、時(shí)間戳、線程標(biāo)識(shí)、桶標(biāo)識(shí)以及標(biāo)簽標(biāo)識(shí)。

在具體實(shí)施時(shí),應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)釋放申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),在所述標(biāo)簽中記錄本次內(nèi)存釋放信息。所述額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間是:用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

在本實(shí)施例中,所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息,具體包括步驟s105-1至s105-5,下面結(jié)合附圖5作進(jìn)一步說明。

請(qǐng)參考圖5,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的方法的流程圖。

步驟s105-1,將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài)。

在本實(shí)施例中,所述將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài),可以采 用如下方式實(shí)現(xiàn):free函數(shù)清除malloc(或calloc、realloc)函數(shù)給指針變量分配的內(nèi)存空間指向的地址后,則將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài)。

例如:將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為free。

步驟s105-2,調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的內(nèi)存塊的釋放函數(shù)調(diào)用棧的標(biāo)識(shí)。

需要說明的是,所述回溯函數(shù),例如:intbacktrace(void**buffer,intsize)用于獲取函數(shù)調(diào)用堆棧,將獲取的信息存放在buffer中,buffer是一個(gè)指針列表,參數(shù)size用來指定buffer中可以保存多少個(gè)void*元素。函數(shù)返回值是實(shí)際獲取的指針個(gè)數(shù),最大不超過size大小,在本實(shí)施例中,通過所述回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),并將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí)。

由于backtrace操作性能較低,所以默認(rèn)只會(huì)對(duì)特定的backtrace_id進(jìn)行抽樣調(diào)用,若全部調(diào)用則將導(dǎo)致大型的應(yīng)用程序不能正常運(yùn)行。為了解決backtrace性能問題,本實(shí)施例的技術(shù)方案提供了一種優(yōu)選實(shí)施方式,在優(yōu)選方式下,所述調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),可以采用編譯器將回溯函數(shù)注入應(yīng)用程序獲取函數(shù)調(diào)用棧的標(biāo)識(shí)。所述采用編譯器將回溯函數(shù)注入應(yīng)用程序獲取函數(shù)調(diào)用棧的標(biāo)識(shí),由于在前面實(shí)施例中已經(jīng)對(duì)此進(jìn)行了比較詳細(xì)的描述,此處不再贅述。

步驟s105-3,獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間。

在本實(shí)施例中,所述獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,可以采用如下方式實(shí)現(xiàn):利用操作系統(tǒng)提供的接口獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,并將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間。

例如,可以使用操作系統(tǒng)提供的gettimeofday函數(shù)實(shí)現(xiàn)上述獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間的功能。

步驟s105-4,獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí)。

在本實(shí)施例中,所述獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),可以采用如下方式實(shí)現(xiàn):當(dāng)應(yīng)用程序的線程對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求時(shí),會(huì)獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí)。

步驟s105-5,將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

需要說明的是,所述標(biāo)簽標(biāo)識(shí)是用于區(qū)分在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間的標(biāo)識(shí),可以理解的,由于該標(biāo)簽是在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間,所以通過該標(biāo)簽標(biāo)識(shí)可以在應(yīng)用程序內(nèi)存中標(biāo)識(shí)以及區(qū)分該標(biāo)簽的位置,便于讀取。例如:所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)可以是“已添加標(biāo)簽”或者是其他能區(qū)分內(nèi)存監(jiān)控空間和內(nèi)存運(yùn)行空間的標(biāo)識(shí)。

由于在對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài),用來表示內(nèi)存被使用的開始,所以在對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放之前,需要對(duì)所述標(biāo)簽中的內(nèi)存塊狀態(tài)進(jìn)行識(shí)別,在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的步驟之前,具體包括如下步驟:

判斷所述標(biāo)簽中的內(nèi)存塊狀態(tài)是否為已分配狀態(tài);

若是,則執(zhí)行所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的步驟;

若否,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息。

在本實(shí)施例中,如果在所述標(biāo)簽中記錄本次內(nèi)存釋放信息之前,所述標(biāo)簽中的內(nèi)存塊狀態(tài)為已釋放狀態(tài),則說明該內(nèi)存發(fā)生內(nèi)存重復(fù)釋放,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息,禁止釋放操作;如果在所述標(biāo)簽中記錄本次內(nèi)存釋放信息之前,所述標(biāo)簽中的內(nèi)存塊狀態(tài)為已分配狀態(tài),則說明該內(nèi)存為首次釋放,并執(zhí)行所述在所述標(biāo)簽中記錄本次內(nèi)存釋放信息的步驟。

可以理解的,在釋放內(nèi)存時(shí),可能為首次或重復(fù)釋放,為進(jìn)行區(qū)分只需檢測(cè)所述標(biāo)簽中的內(nèi)存塊狀態(tài),若所述標(biāo)簽中的內(nèi)存塊狀態(tài)為已釋放狀態(tài),則說明該內(nèi)存發(fā)生內(nèi)存重復(fù)釋放;若所述標(biāo)簽中的內(nèi)存塊狀態(tài)為已分配狀態(tài),則說明該內(nèi)存為首次釋放,可以進(jìn)行釋放操作。

需要說明的是,所述終止函數(shù)是abort()函數(shù),該函數(shù)的作用是異常終止一個(gè)進(jìn)程,具體的,abort()函數(shù)首先解除進(jìn)程對(duì)sigabrt信號(hào)的阻止,然后向調(diào) 用進(jìn)程發(fā)送該信號(hào)。abort()函數(shù)會(huì)導(dǎo)致進(jìn)程的異常終止除非sigabrt信號(hào)被捕捉并且信號(hào)處理句柄沒有返回。

在上述的實(shí)施例中,提供了一種監(jiān)控應(yīng)用程序內(nèi)存的方法,與上述監(jiān)控應(yīng)用程序內(nèi)存的方法相對(duì)應(yīng)的,本申請(qǐng)還提供了一種監(jiān)控應(yīng)用程序內(nèi)存的裝置。由于裝置的實(shí)施例基本相似于方法的實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。下述描述的裝置實(shí)施例僅僅是示意性的。所述監(jiān)控應(yīng)用程序內(nèi)存的裝置實(shí)施例如下:

請(qǐng)參考圖6,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的監(jiān)控應(yīng)用程序內(nèi)存的裝置的示意圖。

所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,包括:監(jiān)控空間請(qǐng)求單元601、內(nèi)存分配信息記錄單元603以及內(nèi)存釋放信息記錄單元605;

所述監(jiān)控空間請(qǐng)求單元601,用于應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間;

所述內(nèi)存分配信息記錄單元603,用于對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存分配信息;

所述內(nèi)存釋放信息記錄單元605,用于對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:重載函數(shù)庫(kù)鏈接單元;

所述重載函數(shù)庫(kù)鏈接單元,用于在所述應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間之前,將預(yù)設(shè)的重載函數(shù)庫(kù)鏈接到應(yīng)用程序中。

可選的,所述重載函數(shù)庫(kù)鏈接單元,鏈接到應(yīng)用程序中的至少包括如下內(nèi)存管理函數(shù):內(nèi)存分配函數(shù)、內(nèi)存釋放函數(shù)以及內(nèi)存調(diào)整函數(shù)。

可選的,所述重載函數(shù)庫(kù)鏈接單元,包括:靜態(tài)鏈接子單元以及動(dòng)態(tài)鏈接子單元;

所述靜態(tài)鏈接子單元,用于若所述應(yīng)用程序是采用靜態(tài)鏈接的應(yīng)用程序,則在編譯時(shí)將靜態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序;

所述動(dòng)態(tài)鏈接子單元,用于若所述應(yīng)用程序是采用動(dòng)態(tài)連接的應(yīng)用程序,則在編譯時(shí)將動(dòng)態(tài)鏈接庫(kù)鏈接進(jìn)應(yīng)用程序或者應(yīng)用程序運(yùn)行時(shí),通過注入的方式把動(dòng)態(tài)鏈接庫(kù)注入應(yīng)用程序。

可選的,所述監(jiān)控空間請(qǐng)求單元601,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間。

可選的,所述監(jiān)控空間請(qǐng)求單元601,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)申請(qǐng)內(nèi)存運(yùn)行空間時(shí),所述內(nèi)存管理函數(shù)在內(nèi)存中額外請(qǐng)求用于記錄內(nèi)存信息的大小為16字節(jié)的標(biāo)簽。

可選的,所述內(nèi)存分配信息記錄單元603,包括:判斷子單元以及內(nèi)存分配信息記錄子單元;

所述判斷子單元,用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)分配申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),判斷所述內(nèi)存管理函數(shù)是否成功分配申請(qǐng)的內(nèi)存運(yùn)行空間;

所述內(nèi)存分配信息記錄子單元,用于接收所述判斷子單元的判斷結(jié)果,若是,則在所述標(biāo)簽中記錄本次內(nèi)存分配信息。

可選的,所述內(nèi)存分配信息記錄子單元,包括:已分配狀態(tài)設(shè)置子單元、調(diào)用棧標(biāo)識(shí)設(shè)置子單元、時(shí)間設(shè)置子單元、線程標(biāo)識(shí)設(shè)置子單元、桶標(biāo)識(shí)設(shè)置子單元以及標(biāo)簽標(biāo)識(shí)設(shè)置子單元;

所述已分配狀態(tài)設(shè)置子單元,用于將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已分配狀態(tài);

所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,用于調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí);

所述時(shí)間設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí)的當(dāng)前系統(tǒng)時(shí)間;

所述線程標(biāo)識(shí)設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

所述桶標(biāo)識(shí)設(shè)置子單元,用于根據(jù)申請(qǐng)的內(nèi)存運(yùn)行空間的大小,將所述內(nèi)存運(yùn)行空間進(jìn)行分桶操作,并按照分桶操作的順序?qū)γ總€(gè)桶設(shè)置桶標(biāo)識(shí),在所述標(biāo)簽中的桶標(biāo)識(shí)中記錄當(dāng)前內(nèi)存大小對(duì)應(yīng)桶的桶標(biāo)識(shí);

所述標(biāo)簽標(biāo)識(shí)設(shè)置子單元,用于將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽 的標(biāo)識(shí)。

可選的,所述內(nèi)存釋放信息記錄單元605,具體用于應(yīng)用程序調(diào)用所述預(yù)設(shè)的重載函數(shù)庫(kù)中的內(nèi)存管理函數(shù)釋放申請(qǐng)的內(nèi)存運(yùn)行空間時(shí),在所述標(biāo)簽中記錄本次內(nèi)存釋放信息。

可選的,所述內(nèi)存釋放信息記錄單元605,包括:已釋放狀態(tài)設(shè)置子單元、調(diào)用棧標(biāo)識(shí)設(shè)置子單元、釋放時(shí)間設(shè)置子單元、線程標(biāo)識(shí)更新子單元以及標(biāo)簽標(biāo)識(shí)添加子單元;

所述已釋放狀態(tài)設(shè)置子單元,用于將所述標(biāo)簽中的內(nèi)存塊狀態(tài)設(shè)置為已釋放狀態(tài);

所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,用于調(diào)用回溯函數(shù)獲取函數(shù)調(diào)用棧的標(biāo)識(shí),將所述標(biāo)簽中的內(nèi)存分配棧標(biāo)識(shí)設(shè)置為通過回溯函數(shù)獲取的內(nèi)存塊的釋放函數(shù)調(diào)用棧的標(biāo)識(shí);

所述釋放時(shí)間設(shè)置子單元,用于獲取對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間,將所述標(biāo)簽中的時(shí)間戳設(shè)置為獲取的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí)的當(dāng)前系統(tǒng)時(shí)間;

所述線程標(biāo)識(shí)更新子單元,用于獲取對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí),將所述標(biāo)簽中的線程標(biāo)識(shí)設(shè)置為獲取的對(duì)釋放的內(nèi)存空間進(jìn)行請(qǐng)求的線程標(biāo)識(shí);

所述標(biāo)簽標(biāo)識(shí)添加子單元,用于將所述標(biāo)簽中的標(biāo)簽標(biāo)識(shí)設(shè)置為已添加標(biāo)簽的標(biāo)識(shí)。

可選的,所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,具體用于采用編譯器開關(guān)記錄回溯函數(shù)獲取的函數(shù)調(diào)用棧的標(biāo)識(shí)。

可選的,所述調(diào)用棧標(biāo)識(shí)設(shè)置子單元,包括:

跟蹤函數(shù)調(diào)用子單元,用于在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù);

標(biāo)識(shí)獲取子單元,用于通過棧記錄所述跟蹤函數(shù)調(diào)用返回地址,并通過回溯函數(shù)匯總棧信息獲取調(diào)用棧的標(biāo)識(shí)。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:狀態(tài)判斷單元、內(nèi)存釋放信息記錄觸發(fā)單元以及終止函數(shù)調(diào)用單元;

所述狀態(tài)判斷單元,用于在所述標(biāo)簽中記錄本次內(nèi)存釋放信息之前,判斷所述標(biāo)簽中的內(nèi)存塊狀態(tài)是否為已分配狀態(tài);

所述內(nèi)存釋放信息記錄觸發(fā)單元,用于接收所述狀態(tài)判斷單元的判斷結(jié)果,若是,則執(zhí)觸發(fā)所述內(nèi)存釋放信息記錄單元;

所述終止函數(shù)調(diào)用單元,用于接收所述狀態(tài)判斷單元的判斷結(jié)果,若否,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:條件設(shè)置單元、條件判斷單元、終止函數(shù)調(diào)用單元以及標(biāo)識(shí)接收觸發(fā)單元;

所述條件設(shè)置單元,用于在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)之前,在所述跟蹤函數(shù)中預(yù)設(shè)內(nèi)存寫壞的判斷條件;

所述條件判斷單元,用于在所述在每個(gè)函數(shù)調(diào)用的出入口調(diào)用跟蹤函數(shù)之后,判斷內(nèi)存塊是否滿足預(yù)設(shè)內(nèi)存寫壞的判斷條件;

所述終止函數(shù)調(diào)用單元,用于接收所述條件判斷單元的判斷結(jié)果,若是,則調(diào)用終止函數(shù)結(jié)束該應(yīng)用程序,并轉(zhuǎn)儲(chǔ)保存進(jìn)程信息;

所述標(biāo)識(shí)接收觸發(fā)單元,用于接收所述條件判斷單元的判斷結(jié)果,若否,則觸發(fā)所述標(biāo)識(shí)接收子單元。

可選的,所述內(nèi)存分配信息記錄單元603,還包括:子進(jìn)程創(chuàng)建子單元;

所述子進(jìn)程創(chuàng)建子單元,用于在所述對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配或釋放時(shí),根據(jù)在應(yīng)用程序中已經(jīng)運(yùn)行的進(jìn)程的內(nèi)存鏡像信息,創(chuàng)建與該進(jìn)程資源相同的子進(jìn)程。

可選的,所述監(jiān)控應(yīng)用程序內(nèi)存的裝置,還包括:內(nèi)存信息獲取單元;

所述內(nèi)存信息獲取單元,用于當(dāng)應(yīng)用程序發(fā)生異常時(shí),調(diào)用終止函數(shù)使子進(jìn)程終止運(yùn)行,并轉(zhuǎn)存進(jìn)程信息獲取應(yīng)用程序的內(nèi)存布局。

在上述的實(shí)施例中,提供了一種監(jiān)控應(yīng)用程序內(nèi)存的方法以及一種監(jiān)控應(yīng)用程序內(nèi)存的裝置,此外,本申請(qǐng)還提供了一種電子設(shè)備;所述電子設(shè)備實(shí)施例如下:

請(qǐng)參考圖7,其示出了根據(jù)本申請(qǐng)的實(shí)施例提供的電子設(shè)備的示意圖。

所述電子設(shè)備,包括:顯示器701;處理器703;存儲(chǔ)器705;

所述存儲(chǔ)器705,用于存儲(chǔ)內(nèi)存監(jiān)控程序,所述程序在被所述處理器讀取執(zhí)行時(shí),執(zhí)行如下操作:應(yīng)用程序申請(qǐng)內(nèi)存運(yùn)行空間時(shí),在內(nèi)存中額外請(qǐng)求預(yù)設(shè)大小的內(nèi)存監(jiān)控空間;對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行分配時(shí),在額外請(qǐng)求的內(nèi)存監(jiān) 控空間中記錄本次內(nèi)存分配信息;對(duì)申請(qǐng)的內(nèi)存運(yùn)行空間進(jìn)行釋放時(shí),在額外請(qǐng)求的內(nèi)存監(jiān)控空間中記錄本次內(nèi)存釋放信息。

在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。

內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。

1、計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。

2、本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。

本申請(qǐng)雖然以較佳實(shí)施例公開如上,但其并不是用來限定本申請(qǐng),任何本領(lǐng)域技術(shù)人員在不脫離本申請(qǐng)的精神和范圍內(nèi),都可以做出可能的變動(dòng)和修改,因此本申請(qǐng)的保護(hù)范圍應(yīng)當(dāng)以本申請(qǐng)權(quán)利要求所界定的范圍為準(zhǔn)。

當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1