本申請提供了一種內存操作記錄的處理方法及裝置,所述方法包括:工作線程模塊將內存操作記錄寫入預先設置的內存操作記錄池中;所述內存操作記錄包括:當前內存分配記錄和/或內存釋放記錄;內存操作記錄讀取線程模塊從所述內存操作記錄池中讀取內存操作記錄,并判斷所述內存操作記錄是否為內存分配記錄,如果是,則將所述內存分配記錄插入至所述內存操作記錄映射表中,如果否,則從所述內存操作記錄映射表中刪除該條內存釋放記錄的內存地址指示的映射關系。本申請實施例通過預先分配內存操作記錄池,可以解決內存操作記錄的完整性較低以及被測程序性能降低導致的系統資源開銷較大的問題。
【技術實現步驟摘要】
本申請涉及計算機
,特別涉及一種內存操作記錄的處理方法及裝置。
技術介紹
在軟件開發過程中常常產生一些內存泄漏現象,例如,在程序運行中向操作系統申請了一塊內存,但在使用完成后沒有釋放,導致這塊內存既不在操作系統的空閑內存池中,也不在當前程序的使用中,這樣就會使得可用內存變少,而開發出的軟件在使用中也往往導致過高的內存占用和性能下降。 為了檢測內存泄漏現象,就需要跟蹤程序中所有的內存分配,現有技術中有一種檢測內存泄露的方法,具體為開發一個動態鏈接庫(DLL),注入到待檢測的程序進程中,攔截(hook)所有的內存分配和內存釋放函數,使之對原始內存分配或釋放的調用可以被DLL截獲,進而可以在分配內存時,記錄下本次分配的內存地址、大小或調用堆棧等信息,并保存在一個合適的容器中;并當內存釋放時,根據被釋放的內存地址從容器中刪除相應的記錄。這樣就可以在需要檢查內存是否有泄漏時,查看留在容器中的內存記錄即可。但是在檢測內存泄漏過程中,“保存內存分配的信息到一個容器中”這個操作往往引起新的內存分配,因為保存一條記錄到一個容器中往往需要為這條記錄分配一塊新的內存。而新的內存分配也會被截獲并被記錄在容器中,于是又會導致另一次內存分配,以此類推,將會產生無限遞歸調用的現象,使程序堆棧溢出而崩潰。而為了解決無限遞歸調用的問題,現有技術在注入DLL對內存分配和釋放函數進行攔截時,采用導入地址表(IAT)的方式進行攔截(Hook),并排除本DLL,使之在本DLL中調用內存分配和釋放函數時始終會調用到原始的函數。由于本DLL未被攔截(hook),因此,在往容器中記錄內存操作記錄時,分配這條記錄的內存是調用的原始內存分配函數,這樣就不會引起遞歸調用。但是在Windows+VC平臺由于內存分配的復雜性,通常還需要使VC的幾個動態鏈接庫不被攔截才能正常工作。并且由于采用排除法來避免內存分配的遞歸調用,就會導致一些DLL未被攔截(hook),這樣記錄的內存操作記錄就不完整,無法獲得全部內存操作記錄。進一步的,由于攔截內存分配和內存釋放時直接進行內存操作記錄的插入或移除等操作,影響了被檢測程序的性能,也使得系統資源的開銷較大。并且,程序性能的下降,還可能會導致某些與當前運行程序的性能有關系的內存泄漏現象在低速運行時不會產生,從而不能及時被發現。總之,目前需要本領域技術人員迫切解決的一個技術問題就是如何能夠創新的提出一種內存操作記錄的處理方法,以解決現有技術中內存操作記錄的完整性較低以及被測程序性能降低而導致的系統資源開銷較大的問題。
技術實現思路
本申請所要解決的技術問題是提供一種內存操作記錄的處理方法,用以解決現有技術中內存操作記錄的完整性較低以及被測程序性能降低而導致的系統資源開銷較大的問題。本申請還提供了一種內存操作記錄的處理裝置,用以保證上述方法在實際中的實現及應用。為了解決上述問題,本申請公開了一種內存操作記錄的處理方法,所述方法應用于內存操作記錄的處理裝置,所述處理裝置包括內存操作記錄池、內存操作記錄讀取線程模塊、內存操作記錄映射表和多個工作線程模塊,所述內存操作記錄池用于存儲內存分配記錄,所述內存操作記錄映射表用于保存內存操作記錄與其涉及的內存地址之間的映射關系;該方法包括所述工作線程模塊將內存操作記錄寫入預先設置的內存操作記錄池中;所述內存操作記錄包括當前內存分配記錄和/或內存釋放記錄; 所述內存操作記錄讀取線程模塊從所述內存操作記錄池中讀取內存操作記錄,并判斷所述內存操作記錄是否為內存分配記錄,如果是,則將所述內存分配記錄插入至所述內存操作記錄映射表中,如果否,則從所述內存操作記錄映射表中刪除該條內存釋放記錄的內存地址指不的映射關系。本申請公開了一種內存操作記錄的處理裝置,該裝置包括內存操作記錄池、內存操作記錄讀取線程模塊、內存操作記錄映射表和多個工作線程模塊;其中,所述內存操作記錄池,用于存儲內存分配記錄;所述內存操作記錄映射表,用于保存內存操作記錄與其中的內存地址之間的映射關系;所述工作線程模塊,用于將內存操作記錄寫入預先設置的內存操作記錄池中;所述內存操作記錄包括內存分配記錄和/或內存釋放記錄;所述內存操作記錄讀取線程模塊包括讀取子模塊和第一判斷子模塊;所述讀取子模塊,用于從所述內存操作記錄池中讀取內存操作記錄;所述第一判斷子模塊,用于判斷所述內存操作記錄是否為內存分配記錄,如果是,則將所述內存分配記錄插入至所述內存操作記錄映射表中,如果否,則從所述內存操作記錄映射表中刪除該條內存釋放記錄的內存地址指示的映射關系。與現有技術相比,本申請包括以下優點在本申請中,通過預先分配緩存區作為內存操作記錄池,從而在對內存操作記錄池進行操作時,不會引起無限遞歸,因此不會影響被測程序的性能,并且,因為內存操作記錄都會在該內存操作記錄池中存儲,所以可以解決現有技術中內存操作記錄的完整性較低的問題,節約了系統資源開銷。進一步的,還能進行準確性較高的內存泄露檢測。當然,實施本申請的任一產品并不一定需要同時達到以上所述的所有優點。附圖說明為了更清楚地說明本申請實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其他的附圖。圖I是本申請實施例在實際應用中的一個結構框圖;圖2是本申請的一種內存操作記錄的處理方法實施例I的流程圖;圖3是本申請的方法實施例I中步驟201的流程圖;圖4是本申請的方法實施例I中步驟202的流程圖;圖5是本申請的一種內存操作記錄的處理方法實施例2的流程圖;圖6是本申請的一種內存操作記錄的處理裝置實施例I的結構框圖; 圖7是本申請的裝置實施例I中工作線程模塊604的結構框圖;圖8是本申請的裝置實施例I中讀取子模塊6021的結構框圖;圖9是本申請的一種內存操作記錄的處理裝置實施例2的結構框圖。具體實施例方式下面將結合本申請實施例中的附圖,對本申請實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本申請一部分實施例,而不是全部的實施例。基于本申請中的實施例,本領域普通技術人員所獲得的所有其他實施例,都屬于本申請保護的范圍。本申請可用于眾多通用或專用的計算裝置環境或配置中。例如個人計算機、服務器計算機、手持設備或便攜式設備、平板型設備、多處理器裝置、包括以上任何裝置或設備的分布式計算環境等等。本申請可以在由計算機執行的計算機可執行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執行特定任務或實現特定抽象數據類型的例程、程序、對象、組件、數據結構等等。也可以在分布式計算環境中實踐本申請,在這些分布式計算環境中,由通過通信網絡而被連接的遠程處理設備來執行任務。在分布式計算環境中,程序模塊可以位于包括存儲設備在內的本地和遠程計算機存儲介質中。本申請的主要思想之一可以包括,通過預先分配緩存區作為內存操作記錄池,并相應的采用專門的一個內存操作記錄讀取線程從所述內存操作記錄池中讀取記錄,從而在對內存操作記錄池進行操作時,不會引起無限遞歸,因此不會影響被測程序的性能,并且,因為內存操作記錄都會在該內存操作記錄池中存儲,所以可以解決現有技術中內存操作記本文檔來自技高網...
【技術保護點】
一種內存操作記錄的處理方法,其特征在于,所述方法應用于內存操作記錄的處理裝置,所述處理裝置包括:內存操作記錄池、內存操作記錄讀取線程模塊、內存操作記錄映射表和多個工作線程模塊,所述內存操作記錄池用于存儲內存分配記錄,所述內存操作記錄映射表用于保存內存操作記錄與其涉及的內存地址之間的映射關系;該方法包括:所述工作線程模塊將內存操作記錄寫入預先設置的內存操作記錄池中;所述內存操作記錄包括:當前內存分配記錄和/或內存釋放記錄;所述內存操作記錄讀取線程模塊從所述內存操作記錄池中讀取內存操作記錄,并判斷所述內存操作記錄是否為內存分配記錄,如果是,則將所述內存分配記錄插入至所述內存操作記錄映射表中,如果否,則從所述內存操作記錄映射表中刪除該條內存釋放記錄的內存地址指示的映射關系。
【技術特征摘要】
【專利技術屬性】
技術研發人員:唐紅兵,邵有石,
申請(專利權)人:阿里巴巴集團控股有限公司,
類型:發明
國別省市:
還沒有人留言評論。發表了對其他瀏覽者有用的留言會獲得科技券。