基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置制造方法
【專利摘要】基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置,涉及一種動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置。為了解決目前動(dòng)態(tài)內(nèi)存泄漏檢測(cè)的檢錯(cuò)效率低且速度慢的問題。它通過改寫內(nèi)存分配函數(shù)malloc()和內(nèi)存釋放函數(shù)free()得到函數(shù)LC_malloc()和函數(shù)LC_free(),以日志的形式記錄分配和釋放信息,實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤;通過TCP通信協(xié)議,使用數(shù)據(jù)發(fā)送緩沖隊(duì)列,將日志信息從安裝有VxWorks操作系統(tǒng)的工控機(jī)上傳到上位機(jī);在上位機(jī)中,從日志文件中讀入日志事件項(xiàng),并對(duì)比內(nèi)存的分配和釋放,從日志文件中分析并檢測(cè)出內(nèi)存泄露。它適用于動(dòng)態(tài)內(nèi)存泄漏檢測(cè)。
【專利說明】基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置,特別涉及一種基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置。
【背景技術(shù)】
[0002]Vxfforks是美國(guó)Wind River公司開發(fā)的一種實(shí)時(shí)操作系統(tǒng),其以良好的可靠性和卓越的實(shí)時(shí)性被廣泛應(yīng)用于很多實(shí)時(shí)性要求極高的領(lǐng)域。一般使用VxWorks操作系統(tǒng)的產(chǎn)品都是內(nèi)存一定,而又要長(zhǎng)期穩(wěn)定運(yùn)行的產(chǎn)品,因此長(zhǎng)時(shí)候少量的內(nèi)存泄漏對(duì)系統(tǒng)來說也是不合適的。在程序的運(yùn)行中,導(dǎo)致程序中存在多種與動(dòng)態(tài)內(nèi)存管理相關(guān)的錯(cuò)誤,有內(nèi)存泄漏、內(nèi)存的重復(fù)釋放、空指針引用等。這些錯(cuò)誤占到軟件系統(tǒng)內(nèi)存故障的50%,這些錯(cuò)誤導(dǎo)致系統(tǒng)失效甚至崩潰,這在實(shí)時(shí)操作系統(tǒng)中是不允許的。
[0003]目前,關(guān)于動(dòng)態(tài)內(nèi)存錯(cuò)誤的檢測(cè)方法和工具主要分為兩類:動(dòng)態(tài)方法和靜態(tài)方法。
[0004]靜態(tài)方法通過對(duì)程序結(jié)構(gòu)的分析來檢測(cè)程序中隱藏的動(dòng)態(tài)內(nèi)存錯(cuò)誤,如Lint,Splint等是通過在源程序中添加注釋語句來檢測(cè)應(yīng)用程序中潛在的錯(cuò)誤,而檢錯(cuò)效果與應(yīng)用程序中的注釋量有關(guān),并且這些工具中存在的嚴(yán)重問題是經(jīng)常會(huì)給出錯(cuò)誤的報(bào)告,這些不正確的報(bào)警信息會(huì)對(duì)排錯(cuò)工作產(chǎn)生負(fù)面的影響,從而影響錯(cuò)誤檢測(cè)工作的順利進(jìn)行。
[0005]動(dòng)態(tài)方法需要在程序中進(jìn)行潛在錯(cuò)誤的檢測(cè),如purify,它是一個(gè)動(dòng)態(tài)的單元測(cè)試工具,可以檢測(cè)到程序中存在的內(nèi)存泄漏問題,而對(duì)于其他的動(dòng)態(tài)內(nèi)存錯(cuò)誤,如空指針的引用,動(dòng)態(tài)內(nèi)存的重復(fù)釋放等問題卻無能為力。同時(shí),purify需要在程序的運(yùn)行中進(jìn)行內(nèi)存泄漏的檢測(cè),由于程序中分支結(jié)構(gòu)的存在,程序的一次運(yùn)行不能覆蓋所有的程序分支,有些錯(cuò)誤不能通過程序的運(yùn)行暴露出來,從而在一定程度上降低了檢錯(cuò)效率。Purify和其他動(dòng)態(tài)檢測(cè)工具一樣有一個(gè)很重大的限制:會(huì)顯著增加運(yùn)行時(shí)的負(fù)荷。有時(shí)候這些工具能夠使程序的運(yùn)行速度減慢20倍。
【發(fā)明內(nèi)容】
[0006]本發(fā)明的目的是為了解決目前動(dòng)態(tài)內(nèi)存泄漏檢測(cè)的檢錯(cuò)效率低且速度慢的問題,本發(fā)明提供一種基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法及裝置。
[0007]本發(fā)明的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,它是基于安裝Vxfforks操作系統(tǒng)的工控機(jī)和上位機(jī)實(shí)現(xiàn)的,所述工控機(jī)內(nèi)嵌入有工控機(jī)軟件,所述工控機(jī)軟件的工作過程包括如下步驟:
[0008]用于調(diào)用函數(shù)LCjnallocO和函數(shù)LC_free O實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤,并以日志的形式記錄各事件項(xiàng)的內(nèi)存分配和內(nèi)存釋放的信息的步驟;
[0009]函數(shù)LC_malloc()用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配,若返回一個(gè)有效的內(nèi)存地址,則將動(dòng)態(tài)內(nèi)存分配信息輸出到日志文件,若返回一個(gè)無效的內(nèi)存地址,則不做任何日志操作;
[0010]函數(shù)LC_free()用于對(duì)指定的內(nèi)存釋放,若內(nèi)存釋放成功,則將動(dòng)態(tài)內(nèi)存釋放信息輸出到日志文件,如果內(nèi)存釋放失敗,則不做任何日志操作;
[0011]用于將日志信息通過TCP通信協(xié)議并使用數(shù)據(jù)發(fā)送緩沖隊(duì)列發(fā)送到上位機(jī)的步驟;
[0012]所述上位機(jī)內(nèi)嵌入有上位機(jī)軟件,所述上位機(jī)軟件包括如下步驟:
[0013]用于從日志文件中讀入日志信息,遍歷日志信息中的每個(gè)日志事件項(xiàng),并檢查讀入的每個(gè)日志事件項(xiàng)是否進(jìn)行了內(nèi)存分配操作或者內(nèi)存釋放操作的步驟;
[0014]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存分配操作時(shí),將所述日志事件項(xiàng)的內(nèi)存地址作為鍵值加入哈希表的步驟;
[0015]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存釋放操作時(shí),判斷哈希表中是否存在所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;
[0016]用于當(dāng)哈希表中存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),在哈希表中刪除所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;
[0017]用于當(dāng)哈希表中不存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),將所述日志事件項(xiàng)及相應(yīng)信息加入到重復(fù)釋放錯(cuò)誤列表中的步驟;
[0018]用于當(dāng)檢測(cè)到進(jìn)行了內(nèi)存分配操作的日志事件項(xiàng)的已分配時(shí)間達(dá)到設(shè)定的閾值且沒有進(jìn)行內(nèi)存釋放操作時(shí),將所述日志事件項(xiàng)標(biāo)記為內(nèi)存泄漏事件項(xiàng)的步驟;
[0019]用于當(dāng)遍歷完日志文件中所有日志事件項(xiàng)時(shí),根據(jù)重復(fù)釋放錯(cuò)誤列表中的信息和哈希表中標(biāo)記的內(nèi)存泄漏事件項(xiàng),定位發(fā)生內(nèi)存泄漏的位置的步驟。
[0020]本發(fā)明的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)裝置,它是基于安裝Vxfforks操作系統(tǒng)的工控機(jī)和上位機(jī)實(shí)現(xiàn)的,所述工控機(jī)包括如下裝置:
[0021]用于調(diào)用函數(shù)LC_mal1c O和函數(shù)LC_free()實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤,并以日志的形式記錄各事件項(xiàng)的內(nèi)存分配和內(nèi)存釋放的信息的裝置;
[0022]函數(shù)LCjnallocO用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配,若返回一個(gè)有效的內(nèi)存地址,則將動(dòng)態(tài)內(nèi)存分配信息輸出到日志文件,若返回一個(gè)無效的內(nèi)存地址,則不做任何日志操作;
[0023]函數(shù)LC_free()用于對(duì)指定的內(nèi)存釋放,若內(nèi)存釋放成功,則將動(dòng)態(tài)內(nèi)存釋放信息輸出到日志文件,如果內(nèi)存釋放失敗,則不做任何日志操作;
[0024]用于將日志信息通過TCP通信協(xié)議并使用數(shù)據(jù)發(fā)送緩沖隊(duì)列發(fā)送到上位機(jī)的裝置;
[0025]所述上位機(jī)包括如下裝置:
[0026]用于從日志文件中讀入日志信息,遍歷日志信息中的每個(gè)日志事件項(xiàng),并檢查讀入的每個(gè)日志事件項(xiàng)是否進(jìn)行了內(nèi)存分配操作或者內(nèi)存釋放操作的裝置;
[0027]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存分配操作時(shí),將所述日志事件項(xiàng)的內(nèi)存地址作為鍵值加入哈希表的裝置;
[0028]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存釋放操作時(shí),判斷哈希表中是否存在所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的裝置;
[0029]用于當(dāng)哈希表中存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),在哈希表中刪除所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的裝置;
[0030]用于當(dāng)哈希表中不存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),將所述日志事件項(xiàng)及相應(yīng)信息加入到重復(fù)釋放錯(cuò)誤列表中的裝置;
[0031]用于當(dāng)檢測(cè)到進(jìn)行了內(nèi)存分配操作的日志事件項(xiàng)的已分配時(shí)間達(dá)到設(shè)定的閾值且沒有進(jìn)行內(nèi)存釋放操作時(shí),將所述日志事件項(xiàng)標(biāo)記為內(nèi)存泄漏事件項(xiàng)的裝置;
[0032]用于當(dāng)遍歷完日志文件中所有日志事件項(xiàng)時(shí),根據(jù)重復(fù)釋放錯(cuò)誤列表中的信息和哈希表中標(biāo)記的內(nèi)存泄漏事件項(xiàng),定位發(fā)生內(nèi)存泄漏的位置的裝置。
[0033]本發(fā)明的優(yōu)點(diǎn)在于,通過改寫內(nèi)存分配函數(shù)mallocO和內(nèi)存釋放函數(shù)free O得到函數(shù)LCjnallocO和LC_free O,以日志的形式記錄內(nèi)存分配和內(nèi)存釋放信息,實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤;通過TCP通信協(xié)議,使用數(shù)據(jù)發(fā)送緩沖隊(duì)列,將日志信息從安裝VxWorks的工控機(jī)上傳到上位機(jī);在上位機(jī)中,從日志文件中讀入日志事件項(xiàng),并對(duì)比內(nèi)存的分配和釋放,從日志文件中分析并檢測(cè)出內(nèi)存。本發(fā)明比現(xiàn)有動(dòng)態(tài)內(nèi)存泄漏檢測(cè)的檢錯(cuò)效率提高了30%,且速度也提高了 20%。
【專利附圖】
【附圖說明】
[0034]圖1為本發(fā)明所述的實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤的流程示意圖。
【具體實(shí)施方式】
[0035]【具體實(shí)施方式】一:結(jié)合圖1說明本實(shí)施方式,本實(shí)施方式所述的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,本發(fā)明的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,它是基于安裝VxWorks操作系統(tǒng)的工控機(jī)和上位機(jī)實(shí)現(xiàn)的,所述工控機(jī)內(nèi)嵌入有工控機(jī)軟件,所述工控機(jī)軟件的工作過程包括如下步驟:
[0036]用于調(diào)用函數(shù)LCjnallocO和函數(shù)LC_free O實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤,并以日志的形式記錄各事件項(xiàng)的內(nèi)存分配和內(nèi)存釋放的信息的步驟;
[0037]函數(shù)LCjnallocO用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配,若返回一個(gè)有效的內(nèi)存地址,則將動(dòng)態(tài)內(nèi)存分配信息輸出到日志文件,若返回一個(gè)無效的內(nèi)存地址,則不做任何日志操作;
[0038]函數(shù)LC_free()用于對(duì)指定的內(nèi)存釋放,若內(nèi)存釋放成功,則將動(dòng)態(tài)內(nèi)存釋放信息輸出到日志文件,如果內(nèi)存釋放失敗,則不做任何日志操作;
[0039]用于將日志信息通過TCP通信協(xié)議并使用數(shù)據(jù)發(fā)送緩沖隊(duì)列發(fā)送到上位機(jī)的步驟;
[0040]所述上位機(jī)內(nèi)嵌入有上位機(jī)軟件,所述上位機(jī)軟件包括如下步驟:
[0041]用于從日志文件中讀入日志信息,遍歷日志信息中的每個(gè)日志事件項(xiàng),并檢查讀入的每個(gè)日志事件項(xiàng)是否進(jìn)行了內(nèi)存分配操作或者內(nèi)存釋放操作的步驟;
[0042]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存分配操作時(shí),將所述日志事件項(xiàng)的內(nèi)存地址作為鍵值加入哈希表的步驟;
[0043]用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存釋放操作時(shí),判斷哈希表中是否存在所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;
[0044]用于當(dāng)哈希表中存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),在哈希表中刪除所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;
[0045]用于當(dāng)哈希表中不存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),將所述日志事件項(xiàng)及相應(yīng)信息加入到重復(fù)釋放錯(cuò)誤列表中的步驟;
[0046]用于當(dāng)檢測(cè)到進(jìn)行了內(nèi)存分配操作的日志事件項(xiàng)的已分配時(shí)間達(dá)到設(shè)定的閾值且沒有進(jìn)行內(nèi)存釋放操作時(shí),將所述日志事件項(xiàng)標(biāo)記為內(nèi)存泄漏事件項(xiàng)的步驟;
[0047]用于當(dāng)遍歷完日志文件中所有日志事件項(xiàng)時(shí),根據(jù)重復(fù)釋放錯(cuò)誤列表中的信息和哈希表中標(biāo)記的內(nèi)存泄漏事件項(xiàng),定位發(fā)生內(nèi)存泄漏的位置的步驟。
[0048]本實(shí)施方式中還可以采用其它是非判斷、邏輯判斷的工具來替換哈希表。本實(shí)施方式中,通過TCP通信協(xié)議,安裝VxWorks操作系統(tǒng)的工控機(jī)使用數(shù)據(jù)發(fā)送緩沖隊(duì)將日志信息發(fā)送到上位機(jī)PC,這樣分離了網(wǎng)絡(luò)發(fā)送和硬件的中斷,在控制端軟件接收模塊阻塞而導(dǎo)致網(wǎng)絡(luò)阻塞的情況下,不會(huì)影響中斷處理的速度或者定時(shí)輪詢的次數(shù)。
[0049]為了能夠從日志文件中分析并檢測(cè)出內(nèi)存泄漏,從日志文件中讀入日志事件項(xiàng),并對(duì)內(nèi)存的分配和釋放進(jìn)行對(duì)比。在遍歷日志文件的時(shí)候,檢查每個(gè)事件項(xiàng)的操作是分配還是釋放內(nèi)存。如果發(fā)現(xiàn)事件項(xiàng)是內(nèi)存分配操作,用內(nèi)存地址作為鍵值把事件項(xiàng)加入哈希表。如果發(fā)現(xiàn)事件項(xiàng)是內(nèi)存釋放操作,在哈希表中刪除對(duì)應(yīng)的內(nèi)存分配事件項(xiàng)。
[0050]如果在哈希表中沒有找到對(duì)應(yīng)的內(nèi)存分配事件項(xiàng),則說明檢測(cè)到了重復(fù)釋放錯(cuò)誤。因?yàn)樵诠1碇胁]有對(duì)應(yīng)內(nèi)存塊的申請(qǐng)操作,說明之前該內(nèi)存塊已被釋放,現(xiàn)在試圖釋放該內(nèi)存塊即發(fā)生了重復(fù)釋放操作。在程序中發(fā)生重復(fù)釋放錯(cuò)誤是十分危險(xiǎn)的,會(huì)破壞數(shù)據(jù)的完整性,甚至?xí)l(fā)生致命錯(cuò)誤。
[0051]當(dāng)一直遍歷日志文件直到文件末尾,任何已經(jīng)分配且沒被釋放的內(nèi)存記錄會(huì)仍然留在哈希表中。認(rèn)定這種情況即發(fā)生了內(nèi)存泄漏。進(jìn)一步地,因?yàn)樵谌罩拘畔⒅邪耸录l(fā)生的文件和行號(hào),可以從中分析出發(fā)生內(nèi)存泄漏事件的具體位置,這極大的方便了程序的調(diào)試工作。這個(gè)算法可以概括 為以下的偽代碼:
[0052]
【權(quán)利要求】
1.基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,它是基于安裝VxWorks操作系統(tǒng)的工控機(jī)和上位機(jī)實(shí)現(xiàn)的,其特征在于,所述工控機(jī)內(nèi)嵌入有工控機(jī)軟件,所述工控機(jī)軟件的工作過程包括如下步驟:用于調(diào)用函數(shù)LC_mal 1c O和函數(shù)LC_free()實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤,并以日志的形式記錄各事件項(xiàng)的內(nèi)存分配和內(nèi)存釋放的信息的步驟;函數(shù)LCjnallocO用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配,若返回一個(gè)有效的內(nèi)存地址,則將動(dòng)態(tài)內(nèi)存分配信息輸出到日志文件,若返回一個(gè)無效的內(nèi)存地址,則不做任何日志操作;函數(shù)LC_free()用于對(duì)指定的內(nèi)存釋放,若內(nèi)存釋放成功,則將動(dòng)態(tài)內(nèi)存釋放信息輸出到日志文件,如果內(nèi)存釋放失敗,則不做任何日志操作;用于將日志信息通過TCP通信協(xié)議并使用數(shù)據(jù)發(fā)送緩沖隊(duì)列發(fā)送到上位機(jī)的步驟;所述上位機(jī)內(nèi)嵌入有上位機(jī)軟件,所述上位機(jī)軟件包括如下步驟:用于從日志文件中讀入日志信息,遍歷日志信息中的每個(gè)日志事件項(xiàng),并檢查讀入的每個(gè)日志事件項(xiàng)是否進(jìn)行了內(nèi)存分配操作或者內(nèi)存釋放操作的步驟;用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存分配操作時(shí),將所述日志事件項(xiàng)的內(nèi)存地址作為鍵值加入哈希表的步驟;用于當(dāng)讀入的日志事 件項(xiàng)進(jìn)行了內(nèi)存釋放操作時(shí),判斷哈希表中是否存在所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;用于當(dāng)哈希表中存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),在哈希表中刪除所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的步驟;用于當(dāng)哈希表中不存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),將所述日志事件項(xiàng)及相應(yīng)信息加入到重復(fù)釋放錯(cuò)誤列表中的步驟;用于當(dāng)檢測(cè)到進(jìn)行了內(nèi)存分配操作的日志事件項(xiàng)的已分配時(shí)間達(dá)到設(shè)定的閾值且沒有進(jìn)行內(nèi)存釋放操作時(shí),將所述日志事件項(xiàng)標(biāo)記為內(nèi)存泄漏事件項(xiàng)的步驟;用于當(dāng)遍歷完日志文件中所有日志事件項(xiàng)時(shí),根據(jù)重復(fù)釋放錯(cuò)誤列表中的信息和哈希表中標(biāo)記的內(nèi)存泄漏事件項(xiàng),定位發(fā)生內(nèi)存泄漏的位置的步驟。
2.根據(jù)權(quán)利要求1所述的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,其特征在于,它還包括:通過宏定義的方式,改寫內(nèi)存分配函數(shù)mallocO獲得函數(shù)LC_malloc O的步驟;通過宏定義的方式,改寫內(nèi)存釋放函數(shù)free O獲得函數(shù)LC_free O的步驟。
3.根據(jù)權(quán)利要求1所述的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)方法,其特征在于,所述函數(shù)LC_mal1c O用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配為:函數(shù)LCjnallocO用于根據(jù)物理塊鏈表中的參數(shù)進(jìn)行內(nèi)存分配;所述函數(shù)LC_free O用于對(duì)指定的內(nèi)存釋放為:函數(shù)LC_free()用于對(duì)物理塊鏈表中指定的內(nèi)存釋放;所述物理塊鏈表用于存儲(chǔ)所有內(nèi)存塊的狀態(tài)和連接所有物理位置相臨的已分配內(nèi)存塊和未分配內(nèi)存塊。
4.基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)裝置,它是基于安裝VxWorks操作系統(tǒng)的工控機(jī)和上位機(jī)實(shí)現(xiàn)的,其特征在于,所述工控機(jī)包括如下裝置:用于調(diào)用函數(shù)LCjnallocO和函數(shù)LC_free()實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存的跟蹤,并以日志的形式記錄各事件項(xiàng)的內(nèi)存分配和內(nèi)存釋放的信息的裝置;函數(shù)LCjnallocO用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配,若返回一個(gè)有效的內(nèi)存地址,則將動(dòng)態(tài)內(nèi)存分配信息輸出到日志文件,若返回一個(gè)無效的內(nèi)存地址,則不做任何日志操作;函數(shù)LC_free()用于對(duì)指定的內(nèi)存釋放,若內(nèi)存釋放成功,則將動(dòng)態(tài)內(nèi)存釋放信息輸出到日志文件,如果內(nèi)存釋放失敗,則不做任何日志操作;用于將日志信息通過TCP通信協(xié)議并使用數(shù)據(jù)發(fā)送緩沖隊(duì)列發(fā)送到上位機(jī)的裝置;所述上位機(jī)包括如下裝置:用于從日志文件中讀入日志信息,遍歷日志信息中的每個(gè)日志事件項(xiàng),并檢查讀入的每個(gè)日志事件項(xiàng)是否進(jìn)行了內(nèi)存分配操作或者內(nèi)存釋放操作的裝置;用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存分配操作時(shí),將所述日志事件項(xiàng)的內(nèi)存地址作為鍵值加入哈希表的裝置;用于當(dāng)讀入的日志事件項(xiàng)進(jìn)行了內(nèi)存釋放操作時(shí),判斷哈希表中是否存在所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的裝置;用于當(dāng)哈希表中存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),在哈希表中刪除所述日志事件項(xiàng)對(duì)應(yīng)的內(nèi)存地址的裝置;用于當(dāng)哈希表中不存在內(nèi)存釋放操作的日志事件項(xiàng)的內(nèi)存地址時(shí),將所述日志事件項(xiàng)及相應(yīng)信息加入到重復(fù)釋 放錯(cuò)誤列表中的裝置;用于當(dāng)檢測(cè)到進(jìn)行了內(nèi)存分配操作的日志事件項(xiàng)的已分配時(shí)間達(dá)到設(shè)定的閾值且沒有進(jìn)行內(nèi)存釋放操作時(shí),將所述日志事件項(xiàng)標(biāo)記為內(nèi)存泄漏事件項(xiàng)的裝置;用于當(dāng)遍歷完日志文件中所有日志事件項(xiàng)時(shí),根據(jù)重復(fù)釋放錯(cuò)誤列表中的信息和哈希表中標(biāo)記的內(nèi)存泄漏事件項(xiàng),定位發(fā)生內(nèi)存泄漏的位置的裝置。
5.根據(jù)權(quán)利要求1所述的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)裝置,其特征在于,它還包括:通過宏定義的方式,改寫內(nèi)存分配函數(shù)mallocO獲得函數(shù)LC_malloc O的裝置;通過宏定義的方式,改寫內(nèi)存釋放函數(shù)freeO獲得函數(shù)LC_free O的裝置。
6.根據(jù)權(quán)利要求1所述的基于VxWorks操作系統(tǒng)的動(dòng)態(tài)內(nèi)存泄漏檢測(cè)裝置,其特征在于,所述函數(shù)LC_mal1c O用于根據(jù)用戶需求內(nèi)存大小的參數(shù)進(jìn)行內(nèi)存分配為:函數(shù)LCjnallocO用于根據(jù)物理塊鏈表中的參數(shù)進(jìn)行內(nèi)存分配;所述函數(shù)LC_free O用于對(duì)指定的內(nèi)存釋放為:函數(shù)LC_free()用于對(duì)物理塊鏈表中指定的內(nèi)存釋放;所述物理塊鏈表用于存儲(chǔ)所有內(nèi)存塊的狀態(tài)和連接所有物理位置相臨的已分配內(nèi)存塊和未分配內(nèi)存塊。
【文檔編號(hào)】G06F11/36GK103455424SQ201310428609
【公開日】2013年12月18日 申請(qǐng)日期:2013年9月18日 優(yōu)先權(quán)日:2013年9月18日
【發(fā)明者】陳興林, 劉川, 楊天博, 劉楊 申請(qǐng)人:哈爾濱工業(yè)大學(xué)