專(zhuān)利名稱:本機(jī)堆分配的運(yùn)行時(shí)類(lèi)型標(biāo)識(shí)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及存儲(chǔ)器管理技術(shù),更具體地,涉及本機(jī)堆分配的運(yùn)行時(shí)類(lèi)型標(biāo)識(shí)。
背景技術(shù):
存儲(chǔ)器管理包括根據(jù)請(qǐng)求將存儲(chǔ)器的各部分分配給各程序,以及當(dāng)程序不再需要所分配的存儲(chǔ)器時(shí)釋放該存儲(chǔ)器以供重新使用。對(duì)存儲(chǔ)器的低效或不正確的使用會(huì)降低程序性能或?qū)е鲁绦虮罎ⅰn?lèi)似的,無(wú)法釋放已分配的存儲(chǔ)器或不正確地釋放存儲(chǔ)器會(huì)降低程序性能或?qū)е鲁绦虮罎ⅰPg(shù)語(yǔ)“垃圾回收”常被用來(lái)表示一種自動(dòng)存儲(chǔ)器管理形式,其中垃圾回收器重新聲明不再是使用中的存儲(chǔ)器。垃圾回收是一種被頻繁用于虛擬機(jī)環(huán)境中的技術(shù)。與之相比,手動(dòng)存儲(chǔ)器管理依賴于在程序中使用用于請(qǐng)求操作系統(tǒng)分配存儲(chǔ)器和取消分配未被使用的存儲(chǔ)器的指令。普遍使用的用于手動(dòng)地管理存儲(chǔ)器的語(yǔ)言包括本機(jī)語(yǔ)言,諸如C和C++。手動(dòng)存儲(chǔ)器管理會(huì)將幾個(gè)常見(jiàn)類(lèi)的錯(cuò)誤引入程序中。例如,如果當(dāng)程序使用完所分配的存儲(chǔ)器部分時(shí)其沒(méi)有被釋放,則會(huì)發(fā)生存儲(chǔ)器泄露。存儲(chǔ)器泄露可以是相對(duì)無(wú)害的(例如,在短時(shí)運(yùn)行的程序中,其中程序結(jié)束時(shí)操作系統(tǒng)取消分配程序資源),或者如果存儲(chǔ)器泄露用盡了可用存儲(chǔ)器則會(huì)導(dǎo)致程序崩潰。即使存儲(chǔ)器泄露沒(méi)有用盡可用存儲(chǔ)器并且沒(méi)有導(dǎo)致程序崩潰,程序性能會(huì)被降低,因?yàn)槔缛鄙僮銐虻目捎么鎯?chǔ)器使數(shù)據(jù)被強(qiáng)制交換出到磁盤(pán)。當(dāng)分配的空間被釋放不止一次時(shí)或者如果釋放了指向未分配存儲(chǔ)器的指針,會(huì)發(fā)生另一種類(lèi)型的存儲(chǔ)器管理錯(cuò)誤。這類(lèi)錯(cuò)誤會(huì)損壞數(shù)據(jù)結(jié)構(gòu)或者會(huì)不正確地釋放后來(lái)已由另一程序構(gòu)造使用的部分存儲(chǔ)器。如果在存儲(chǔ)器被釋放后使用了指向被釋放的存儲(chǔ)器的指針,則接著會(huì)發(fā)生無(wú)法預(yù)料的結(jié)果。當(dāng)程序中的指令分配過(guò)多存儲(chǔ)器使得沒(méi)有剩余足夠的存儲(chǔ)器以供程序高效運(yùn)行時(shí),會(huì)發(fā)生存儲(chǔ)器過(guò)度使用。
發(fā)明內(nèi)容
可請(qǐng)求執(zhí)行中的本機(jī)程序的快照并且可提供對(duì)快照請(qǐng)求時(shí)所分配的用戶類(lèi)型的存儲(chǔ)器分配統(tǒng)計(jì)。通過(guò)使用靜態(tài)調(diào)試信息和動(dòng)態(tài)運(yùn)行時(shí)分配信息,活(live)存儲(chǔ)器堆分配可使用用戶類(lèi)型信息來(lái)增強(qiáng)。用戶類(lèi)型和堆信息可被用于計(jì)算存儲(chǔ)器分配的大小并聚集用戶類(lèi)型實(shí)例的計(jì)數(shù)和大小。使用靜態(tài)調(diào)試信息,可計(jì)算和顯示引用圖,該引用圖顯示活實(shí)例中的對(duì)象的嵌套??商峁┰次募拿Q以及調(diào)用存儲(chǔ)器分配函數(shù)的指令的行號(hào)。提供發(fā)明內(nèi)容述以便以簡(jiǎn)化形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本發(fā)明內(nèi)容并不旨在標(biāo)識(shí)所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于限制所要求保護(hù)主題的范圍。
在附圖中圖1a示出了根據(jù)此處所公開(kāi)的主題的各方面的捕捉相對(duì)虛擬地址(RVA)至類(lèi)型信息的系統(tǒng)100的示例;圖1b示出了根據(jù)此處所公開(kāi)的主題的各方面的將RVA映射成類(lèi)型的表110的示例;圖1c示出了根據(jù)此處所公開(kāi)的主題的各方面的捕捉運(yùn)行時(shí)存儲(chǔ)器分配信息的系統(tǒng)101的示例;圖1d示出了根據(jù)此處所公開(kāi)的主題的各方面的將分配的實(shí)例的地址映射成調(diào)用存儲(chǔ)器分配函數(shù)的指令的虛擬地址的表134的示例;圖1e示出了根據(jù)此處所公開(kāi)的主題的各方面的潛在的實(shí)例參考信息的表140的示例,其中潛在的實(shí)例參考中的一些已被標(biāo)識(shí)為非指針;圖1f示出了根據(jù)此處所公開(kāi)的主題的各方面的包括類(lèi)型信息的潛在的實(shí)例參考信息的表176的不例;圖2a示出了根據(jù)此處所公開(kāi)的主題的各方面的計(jì)算目標(biāo)進(jìn)程的存儲(chǔ)器分配統(tǒng)計(jì)的的方法200的示例;圖2b示出了根據(jù)此處所公開(kāi)的主題的各方面的目標(biāo)進(jìn)程的經(jīng)計(jì)算出的存儲(chǔ)器分配統(tǒng)計(jì)的的顯示230的示例;
圖3是根據(jù)本文所公開(kāi)主題的各方面的計(jì)算環(huán)境的示例的框圖;以及圖4是根據(jù)此處所公開(kāi)的主題的各方面的集成開(kāi)發(fā)環(huán)境的示例的框圖。
具體實(shí)施方式
概覽用于用本機(jī)代碼編寫(xiě)的程序的已知工具可提供諸如“在點(diǎn)A處,進(jìn)程B已分配了起始于地址D的C個(gè)字節(jié)的存儲(chǔ)器”之類(lèi)的信息。然而,已知工具不能夠提供與所分配的存儲(chǔ)器塊相關(guān)聯(lián)的用戶類(lèi)型信息。即,已知工具不能提供諸如“在點(diǎn)A處,進(jìn)程B已為用戶類(lèi)型為F的對(duì)象的E個(gè)實(shí)例分配了起始于地址Dp…D1J^C個(gè)字節(jié)的存儲(chǔ)器”之類(lèi)的信息。根據(jù)此處所描述的主題的各方面,提供了可將用戶類(lèi)型信息與存儲(chǔ)器中特定位置處分配的存儲(chǔ)器塊相關(guān)聯(lián)的工具。信息可被聚集和概括,并被提供在顯示中。所提供的信息可幫助用戶確定多少存儲(chǔ)器被分配給哪些用戶類(lèi)型。這進(jìn)而可幫助用戶診斷存儲(chǔ)器過(guò)度使用以及本機(jī)源代碼中的其它存儲(chǔ)器分配模式。想要用戶類(lèi)型存儲(chǔ)器分配統(tǒng)計(jì)的本機(jī)源程序可被編譯以生成二進(jìn)制文件(例如,可執(zhí)行文件或動(dòng)態(tài)鏈接庫(kù))。根據(jù)此處所描述的主題的各方面,其執(zhí)行導(dǎo)致分配存儲(chǔ)器的二級(jí)制文件中的指令的相對(duì)虛擬地址(RVA)可被映射到該RVA處的指令所分配的實(shí)例的類(lèi)型或與該類(lèi)型相關(guān)聯(lián)。當(dāng)執(zhí)行該二級(jí)制文件時(shí),截取對(duì)存儲(chǔ)器分配的請(qǐng)求的程序模塊可被插入到二進(jìn)制文件正執(zhí)行于的目標(biāo)進(jìn)程中。所插入的程序模塊可截取對(duì)發(fā)生在目標(biāo)進(jìn)程內(nèi)的已知存儲(chǔ)器分配函數(shù)的調(diào)用。當(dāng)程序運(yùn)行及分配發(fā)生時(shí),可記錄調(diào)用存儲(chǔ)器分配函數(shù)的指令的虛擬地址(在此稱為調(diào)用點(diǎn))。新創(chuàng)建的實(shí)例的虛擬存儲(chǔ)器地址也可被記錄并被映射到調(diào)用了存儲(chǔ)器分配函數(shù)的指令的虛擬地址或與該虛擬地址相關(guān)聯(lián)。響應(yīng)于接收到對(duì)堆快照的請(qǐng)求,可通過(guò)走查與進(jìn)程相關(guān)聯(lián)的一個(gè)或多個(gè)堆來(lái)標(biāo)識(shí)目前為止在該進(jìn)程中所作出的所有存儲(chǔ)器分配。調(diào)用存儲(chǔ)器分配函數(shù)的每個(gè)指令的虛擬地址可以被轉(zhuǎn)換成RVA。這一 RVA可以被匹配于之前創(chuàng)建的(例如,在編譯期間)RVA/類(lèi)型表中對(duì)應(yīng)的RVA,以確定在二級(jí)制文件的執(zhí)行期間所分配的實(shí)例的用戶類(lèi)型。與所分配的實(shí)例的虛擬存儲(chǔ)器地址相關(guān)聯(lián)的實(shí)例的類(lèi)型可通過(guò)將調(diào)用點(diǎn)(曾調(diào)用存儲(chǔ)器分配函數(shù)的指令的虛擬地址)轉(zhuǎn)換成其執(zhí)行導(dǎo)致分配存儲(chǔ)器的二級(jí)制文件中的指令的RVA來(lái)確定。為了將調(diào)用點(diǎn)轉(zhuǎn)換成RVA,進(jìn)程存儲(chǔ)器中加載二級(jí)制文件所位于的基地址可從調(diào)用點(diǎn)減去。與前一步驟(例如編譯步驟)中的匹配RVA相關(guān)聯(lián)的用戶類(lèi)型可被分配給調(diào)用點(diǎn)。特定用戶類(lèi)型的信息可被聚集、概括并顯示。所顯示的信息可包括類(lèi)型、所分配的實(shí)例的總數(shù)以及特定類(lèi)型的實(shí)例的經(jīng)聚集的大小、以及該類(lèi)型的定義的位置。所顯示的信息可還包括一種類(lèi)型的每個(gè)實(shí)例的分解、實(shí)例的大小、創(chuàng)建該實(shí)例的模塊、該實(shí)例的分配點(diǎn)、以及源文件的名稱以及分配該實(shí)例的指令的行號(hào)??商峁┟枋鲆藐P(guān)系的引用圖。引用圖信息可通過(guò)掃描進(jìn)程堆以查找潛在的指針來(lái)獲取,其中掃描通過(guò)查找并記錄所有的指針大小的字段來(lái)進(jìn)行??赏ㄟ^(guò)使用用來(lái)確定每個(gè)潛在指針的類(lèi)型的靜態(tài)調(diào)試信息并且刪除非指針類(lèi)型來(lái)刪除被記錄的非指針字段。即,根據(jù)此處所描述的主題的各方面,響應(yīng)于接收對(duì)快照的請(qǐng)求,進(jìn)程堆可被掃描以查找潛在的指針的實(shí)例。任何具有指針大小的長(zhǎng)度的虛擬地址可被記錄。可以理解的是不是所有指針大小的實(shí)體都有可能是真正的指針。提供對(duì)象布局的符號(hào)調(diào)試信息可被用于移除不是指針的被記錄的指針大小的偏移。例如,假設(shè)程序包括對(duì)象Foo,其包括另一對(duì)象Bar。從編譯中產(chǎn)生的調(diào)試文件中獲取的對(duì)象Foo的布局可因此包括指向?qū)ο驜ar的指針。顯示對(duì)象Foo和Bar之間的嵌套關(guān)系的引用圖可隨后被顯示。本機(jī)堆分配的運(yùn)行時(shí)類(lèi)型標(biāo)識(shí)圖1a示出了根據(jù)此處所公開(kāi)的主題的各方面的捕捉RVA至類(lèi)型匹配信息的系統(tǒng)100的示例。系統(tǒng)100的全部或某些部分可以駐留在諸如下面參考圖3所描述的計(jì)算機(jī)之類(lèi)的一個(gè)或多個(gè)計(jì)算機(jī)上。系統(tǒng)100可在諸如參考圖4所描述的軟件開(kāi)發(fā)計(jì)算機(jī)之類(lèi)的軟件開(kāi)發(fā)計(jì)算機(jī)上執(zhí)行。系統(tǒng)100或其部分可在諸如IDE 104之類(lèi)的IDE內(nèi)執(zhí)行或者在IDE之外執(zhí)行。IDE可以是諸如參考圖4所描述的IDE之類(lèi)的IDE,或者可以是支持本機(jī)語(yǔ)言的任何其它IDE。系統(tǒng)100的全部或部分可被實(shí)現(xiàn)為插件或擴(kuò)展。系統(tǒng)100可包括諸如計(jì)算機(jī)102之類(lèi)的一個(gè)或多個(gè)計(jì)算機(jī)或計(jì)算設(shè)備,其包括諸如處理器142等之類(lèi)的一個(gè)或多個(gè)處理器、諸如存儲(chǔ)器144之類(lèi)的存儲(chǔ)器、和/或諸如映射模塊116之類(lèi)的一個(gè)或多個(gè)模塊。系統(tǒng)100可還包括諸如編譯器106之類(lèi)的編譯器。編譯器106可以是C或C++編譯器或其中實(shí)現(xiàn)手動(dòng)存儲(chǔ)器分配的任何其他本機(jī)編程語(yǔ)言編譯器。根據(jù)此處所公開(kāi)的主題的各方面,映射模塊11 6可以是編譯器106的一部分或者可以是獨(dú)立的模塊(未示出)。映射模塊116可收集諸如RVA/類(lèi)型信息110之類(lèi)的RVA至類(lèi)型信息。映射模塊116可在源程序114的編譯期間將諸如RVA/類(lèi)型信息110之類(lèi)的RVA至類(lèi)型信息收集到動(dòng)態(tài)鏈接庫(kù)或諸如可執(zhí)行文件108之類(lèi)的可執(zhí)行文件中。可替換地,映射模塊116可在編譯進(jìn)程之外執(zhí)行。當(dāng)編譯進(jìn)行時(shí),可收集諸如調(diào)試信息112之類(lèi)的調(diào)試信息。調(diào)試信息可包括程序模塊中的所有符號(hào)的列表。調(diào)試信息可包括符號(hào)的地址、其中聲明了該符號(hào)的源文件的名稱以及其中聲明了該符號(hào)的源文件中的行的行號(hào)。調(diào)試信息可以存儲(chǔ)在程序數(shù)據(jù)庫(kù)文件中,這是一種由微軟公司開(kāi)發(fā)的、用于存儲(chǔ)關(guān)于程序的、通常具有.Pdb擴(kuò)展名的調(diào)試信息的專(zhuān)有文件格式??商鎿Q地,調(diào)試信息可以存儲(chǔ)在二級(jí)制文件本身中。
典型編譯器的前端執(zhí)行語(yǔ)法和語(yǔ)義檢查并報(bào)告錯(cuò)誤。前端可生成源代碼的中間表示或IR以供中間端處理。在中間端,可進(jìn)行優(yōu)化轉(zhuǎn)換并生成第二 IR。后端通常將來(lái)自中間端的IR轉(zhuǎn)換成匯編碼。在前端編譯期間,通常創(chuàng)建抽象語(yǔ)法樹(shù)(AST)。AST是源代碼的抽象語(yǔ)法結(jié)構(gòu)的樹(shù)形表示,其中樹(shù)的每個(gè)節(jié)點(diǎn)表示源代碼中的一個(gè)構(gòu)造。根據(jù)此處所公開(kāi)的主題的各方面,后端代碼生成器可使用AST來(lái)將存儲(chǔ)器分配指令的相對(duì)虛擬地址(RVA)映射到那些指令所分配的類(lèi)型。因此,將RVA映射成類(lèi)型的信息可由編譯器在編譯期間計(jì)算,并且被包括作為程序的調(diào)試數(shù)據(jù)庫(kù)的一部分(例如,在.PDB文件中或在二進(jìn)制文件本身中)。當(dāng)在運(yùn)行時(shí)發(fā)生存儲(chǔ)器分配時(shí),這一信息允許基于地址的類(lèi)型查找,如以下更全面描述的。例如,在以下的C++代碼中,創(chuàng)建從編譯器生成的匯編指令的RVA到類(lèi)型Foo的
(靜態(tài))符號(hào)調(diào)試信息的映射。
權(quán)利要求
1.一種系統(tǒng),包括 計(jì)算設(shè)備的至少一個(gè)處理器; 所述計(jì)算設(shè)備的存儲(chǔ)器;以及 加載到所述存儲(chǔ)器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 響應(yīng)于接收對(duì)堆快照的請(qǐng)求,通過(guò)以下步驟提供本機(jī)語(yǔ)言程序的存儲(chǔ)器分配統(tǒng)計(jì)接收將所述本機(jī)語(yǔ)言程序的二進(jìn)制文件中的指令的相對(duì)虛擬地址映射到用戶類(lèi)型的信息,所述指令在被執(zhí)行時(shí)請(qǐng)求存儲(chǔ)器分配; 將進(jìn)程中執(zhí)行的指令的虛擬存儲(chǔ)器地址映射到所述指令所請(qǐng)求的存儲(chǔ)器分配的實(shí)例的地址; 將所述指令的虛擬存儲(chǔ)器地址匹配于所述指令的對(duì)應(yīng)的相對(duì)虛擬地址; 將被映射到對(duì)應(yīng)的相對(duì)虛擬地址的用戶類(lèi)型分配給所述指令的虛擬存儲(chǔ)器地址;以及 聚集用戶類(lèi)型實(shí)例計(jì)數(shù)和大小。
2.如權(quán)利要求1所述的系統(tǒng),其特征在于,還包括 加載到所述存儲(chǔ)器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 通過(guò)以下步驟顯示引用圖 掃描所述進(jìn)程的進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及 顯示所述引用圖中的存儲(chǔ)器分配實(shí)例之間的關(guān)系。
3.如權(quán)利要求1所述的系統(tǒng),其特征在于,還包括 加載到所述存儲(chǔ)器中的至少一個(gè)模塊,所述模塊使所述至少一個(gè)處理器 在編譯期間將所述本機(jī)語(yǔ)言程序的二進(jìn)制文件中的指令的相對(duì)虛擬地址映射到所述用戶類(lèi)型。
4.如權(quán)利要求2所述的系統(tǒng),其特征在于,在編譯期間生成的符號(hào)調(diào)試信息提供實(shí)例的布局,其中所述布局被用于移除被記錄的指針大小的、但不是指針的字段。
5.如權(quán)利要求2所述的系統(tǒng),其特征在于,用戶類(lèi)型和進(jìn)程堆信息被用于計(jì)算存儲(chǔ)器分配的大小并聚集用戶類(lèi)型實(shí)例計(jì)數(shù)和大小。
6.一種方法,包括 將本機(jī)語(yǔ)言程序的指令的相對(duì)虛擬地址映射到用戶類(lèi)型,所述指令調(diào)用存儲(chǔ)器分配函數(shù); 將追蹤模塊插入目標(biāo)進(jìn)程,所述目標(biāo)進(jìn)程在計(jì)算設(shè)備的處理器上執(zhí)行所述指令; 截取對(duì)所述存儲(chǔ)器分配函數(shù)的調(diào)用并記錄所述存儲(chǔ)器分配函數(shù)的返回地址; 記錄由所述存儲(chǔ)器分配函數(shù)在存儲(chǔ)器中分配的實(shí)例的地址; 將所述返回地址轉(zhuǎn)換成對(duì)應(yīng)的相對(duì)虛擬地址; 將所記錄的返回地址分配給所述用戶類(lèi)型;以及 提供聚集的存儲(chǔ)器分配的大小以及用戶類(lèi)型實(shí)例計(jì)數(shù)和大小。
7.如權(quán)利要求6所述的方法,其特征在于,還包括 通過(guò)以下步驟顯示引用圖 掃描所述實(shí)例的進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及顯示所述弓I用圖中的實(shí)例之間的關(guān)系。
8.如權(quán)利要求6所述的方法,其特征在于,通過(guò)走查抽象語(yǔ)法樹(shù)以及將相對(duì)虛擬地址/用戶類(lèi)型映射信息寫(xiě)入與編譯期間生成的靜態(tài)調(diào)試文件分開(kāi)的文件中,所述指令的相對(duì)虛擬地址到用戶類(lèi)型的映射與編譯分開(kāi)地進(jìn)行。
9.如權(quán)利要求6所述的方法,其特征在于,存儲(chǔ)器分配和用戶類(lèi)型實(shí)例計(jì)數(shù)和大小按照類(lèi)型、模塊、源文件、名字空間或類(lèi)名來(lái)提供。
10.一種包括當(dāng)執(zhí)行時(shí)使計(jì)算設(shè)備的至少一個(gè)處理器執(zhí)行下列操作的計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì) 接收靜態(tài)調(diào)試信息,所述靜態(tài)調(diào)試信息包括將本機(jī)程序的二進(jìn)制文件的指令的相對(duì)虛擬地址映射到與所述指令相關(guān)聯(lián)的用戶類(lèi)型的表,所述指令在執(zhí)行時(shí)請(qǐng)求存儲(chǔ)器分配;在進(jìn)程中執(zhí)行所述本機(jī)程序; 將所述進(jìn)程的進(jìn)程堆中的指令的虛擬存儲(chǔ)器地址映射到所述存儲(chǔ)器分配的實(shí)例的地址; 將所述指令的虛擬存儲(chǔ)器地址匹配于所述指令的對(duì)應(yīng)的相對(duì)虛擬地址; 將被映射到對(duì)應(yīng)的相對(duì)虛擬地址的用戶類(lèi)型分配給所述指令的虛擬地址; 響應(yīng)于接收對(duì)進(jìn)程堆快照的請(qǐng)求,通過(guò)以下步驟創(chuàng)建引用圖 掃描進(jìn)程堆以查找指針大小的字段的實(shí)例; 移除非指針的指針大小的字段;以及 顯示所述引用圖,聚集用戶類(lèi)型實(shí)例計(jì)數(shù)和大小。
全文摘要
本發(fā)明涉及本機(jī)堆分配的運(yùn)行時(shí)類(lèi)型標(biāo)識(shí)。在編譯期間,創(chuàng)建了將本機(jī)語(yǔ)言程序的存儲(chǔ)器分配指令的相對(duì)虛擬地址映射到實(shí)例的用戶類(lèi)型的表。在程序的執(zhí)行期間,被插入到進(jìn)程中的模塊截取對(duì)存儲(chǔ)器分配函數(shù)的調(diào)用并記錄調(diào)用存儲(chǔ)器分配函數(shù)的指令的虛擬地址和所創(chuàng)建的實(shí)例的虛擬地址。當(dāng)請(qǐng)求進(jìn)程堆的快照時(shí),對(duì)應(yīng)編譯時(shí)指令的用戶類(lèi)型被分配給所創(chuàng)建的實(shí)例。用戶類(lèi)型和堆信息可被用于計(jì)算存儲(chǔ)器分配的大小并聚集用戶類(lèi)型實(shí)例的計(jì)數(shù)和大小。使用靜態(tài)調(diào)試信息,可計(jì)算和顯示引用圖,該引用圖顯示活實(shí)例中的對(duì)象的嵌套。
文檔編號(hào)G06F11/14GK103034484SQ20121038086
公開(kāi)日2013年4月10日 申請(qǐng)日期2012年10月9日 優(yōu)先權(quán)日2011年10月10日
發(fā)明者C·施米希, A·R·魯濱遜 申請(qǐng)人:微軟公司