麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

一種內存管理方法及設備與流程

文檔序號:11154641閱讀:505來源:國知局
一種內存管理方法及設備與制造工藝

本公開涉及計算機技術領域,具體地,涉及一種內存管理方法及設備。



背景技術:

內存泄漏是應用程序中很常見的問題之一。現在隨著計算機科學的發展,很多高級編程語言采用動態內存垃圾回收機制,編程語言虛擬機自動管理內存,這就大大減少了內存泄漏的問題。但是對于C/C++語言,由于其具有適用于嵌入式系統開發、性能高、可靈活掌握內存等特點,依然有著不可替代性。C/C++語言具有指針引用的特點,應用程序申請的內存經過多重引用,容易出現內存泄露的情況,而C/C++語言程序沒有內存垃圾回收機制,需要用戶手動管理內存,即C/C++應用程序的代碼需要手動控制內存申請和釋放。

目前已經有了一些分析內容泄漏的工具,即內存分析程序。但這些內存分析程序,一般是運行在X86體系結構的主機上,不適用于PowerPC,MIPS,ARM等各種嵌入式處理器環境,導致嵌入式環境內存泄漏問題調試很困難。



技術實現要素:

為克服相關技術中存在的問題,本公開提供一種內存管理方法及設備。

根據本公開實施例的第一方面,提供一種內存管理方法,包括:

接收來自應用程序的內存調用請求;

根據所述內存調用請求,從LD_PRELOAD環境變量所指定的動態庫調用相應的API來進行內存調用;以及

記錄與所述內存調用請求相關的信息,所述內存調用請求相關的信息包含所述內存調用請求所申請的內存大小及所述應用程序的調用函數的地址。

根據本公開實施例的第二方面,提供一種內存管理裝置,包括:

接收單元,用于接收來自應用程序的內存調用請求;

動態庫確定單元,用于根據所述內存調用請求,從LD_PRELOAD環境變量所指定的動態庫調用相應的API來進行內存調用;以及

記錄單元,用于記錄與所述內存調用請求相關的信息,所述內存調用請求相關的信息包含所述內存調用請求所申請的內存大小及所述應用程序的調用函數的地址。

本公開的實施例提供的技術方案可以包括以下有益效果:LD_PRELOAD環境變量所指定的動態庫提供了C語言內存管理函數常用的API的替換函數,這些替換函數在實際名稱及功能方面與常規GlibC的內存申請API是一樣的,只是在其中增加了有關與記錄與所述內存調用請求相關的信息,從而無需修改應用程序,僅需在啟動應用程序的腳本中使用LD_PERLOAD環境變量指定動態庫,之后使用該動態庫內的含內存調用請求相關信息記錄功能的代碼的API來替代C語言內存管理函數的常用內存調用API從而應用程序在進行內存調用時,既可以實現內存調用或分配,又可記錄與該內存調用相關的信息,達到內存調用及管理的目的。此外,本公開實施例的動態庫是充分地利用了Glibc的基礎特性,可移植性較強,示例性地,可以完整地移植到各種嵌入式平臺,且在交叉編譯過程中不會出現問題,實現有效移植。

應當理解的是,以上的一般描述和后文的細節描述僅是示例性和解釋性的,并不能限制本公開。

附圖說明

附圖是用來提供對本公開的進一步理解,并且構成說明書的一部分,與下面的具體實施方式一起用于解釋本公開,但并不構成對本公開的限制。在附圖中:

圖1為本公開一實施例提供的內存管理方法的流程圖;

圖2A為相關技術中應用程序對于內存申請API的調用方式的示意圖;

圖2B為本公開中應用程序對于內存申請API的調用方式的示意圖;

圖3為本公開一實施例的內存申請流程圖;

圖4為本公開另一實施例的內存管理方法的流程圖;

圖5為本公開一實施例提供的內存管理設備的結構框圖;以及

圖6為本公開另一實施例提供的內存管理設備的結構框圖。

具體實施方式

這里將詳細地對示例性實施例進行說明,其示例表示在附圖中。下面的描述涉及附圖時,除非另有表示,不同附圖中的相同數字表示相同或相似的要素。以下示例性實施例中所描述的實施方式并不代表與本公開相一致的所有實施方式。相反,它們僅是與如所附權利要求書中所詳述的、本公開的一些方面相一致的裝置和方法的例子。

以下結合附圖對本公開提供的內存管理方法及設備的具體實施方式進行詳細說明。應當理解的是,此處所描述的具體實施方式僅用于說明和解釋本公開,并不用于限制本公開。

圖1為本公開一實施例提供的內存管理方法的流程圖。如圖1所示,本公開一實施例提供了一種內存管理方法,該方法包括:

步驟S110,接收來自應用程序的內存調用請求。

在本步驟中,內存調用請求可以包括應用程序的標識符(例如,應用程序的名稱、地址等)、請求調用的內存大小(例如,請求調用128字節的內存)。

步驟S120,根據內存調用請求,從LD_PRELOAD環境變量所指定的動態庫調用相應的API來進行內存調用。

LD_PRELOAD是個環境變量,它可以影響應用程序運行時的鏈接(Runtime linker),允許用戶定義在程序運行前優先加載的動態庫(或者動態鏈接庫),從而可以有選擇性的載入不同動態鏈接庫中的相同函數。通過LD_PRELOAD,可以在應用程序和其動態庫(或者動態鏈接庫)的中間加載別的動態庫(或者動態鏈接庫),甚至覆蓋正常的函數庫。例如,在本步驟中,可以自定義的例如C語言內存管理函數常用的malloc、calloc、realloc、free等函數,并將自定義的內存管理函數編譯成動態庫,通過LD_PRELOAD在應用程序運行前優先加載自定義的內存管理函數(或者內存申請API),則在應用程序運行過程中可以調用該自定義的內存管理函數。

在發明實施例中,自定義的內存管理函數(或者內存申請API)在實際名稱及功能方面與常規GlibC的內存管理函數(或者內存申請API)是一樣的,但自定義的內存管理函數(或者內存申請API)增加了用于記錄與內存調用請求相關的信息,因此,在通過該自定義的內存管理函數進行內存申請時,可以記錄內存調用的相關信息,例如內存大小、應用程序名稱、應用程序的調用函數地址等等。因此,無需修改應用程序,即可實現內存記錄和內存調試。

通過LD_PRELOAD加載內存管理函數動態庫,可以加載自定義的或者功能、效果上更優的函數。在運行應用程序的腳本過程中使用LD_PERLOAD環境變量指定動態庫,以調用自定義的內存管理函數,將自定義的內存管理函數替代C語言內存管理函數的常用內存管理函數(例如,malloc,calloc,realloc,free等),即可以實現內存調用或分配,且可記錄與該內存調用相關的信息,達到內存調用及管理的目的。此外,通過LD_PRELOAD加載動態庫實現內存調用,可以方便地對動態庫中的內存管理函數優化或者增加調試,可以根據應用需求靈活地修改動態庫中的內存管理函數。

為了本領域技術人員能夠更清楚、準確地理解本發明實施例的技術方案,下面通過附圖及相關描述對本發明實施例、現有技術的實施例進一步說明。

圖2A為相關技術中應用程序對于內存申請API的調用方式的示意圖,圖2B為本公開中應用程序對于內存申請API的調用方式的示意圖。如圖2A所示,相關技術中,在接收到來自應用程序的內存調用請求時,直接對Glibc庫中的內存申請API(內存管理函數)進行調用,例如Glibc庫中提供的常用的malloc,calloc,realloc,free等常用內存申請API。如圖2B所示,在接收到來自應用程序的內存調用請求時,可以通過LD_PRELOAD環境變量加載指定的動態庫,該動態庫可以提供自定義的內存管理函數(或者內存申請API)例如malloc,calloc,realloc,free等,從而從動態庫調用自定義的內存管理函數,實現內存調用。本公開實施例的動態庫是充分地利用了Glibc的基礎特性,可移植性較強,示例性地,可以完整地移植到各種嵌入式平臺,且在交叉編譯過程中不會出現問題,實現有效移植。

步驟S130,記錄與內存調用請求相關的信息,其中,內存調用請求相關的信息包含內存調用請求所申請的內存大小及應用程序的調用函數的地址。

當然本公開并不限于此,在本步驟中還可記錄與應用程序的調用函數的名稱和/或其他希望記錄的與內存調用請求相關的信息。

圖3為本公開一實施例的內存申請流程圖。為了便于后續敘述,對于本公開中的內存申請API(或者內存管理函數),敘述時增加“my_”前綴,比如my_malloc函數,其實指的是本公開內存管理動態庫中的malloc函數;my_free函數,指的是本公開動態庫中的free函數。

如圖3所示,以調用my_malloc函數申請內存為例對本公開進行了示例性說明。在應用程序發起內存調用請求時,可以通過LD_PRELOAD環境變量所指定的動態庫調用內存管理函數,例如調用動態庫中的my_malloc函數。在本公開一實施例中,通過調用my_malloc函數為應用程序申請內存時,該my_malloc函數會為所申請的內存增加特定的頭部信息和尾部信息,其中,頭部信息和尾部信息可以用于在內存調試過程中檢測內存是否越界,以及記錄應用程序本次申請的內存的大小、應用程序中調用內存的調用函數的地址等,從而以用于管理應用程序申請內存的記錄。

根據本公開一實施例,所分配的內存包含設置于其頭部的頭部魔術字及設置于其尾部的尾部魔術字,示例性地,可以通過動態庫中的自定義的內存管理函數對分配的內存設置,以設置該內存的頭部魔術字和尾部魔術字。

示例性地,my_malloc函數通過對以下結構體進行設置,以實現內存調用、內存調用信息記錄等,以用于管理應用程序申請內存的記錄。

1、頭部信息

2、尾部信息

如圖3所示,如果應用程序要申請128字節的內存,則其需執行以下操作:

a)應用程序通過LD_PRELOAD環境變量所指定的動態庫調用my_malloc函數以申請128字節的內存;

b)my_malloc函數實際申請大小為(128+MALLOC_HEADER+MALLOC_TAILER)大小的內存,即申請的內存大小除了應用程序申請的內存的大小外,還包括頭部信息和尾部信息所占用的內存空間的大小;

c)my_malloc函數對MALLOC_HEADER和MALLOC_TAILER結構體進行設置,設置動作包括:記錄應用程序本次申請的內存大小128字節、記錄應用程序中的本次申請內存的調用函數的地址、設置內存頭部魔術字和內存尾部魔術字;

d)my_malloc函數返回申請的實際應用程序申請的內存,即如如圖4所示的MALLOC_HEADER后面的128字節。

需要說明的是,在上述my_malloc函數對MALLOC_HEADER和MALLOC_TAILER設置時,一個關鍵的步驟就是如何獲得應用程序中調用my_malloc函數的調用者函數是哪個,這也是內存調試中最重要的元素。在本公開一實施例中,可以利用Glibc庫提供的builtin_return_address內置函數,得到my_malloc函數的調用者的函數地址(16進制格式),并可由此獲得my_malloc函數的調用者的函數名稱。

圖4為本公開另一實施例的內存管理方法的流程圖。如圖4所示的本公開另一實施例的內存管理方法還包含以下步驟:

步驟S410,接收來自應用程序的內存調用請求。

例如,該內存調用請求可請求調用128字節的內存。本步驟與前述實施例中的步驟S110的原理、實現過程及效果相同,為了簡潔在此不再贅述。

步驟S420,根據內存調用請求,從LD_PRELOAD環境變量所指定的動態庫調用相應的API來進行內存調用。

本步驟與前述實施例中的步驟S120的原理、實現過程及效果相同,為了簡潔在此不再贅述。

步驟S430,記錄與內存調用請求相關的信息,內存調用請求相關的信息包含內存調用請求所申請的內存大小及應用程序的調用函數的地址。

當然本公開并不限于此,還可記錄與應用程序的調用函數的名稱和/或其他希望記錄的與內存調用請求相關的信息。

本步驟與前述實施例中的步驟S130的原理、實現過程及效果相同,為了簡潔在此不再贅述。

S440,通過哈希表管理內存調用請求相關的信息,其中,哈希表的任一表項包括應用程序的內存申請統計及應用程序的調用函數的地址的對應關系。

其中,可通過哈希表管理內存調用請求相關的信息,例如管理應用程序中本次調用內存的調用者函數的地址,管理應用程序的內存申請統計。示例性地,為了管理應用程序的內存申請統計,建立一個哈希表,哈希表的被哈希的關鍵字字段為應用程序中本次調用內存的調用者函數的地址,哈希表的內容為該調用者函數申請內存的總統計。

在一個實施例中,哈希表管理可包括以下操作:在接收到來自應用程序的內存調用請求時,根據應用程序的調用函數(調用者函數)的地址在哈希表內查找,以確定在哈希表中是否存儲有應用程序的調用函數的地址。當哈希表存儲有應用程序的調用函數的地址時,在對應表項的內存申請統計加入本次申請的內存大小。

在另一個實施例中,在接收到來自應用程序的內存釋放請求時,根據應用程序的調用函數的地址在哈希表內查找,以確定在哈希表中是否存儲有應用程序的調用函數的地址;當哈希表存儲有應用程序的調用函數的地址時,從對應表項的內存申請統計減去本次釋放的內存大小。如果減去本次釋放的內存大小之后對應表項的內存申請統計為零,則可刪除該表項。

S450,遍歷所哈希表,獲取內存調用請求相關的信息,以進行內存泄漏調試。

用戶可通過該遍歷該哈希表以獲取應用程序申請內存的全部信息。通過遍歷內存申請管理的哈希表,可將申請內存的應用程序的調用函數的地址按照該函數申請總內存的大小從大到小排序,從而可快速地獲取應用程序申請內存的全部信息,進而可以對應用程序的內存進行調試,避免內存泄漏問題出現。通過遍歷哈希表,可以隨時輸出打印應用程序的內存使用信息,使內存調試更為靈活方便。

圖5為本公開一實施例提供的內存管理設備的結構框圖。如圖5所示,本公開一實施例還提供一種內存管理設備,該設備包括:接收單元,用于接收來自應用程序的內存調用請求;動態庫確定單元,用于根據內存調用請求,從LD_PRELOAD環境變量所指定的動態庫調用相應的API來進行內存調用;以及記錄單元,用于記錄與內存調用請求相關的信息,內存調用請求相關的信息包含內存調用請求所申請的內存大小及應用程序的調用函數的地址。

可選的,所分配的內存包含設置于其頭部的頭部魔術字及設置于其尾部的尾部魔術字。

圖6為本公開另一實施例提供的內存管理設備的結構框圖。與圖5所示的結構框圖不同之處在于,該圖6所示的設備還包括:管理單元,用于通過哈希表管理內存調用請求相關的信息,哈希表的任一表項包括應用程序的內存申請統計及應用程序的調用函數的地址的對應關系。

可選的,管理單元包括:第一確定模塊,用于在接收到來自應用程序的內存調用請求時,根據應用程序的調用函數的地址在哈希表內查找,以確定在哈希表中是否存儲有應用程序的調用函數的地址;內存統計模塊,用于當哈希表存儲有應用程序的調用函數的地址時,在對應表項的內存申請統計加入本次申請的內存大小;或者,第二確定模塊,用于在接收到來自應用程序的內存釋放請求時,根據應用程序的調用函數的地址在哈希表內查找,以確定在哈希表中是否存儲有應用程序的調用函數的地址;內存釋放模塊,用于當哈希表存儲有應用程序的調用函數的地址時,從對應表項的內存申請統計減去本次釋放的內存大小。

可選的,該內存管理設備還包括:遍歷單元,遍歷哈希表,獲取內存調用請求相關的信息,以進行內存泄漏調試。

關于上述實施例中的裝置,其中各個模塊執行操作的具體方式已經在有關該方法的實施例中進行了詳細描述,此處將不做詳細闡述說明。

雖然上述以嵌入式系統的一般運行環境Linux操作系統以及基本的C語言運行環境GLibC C語言庫為例對本公開進行了示例性說明,但本公開并不限于此,本公開可適用于任何其他可運行本公開的思想的環境中。

本領域技術人員可以理解實現上述實施例方法中的全部或部分步驟是可以通過程序來指令相關的硬件來完成,該程序存儲在一個存儲介質中,包括若干指令用以使得一個(可以是單片機,芯片等)或處理器(processor)執行本公開各個實施例所述方法的全部或部分步驟。而前述的存儲介質包括:U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質。

以上結合附圖詳細描述了本公開的優選實施方式,但是,本公開并不限于上述實施方式中的具體細節,在本公開的技術構思范圍內,可以對本公開的技術方案進行多種簡單變型,這些簡單變型均屬于本公開的保護范圍。

另外需要說明的是,在上述具體實施方式中所描述的各個具體技術特征,在不矛盾的情況下,可以通過任何合適的方式進行組合。為了避免不必要的重復,本公開對各種可能的組合方式不再另行說明。

本領域技術人員在考慮說明書及實踐這里公開的發明后,將容易想到本公開的其它實施方案。本公開旨在涵蓋本公開的任何變型、用途或者適應性變化,這些變型、用途或者適應性變化遵循本公開的一般性原理并包括本公開未公開的本技術領域中的公知常識或慣用技術手段。說明書和實施例僅被視為示例性的,本公開的真正范圍和精神由下面的權利要求指出。

應當理解的是,本公開并不局限于上面已經描述并在附圖中示出的精確結構,并且可以在不脫離其范圍進行各種修改和改變。本公開的范圍僅由所附的權利要求來限制。

當前第1頁1 2 3 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 信阳市| 鲁山县| 肥城市| 革吉县| 洪泽县| 孙吴县| 庐江县| 周宁县| 香港 | 汶上县| 元江| 五华县| 佛学| 凤山县| 井冈山市| 乐亭县| 天门市| 洮南市| 永德县| 金乡县| 蛟河市| 惠州市| 平谷区| 郑州市| 陇南市| 灯塔市| 双牌县| 伊吾县| 阿拉善左旗| 盐亭县| 嘉峪关市| 木兰县| 佛山市| 西昌市| 长白| 沁源县| 调兵山市| 农安县| 龙江县| 张家港市| 临武县|