欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

本機(jī)堆分配的運(yùn)行時(shí)類型標(biāo)識的制作方法

文檔序號:6378530閱讀:238來源:國知局
專利名稱:本機(jī)堆分配的運(yùn)行時(shí)類型標(biāo)識的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及存儲器管理技術(shù),更具體地,涉及本機(jī)堆分配的運(yùn)行時(shí)類型標(biāo)識。
背景技術(shù)
存儲器管理包括根據(jù)請求將存儲器的各部分分配給各程序,以及當(dāng)程序不再需要所分配的存儲器時(shí)釋放該存儲器以供重新使用。對存儲器的低效或不正確的使用會降低程序性能或?qū)е鲁绦虮罎ⅰn愃频?,無法釋放已分配的存儲器或不正確地釋放存儲器會降低程序性能或?qū)е鲁绦虮罎ⅰPg(shù)語“垃圾回收”常被用來表示一種自動存儲器管理形式,其中垃圾回收器重新聲明不再是使用中的存儲器。垃圾回收是一種被頻繁用于虛擬機(jī)環(huán)境中的技術(shù)。與之相比,手動存儲器管理依賴于在程序中使用用于請求操作系統(tǒng)分配存儲器和取消分配未被使用的存儲器的指令。普遍使用的用于手動地管理存儲器的語言包括本機(jī)語言,諸如C和C++。手動存儲器管理會將幾個(gè)常見類的錯(cuò)誤引入程序中。例如,如果當(dāng)程序使用完所分配的存儲器部分時(shí)其沒有被釋放,則會發(fā)生存儲器泄露。存儲器泄露可以是相對無害的(例如,在短時(shí)運(yùn)行的程序中,其中程序結(jié)束時(shí)操作系統(tǒng)取消分配程序資源),或者如果存儲器泄露用盡了可用存儲器則會導(dǎo)致程序崩潰。即使存儲器泄露沒有用盡可用存儲器并且沒有導(dǎo)致程序崩潰,程序性能會被降低,因?yàn)槔缛鄙僮銐虻目捎么鎯ζ魇箶?shù)據(jù)被強(qiáng)制交換出到磁盤。當(dāng)分配的空間被釋放不止一次時(shí)或者如果釋放了指向未分配存儲器的指針,會發(fā)生另一種類型的存儲器管理錯(cuò)誤。這類錯(cuò)誤會損壞數(shù)據(jù)結(jié)構(gòu)或者會不正確地釋放后來已由另一程序構(gòu)造使用的部分存儲器。如果在存儲器被釋放后使用了指向被釋放的存儲器的指針,則接著會發(fā)生無法預(yù)料的結(jié)果。當(dāng)程序中的指令分配過多存儲器使得沒有剩余足夠的存儲器以供程序高效運(yùn)行時(shí),會發(fā)生存儲器過度使用。

發(fā)明內(nèi)容
可請求執(zhí)行中的本機(jī)程序的快照并且可提供對快照請求時(shí)所分配的用戶類型的存儲器分配統(tǒng)計(jì)。通過使用靜態(tài)調(diào)試信息和動態(tài)運(yùn)行時(shí)分配信息,活(live)存儲器堆分配可使用用戶類型信息來增強(qiáng)。用戶類型和堆信息可被用于計(jì)算存儲器分配的大小并聚集用戶類型實(shí)例的計(jì)數(shù)和大小。使用靜態(tài)調(diào)試信息,可計(jì)算和顯示引用圖,該引用圖顯示活實(shí)例中的對象的嵌套??商峁┰次募拿Q以及調(diào)用存儲器分配函數(shù)的指令的行號。提供發(fā)明內(nèi)容述以便以簡化形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標(biāo)識所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于限制所要求保護(hù)主題的范圍。


在附圖中圖1a示出了根據(jù)此處所公開的主題的各方面的捕捉相對虛擬地址(RVA)至類型信息的系統(tǒng)100的示例;圖1b示出了根據(jù)此處所公開的主題的各方面的將RVA映射成類型的表110的示例;圖1c示出了根據(jù)此處所公開的主題的各方面的捕捉運(yùn)行時(shí)存儲器分配信息的系統(tǒng)101的示例;圖1d示出了根據(jù)此處所公開的主題的各方面的將分配的實(shí)例的地址映射成調(diào)用存儲器分配函數(shù)的指令的虛擬地址的表134的示例;圖1e示出了根據(jù)此處所公開的主題的各方面的潛在的實(shí)例參考信息的表140的示例,其中潛在的實(shí)例參考中的一些已被標(biāo)識為非指針;圖1f示出了根據(jù)此處所公開的主題的各方面的包括類型信息的潛在的實(shí)例參考信息的表176的不例;圖2a示出了根據(jù)此處所公開的主題的各方面的計(jì)算目標(biāo)進(jìn)程的存儲器分配統(tǒng)計(jì)的的方法200的示例;圖2b示出了根據(jù)此處所公開的主題的各方面的目標(biāo)進(jìn)程的經(jīng)計(jì)算出的存儲器分配統(tǒng)計(jì)的的顯示230的示例;

圖3是根據(jù)本文所公開主題的各方面的計(jì)算環(huán)境的示例的框圖;以及圖4是根據(jù)此處所公開的主題的各方面的集成開發(fā)環(huán)境的示例的框圖。
具體實(shí)施方式
概覽用于用本機(jī)代碼編寫的程序的已知工具可提供諸如“在點(diǎn)A處,進(jìn)程B已分配了起始于地址D的C個(gè)字節(jié)的存儲器”之類的信息。然而,已知工具不能夠提供與所分配的存儲器塊相關(guān)聯(lián)的用戶類型信息。即,已知工具不能提供諸如“在點(diǎn)A處,進(jìn)程B已為用戶類型為F的對象的E個(gè)實(shí)例分配了起始于地址Dp…D1J^C個(gè)字節(jié)的存儲器”之類的信息。根據(jù)此處所描述的主題的各方面,提供了可將用戶類型信息與存儲器中特定位置處分配的存儲器塊相關(guān)聯(lián)的工具。信息可被聚集和概括,并被提供在顯示中。所提供的信息可幫助用戶確定多少存儲器被分配給哪些用戶類型。這進(jìn)而可幫助用戶診斷存儲器過度使用以及本機(jī)源代碼中的其它存儲器分配模式。想要用戶類型存儲器分配統(tǒng)計(jì)的本機(jī)源程序可被編譯以生成二進(jìn)制文件(例如,可執(zhí)行文件或動態(tài)鏈接庫)。根據(jù)此處所描述的主題的各方面,其執(zhí)行導(dǎo)致分配存儲器的二級制文件中的指令的相對虛擬地址(RVA)可被映射到該RVA處的指令所分配的實(shí)例的類型或與該類型相關(guān)聯(lián)。當(dāng)執(zhí)行該二級制文件時(shí),截取對存儲器分配的請求的程序模塊可被插入到二進(jìn)制文件正執(zhí)行于的目標(biāo)進(jìn)程中。所插入的程序模塊可截取對發(fā)生在目標(biāo)進(jìn)程內(nèi)的已知存儲器分配函數(shù)的調(diào)用。當(dāng)程序運(yùn)行及分配發(fā)生時(shí),可記錄調(diào)用存儲器分配函數(shù)的指令的虛擬地址(在此稱為調(diào)用點(diǎn))。新創(chuàng)建的實(shí)例的虛擬存儲器地址也可被記錄并被映射到調(diào)用了存儲器分配函數(shù)的指令的虛擬地址或與該虛擬地址相關(guān)聯(lián)。響應(yīng)于接收到對堆快照的請求,可通過走查與進(jìn)程相關(guān)聯(lián)的一個(gè)或多個(gè)堆來標(biāo)識目前為止在該進(jìn)程中所作出的所有存儲器分配。調(diào)用存儲器分配函數(shù)的每個(gè)指令的虛擬地址可以被轉(zhuǎn)換成RVA。這一 RVA可以被匹配于之前創(chuàng)建的(例如,在編譯期間)RVA/類型表中對應(yīng)的RVA,以確定在二級制文件的執(zhí)行期間所分配的實(shí)例的用戶類型。與所分配的實(shí)例的虛擬存儲器地址相關(guān)聯(lián)的實(shí)例的類型可通過將調(diào)用點(diǎn)(曾調(diào)用存儲器分配函數(shù)的指令的虛擬地址)轉(zhuǎn)換成其執(zhí)行導(dǎo)致分配存儲器的二級制文件中的指令的RVA來確定。為了將調(diào)用點(diǎn)轉(zhuǎn)換成RVA,進(jìn)程存儲器中加載二級制文件所位于的基地址可從調(diào)用點(diǎn)減去。與前一步驟(例如編譯步驟)中的匹配RVA相關(guān)聯(lián)的用戶類型可被分配給調(diào)用點(diǎn)。特定用戶類型的信息可被聚集、概括并顯示。所顯示的信息可包括類型、所分配的實(shí)例的總數(shù)以及特定類型的實(shí)例的經(jīng)聚集的大小、以及該類型的定義的位置。所顯示的信息可還包括一種類型的每個(gè)實(shí)例的分解、實(shí)例的大小、創(chuàng)建該實(shí)例的模塊、該實(shí)例的分配點(diǎn)、以及源文件的名稱以及分配該實(shí)例的指令的行號??商峁┟枋鲆藐P(guān)系的引用圖。引用圖信息可通過掃描進(jìn)程堆以查找潛在的指針來獲取,其中掃描通過查找并記錄所有的指針大小的字段來進(jìn)行??赏ㄟ^使用用來確定每個(gè)潛在指針的類型的靜態(tài)調(diào)試信息并且刪除非指針類型來刪除被記錄的非指針字段。即,根據(jù)此處所描述的主題的各方面,響應(yīng)于接收對快照的請求,進(jìn)程堆可被掃描以查找潛在的指針的實(shí)例。任何具有指針大小的長度的虛擬地址可被記錄??梢岳斫獾氖遣皇撬兄羔槾笮〉膶?shí)體都有可能是真正的指針。提供對象布局的符號調(diào)試信息可被用于移除不是指針的被記錄的指針大小的偏移。例如,假設(shè)程序包括對象Foo,其包括另一對象Bar。從編譯中產(chǎn)生的調(diào)試文件中獲取的對象Foo的布局可因此包括指向?qū)ο驜ar的指針。顯示對象Foo和Bar之間的嵌套關(guān)系的引用圖可隨后被顯示。本機(jī)堆分配的運(yùn)行時(shí)類型標(biāo)識圖1a示出了根據(jù)此處所公開的主題的各方面的捕捉RVA至類型匹配信息的系統(tǒng)100的示例。系統(tǒng)100的全部或某些部分可以駐留在諸如下面參考圖3所描述的計(jì)算機(jī)之類的一個(gè)或多個(gè)計(jì)算機(jī)上。系統(tǒng)100可在諸如參考圖4所描述的軟件開發(fā)計(jì)算機(jī)之類的軟件開發(fā)計(jì)算機(jī)上執(zhí)行。系統(tǒng)100或其部分可在諸如IDE 104之類的IDE內(nèi)執(zhí)行或者在IDE之外執(zhí)行。IDE可以是諸如參考圖4所描述的IDE之類的IDE,或者可以是支持本機(jī)語言的任何其它IDE。系統(tǒng)100的全部或部分可被實(shí)現(xiàn)為插件或擴(kuò)展。系統(tǒng)100可包括諸如計(jì)算機(jī)102之類的一個(gè)或多個(gè)計(jì)算機(jī)或計(jì)算設(shè)備,其包括諸如處理器142等之類的一個(gè)或多個(gè)處理器、諸如存儲器144之類的存儲器、和/或諸如映射模塊116之類的一個(gè)或多個(gè)模塊。系統(tǒng)100可還包括諸如編譯器106之類的編譯器。編譯器106可以是C或C++編譯器或其中實(shí)現(xiàn)手動存儲器分配的任何其他本機(jī)編程語言編譯器。根據(jù)此處所公開的主題的各方面,映射模塊11 6可以是編譯器106的一部分或者可以是獨(dú)立的模塊(未示出)。映射模塊116可收集諸如RVA/類型信息110之類的RVA至類型信息。映射模塊116可在源程序114的編譯期間將諸如RVA/類型信息110之類的RVA至類型信息收集到動態(tài)鏈接庫或諸如可執(zhí)行文件108之類的可執(zhí)行文件中??商鎿Q地,映射模塊116可在編譯進(jìn)程之外執(zhí)行。當(dāng)編譯進(jìn)行時(shí),可收集諸如調(diào)試信息112之類的調(diào)試信息。調(diào)試信息可包括程序模塊中的所有符號的列表。調(diào)試信息可包括符號的地址、其中聲明了該符號的源文件的名稱以及其中聲明了該符號的源文件中的行的行號。調(diào)試信息可以存儲在程序數(shù)據(jù)庫文件中,這是一種由微軟公司開發(fā)的、用于存儲關(guān)于程序的、通常具有.Pdb擴(kuò)展名的調(diào)試信息的專有文件格式??商鎿Q地,調(diào)試信息可以存儲在二級制文件本身中。
典型編譯器的前端執(zhí)行語法和語義檢查并報(bào)告錯(cuò)誤。前端可生成源代碼的中間表示或IR以供中間端處理。在中間端,可進(jìn)行優(yōu)化轉(zhuǎn)換并生成第二 IR。后端通常將來自中間端的IR轉(zhuǎn)換成匯編碼。在前端編譯期間,通常創(chuàng)建抽象語法樹(AST)。AST是源代碼的抽象語法結(jié)構(gòu)的樹形表示,其中樹的每個(gè)節(jié)點(diǎn)表示源代碼中的一個(gè)構(gòu)造。根據(jù)此處所公開的主題的各方面,后端代碼生成器可使用AST來將存儲器分配指令的相對虛擬地址(RVA)映射到那些指令所分配的類型。因此,將RVA映射成類型的信息可由編譯器在編譯期間計(jì)算,并且被包括作為程序的調(diào)試數(shù)據(jù)庫的一部分(例如,在.PDB文件中或在二進(jìn)制文件本身中)。當(dāng)在運(yùn)行時(shí)發(fā)生存儲器分配時(shí),這一信息允許基于地址的類型查找,如以下更全面描述的。例如,在以下的C++代碼中,創(chuàng)建從編譯器生成的匯編指令的RVA到類型Foo的
(靜態(tài))符號調(diào)試信息的映射。
權(quán)利要求
1.一種系統(tǒng),包括 計(jì)算設(shè)備的至少一個(gè)處理器; 所述計(jì)算設(shè)備的存儲器;以及 加載到所述存儲器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 響應(yīng)于接收對堆快照的請求,通過以下步驟提供本機(jī)語言程序的存儲器分配統(tǒng)計(jì)接收將所述本機(jī)語言程序的二進(jìn)制文件中的指令的相對虛擬地址映射到用戶類型的信息,所述指令在被執(zhí)行時(shí)請求存儲器分配; 將進(jìn)程中執(zhí)行的指令的虛擬存儲器地址映射到所述指令所請求的存儲器分配的實(shí)例的地址; 將所述指令的虛擬存儲器地址匹配于所述指令的對應(yīng)的相對虛擬地址; 將被映射到對應(yīng)的相對虛擬地址的用戶類型分配給所述指令的虛擬存儲器地址;以及 聚集用戶類型實(shí)例計(jì)數(shù)和大小。
2.如權(quán)利要求1所述的系統(tǒng),其特征在于,還包括 加載到所述存儲器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 通過以下步驟顯示引用圖 掃描所述進(jìn)程的進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及 顯示所述引用圖中的存儲器分配實(shí)例之間的關(guān)系。
3.如權(quán)利要求1所述的系統(tǒng),其特征在于,還包括 加載到所述存儲器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 在編譯期間將所述本機(jī)語言程序的二進(jìn)制文件中的指令的相對虛擬地址映射到所述用戶類型。
4.如權(quán)利要求2所述的系統(tǒng),其特征在于,在編譯期間生成的符號調(diào)試信息提供實(shí)例的布局,其中所述布局被用于移除被記錄的指針大小的、但不是指針的字段。
5.如權(quán)利要求2所述的系統(tǒng),其特征在于,用戶類型和進(jìn)程堆信息被用于計(jì)算存儲器分配的大小并聚集用戶類型實(shí)例計(jì)數(shù)和大小。
6.一種方法,包括 將本機(jī)語言程序的指令的相對虛擬地址映射到用戶類型,所述指令調(diào)用存儲器分配函數(shù); 將追蹤模塊插入目標(biāo)進(jìn)程,所述目標(biāo)進(jìn)程在計(jì)算設(shè)備的處理器上執(zhí)行所述指令; 截取對所述存儲器分配函數(shù)的調(diào)用并記錄所述存儲器分配函數(shù)的返回地址; 記錄由所述存儲器分配函數(shù)在存儲器中分配的實(shí)例的地址; 將所述返回地址轉(zhuǎn)換成對應(yīng)的相對虛擬地址; 將所記錄的返回地址分配給所述用戶類型;以及 提供聚集的存儲器分配的大小以及用戶類型實(shí)例計(jì)數(shù)和大小。
7.如權(quán)利要求6所述的方法,其特征在于,還包括 通過以下步驟顯示引用圖 掃描所述實(shí)例的進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及顯示所述弓I用圖中的實(shí)例之間的關(guān)系。
8.如權(quán)利要求6所述的方法,其特征在于,通過走查抽象語法樹以及將相對虛擬地址/用戶類型映射信息寫入與編譯期間生成的靜態(tài)調(diào)試文件分開的文件中,所述指令的相對虛擬地址到用戶類型的映射與編譯分開地進(jìn)行。
9.如權(quán)利要求6所述的方法,其特征在于,存儲器分配和用戶類型實(shí)例計(jì)數(shù)和大小按照類型、模塊、源文件、名字空間或類名來提供。
10.一種包括當(dāng)執(zhí)行時(shí)使計(jì)算設(shè)備的至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀存儲介質(zhì) 接收靜態(tài)調(diào)試信息,所述靜態(tài)調(diào)試信息包括將本機(jī)程序的二進(jìn)制文件的指令的相對虛擬地址映射到與所述指令相關(guān)聯(lián)的用戶類型的表,所述指令在執(zhí)行時(shí)請求存儲器分配;在進(jìn)程中執(zhí)行所述本機(jī)程序; 將所述進(jìn)程的進(jìn)程堆中的指令的虛擬存儲器地址映射到所述存儲器分配的實(shí)例的地址; 將所述指令的虛擬存儲器地址匹配于所述指令的對應(yīng)的相對虛擬地址; 將被映射到對應(yīng)的相對虛擬地址的用戶類型分配給所述指令的虛擬地址; 響應(yīng)于接收對進(jìn)程堆快照的請求,通過以下步驟創(chuàng)建引用圖 掃描進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及 顯示所述引用圖,聚集用戶類型實(shí)例計(jì)數(shù)和大小。
全文摘要
本發(fā)明涉及本機(jī)堆分配的運(yùn)行時(shí)類型標(biāo)識。在編譯期間,創(chuàng)建了將本機(jī)語言程序的存儲器分配指令的相對虛擬地址映射到實(shí)例的用戶類型的表。在程序的執(zhí)行期間,被插入到進(jìn)程中的模塊截取對存儲器分配函數(shù)的調(diào)用并記錄調(diào)用存儲器分配函數(shù)的指令的虛擬地址和所創(chuàng)建的實(shí)例的虛擬地址。當(dāng)請求進(jìn)程堆的快照時(shí),對應(yīng)編譯時(shí)指令的用戶類型被分配給所創(chuàng)建的實(shí)例。用戶類型和堆信息可被用于計(jì)算存儲器分配的大小并聚集用戶類型實(shí)例的計(jì)數(shù)和大小。使用靜態(tài)調(diào)試信息,可計(jì)算和顯示引用圖,該引用圖顯示活實(shí)例中的對象的嵌套。
文檔編號G06F11/14GK103034484SQ20121038086
公開日2013年4月10日 申請日期2012年10月9日 優(yōu)先權(quán)日2011年10月10日
發(fā)明者C·施米希, A·R·魯濱遜 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
北京市| 平原县| 曲松县| 芷江| 右玉县| 香港 | 山东省| 株洲市| 乐至县| 屏山县| 东乌珠穆沁旗| 泾源县| 习水县| 保靖县| 海安县| 宜兰市| 大悟县| 浦江县| 遵化市| 武宣县| 乌兰察布市| 偏关县| 崇州市| 沙湾县| 双牌县| 玉溪市| 临泽县| 沙湾县| 台江县| 临沭县| 进贤县| 绍兴县| 石景山区| 汽车| 定安县| 崇信县| 崇文区| 密山市| 临沭县| 固镇县| 永丰县|