亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

用于跟蹤并監(jiān)控計(jì)算機(jī)應(yīng)用的系統(tǒng)和方法

文檔序號(hào):6569957閱讀:1829來源:國知局

專利名稱::用于跟蹤并監(jiān)控計(jì)算機(jī)應(yīng)用的系統(tǒng)和方法
技術(shù)領(lǐng)域
:本發(fā)明涉及用于對(duì)用戶與計(jì)算機(jī)應(yīng)用程序的交互進(jìn)行監(jiān)控的系統(tǒng)和方法,更特別地,涉及對(duì)會(huì)話期間的用戶/應(yīng)用程序交互,以及應(yīng)用程序的性能和其影響用戶的行為進(jìn)行監(jiān)控和分析。
背景技術(shù)
:在現(xiàn)在的公司中,企業(yè)應(yīng)用程序提供了進(jìn)行商業(yè)處理的功能。并且,在復(fù)雜的全球經(jīng)濟(jì)中,為了滿足商業(yè)需求,這些應(yīng)用程序已變得非常復(fù)雜。無論是對(duì)于應(yīng)用程序上的用戶性能還是對(duì)于用于用戶的應(yīng)用程序性能的測(cè)量來說,獲得管理應(yīng)用程序的技能、構(gòu)建在日益發(fā)展的基礎(chǔ)設(shè)施上的變化的應(yīng)用程序以及系統(tǒng)測(cè)量的努力都是一種挑戰(zhàn)。通常,用戶監(jiān)控產(chǎn)品可分為幾類性能監(jiān)控捕獲、HTTP監(jiān)控、HTTP捕獲、主機(jī)應(yīng)用程序運(yùn)行時(shí)間源碼插入、以及主機(jī)應(yīng)用程序開發(fā)源碼插入或編譯。下列產(chǎn)品代表其各自的類別。有些產(chǎn)品在終端用戶的計(jì)算機(jī)上監(jiān)控并捕獲性能。包括馬薩諸塞州威斯特禍特(Westford)市的瑞幅森軟件公司(ReflectentSoftware,Westford,MA)出售的名為EdgeSight視圖(EdgeSightviews)的產(chǎn)品,其從終端用戶的角度對(duì)應(yīng)用程序和IT服務(wù)的性能和可用性進(jìn)行實(shí)時(shí)的和歷史的量化,從而能了解具體的應(yīng)用程序是如何執(zhí)行和利用的。當(dāng)出現(xiàn)崩潰、錯(cuò)誤或鉤子(hook)時(shí),所需的信息和鑒定數(shù)據(jù)馬上就可用于查明問題的根本原因。其不根據(jù)主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù),且不監(jiān)控事務(wù)之間的任何活動(dòng)。其不能在泛型分類集中檢測(cè)GUI對(duì)象子集。其不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例。其不能實(shí)現(xiàn)函數(shù)調(diào)用的方法監(jiān)控。其不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)才幾。傳統(tǒng)的產(chǎn)品可用于在客戶計(jì)算機(jī)上監(jiān)控HTTP業(yè)務(wù)。例如,加利福利亞州芒廷維尤市的^<4艮7>司(MercuryCorporation,MountainView,CA)的終端用戶監(jiān)控(EndUserMonitoring)就從終端用戶的角度主動(dòng)地對(duì)網(wǎng)站和應(yīng)用程序的可用性進(jìn)行實(shí)時(shí)監(jiān)控。其主動(dòng)地模仿終端用戶對(duì)應(yīng)用程序的業(yè)務(wù)處理。但是其不根據(jù)主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù),且不監(jiān)控事務(wù)之間的任何活動(dòng)。其不能在泛型分類集中檢測(cè)GUI對(duì)象子集,且不能執(zhí)行方法監(jiān)控。其不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例。其不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)才幾。一種由蠟燭公司(CandleCorp.)(IBM/Tivoli)出售的商標(biāo)為ETEWatch的產(chǎn)品對(duì)應(yīng)用程序加載屏幕或執(zhí)行動(dòng)作時(shí)的事務(wù)層端對(duì)端響應(yīng)時(shí)間(即,用戶經(jīng)歷的等待時(shí)間)進(jìn)行測(cè)量。其不從主才幾應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù),且不監(jiān)控事務(wù)之間的任何活動(dòng)。其不能在泛型分類集中檢測(cè)GUI對(duì)象子集。其不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例。其不能實(shí)現(xiàn)函數(shù)調(diào)用的方法監(jiān)控。其不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)機(jī)。一種由密歇根州底特律市的計(jì)算軟件公司(Compuware,Detroit,MI)出售的商標(biāo)產(chǎn)品將應(yīng)用程序性能數(shù)據(jù)和事件與對(duì)業(yè)務(wù)重要的因素(例如,應(yīng)用程序、事務(wù)、角色和位置)相關(guān)聯(lián)。附加視圖將終端用戶響應(yīng)時(shí)間度量與擴(kuò)展的故障診斷能力相結(jié)合。這就允許IT組織能解決性能問題并能主動(dòng)地管理其應(yīng)用程序和基礎(chǔ)設(shè)施。其不從主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù),且不監(jiān)控事務(wù)之間的任何活動(dòng)。其不能在泛型分類集中檢測(cè)GUI對(duì)象子集。其不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例。其不能實(shí)現(xiàn)函數(shù)調(diào)用的方法監(jiān)控。其不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)機(jī)。9有些產(chǎn)品在服務(wù)器上捕獲HTTP業(yè)務(wù)。一種由加利福利亞州舊金山市的茶葉才支術(shù)有卩艮公司(TeaLeafTechnology,Inc.ofSanFrancisco,CA)出售的名為RealiTea的產(chǎn)品實(shí)時(shí)地主動(dòng)捕獲每個(gè)顧客所做的和所看到的,使得能夠?qū)栴}進(jìn)行立即的檢測(cè)、分析和響應(yīng)。其根據(jù)通過多步驟業(yè)務(wù)處理的期望輸出,對(duì)對(duì)每個(gè)用戶的獨(dú)特動(dòng)作進(jìn)行驗(yàn)證。但是其不根據(jù)主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù),且不監(jiān)控事務(wù)之間的任何活動(dòng)。其不能在泛型分類集中檢測(cè)GUI對(duì)象子集,且不能執(zhí)行方法監(jiān)控。其不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例。其不能透明地實(shí)現(xiàn),且需要對(duì)應(yīng)用程序源碼進(jìn)行修改或需要來自編譯處理的某些輸出。其不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)機(jī)。有些產(chǎn)品在運(yùn)行時(shí)間將代碼插入到主機(jī)應(yīng)用程序中。一種由維爾公司(Veritas)出售的商標(biāo)為i3的產(chǎn)品主動(dòng)地監(jiān)控、分析并調(diào)諧SAP、Siebel等應(yīng)用。通過對(duì)來自應(yīng)用基礎(chǔ)設(shè)施的每個(gè)支持級(jí)(網(wǎng)絡(luò)服務(wù)器、應(yīng)用程序服務(wù)器、數(shù)據(jù)庫和存儲(chǔ)器)的性能度量進(jìn)行捕獲、測(cè)量和關(guān)聯(lián),其提供了應(yīng)用程序性能的完整觀察。當(dāng)該產(chǎn)品確實(shí)地看到GUI事件時(shí),其被限制為網(wǎng)絡(luò)應(yīng)用,并且不能對(duì)泛型GUI對(duì)象集進(jìn)行檢測(cè)。此外,其需要在網(wǎng)站插入源碼,這種插入是非常侵入性的過程,并且不是透明的實(shí)現(xiàn)過程。該Veritas產(chǎn)品不能從操作系統(tǒng)層直接檢測(cè)到任何事情。其不能從組件方法(即,函數(shù))或從具有Win32應(yīng)用程序的接口中直接地檢測(cè)事件或檢索屬性。此外,通過該Veritas產(chǎn)品,不可能對(duì)多種不同應(yīng)用類型(如web和Win32)同時(shí)測(cè)量。此外,在沒有用于執(zhí)行實(shí)時(shí)警報(bào)的固定狀態(tài)機(jī)的各頁面之間缺乏持久性。此外該產(chǎn)品還不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)機(jī)。有些產(chǎn)品使用在開發(fā)期對(duì)源碼進(jìn)行編譯得到的文件。由紐約州紐約市的識(shí)別軟件7>司(IdentifySoftware,NewYork,NY)出售的服務(wù)器和/或客戶才幾上的名為AppSight黑盒(AppSightBlackBox)的產(chǎn)品基于動(dòng)態(tài)的用于定義的記錄簡檔(profile)記錄多個(gè)同步層上的應(yīng)用程序執(zhí)行。黑盒(BlackBox)不要求改變?cè)创a或可執(zhí)行程序??蛻舴侥軌?qū)τ脩舻膭?dòng)作和屏幕事件進(jìn)行視頻捕獲。該產(chǎn)品不進(jìn)行事務(wù)響應(yīng)測(cè)量。此外,當(dāng)該產(chǎn)品執(zhí)行一種形式的方法監(jiān)控時(shí),其依賴在源碼開發(fā)時(shí)通過編譯生成的文件,并且不嚴(yán)格地支持透明實(shí)現(xiàn)過程。該申請(qǐng)中描述的當(dāng)前發(fā)明不需要編譯后的源文件就實(shí)現(xiàn)了方法監(jiān)控,并且還對(duì)函數(shù)返回進(jìn)行監(jiān)控。上述產(chǎn)品不在GUI對(duì)象模型的GUI對(duì)象層根據(jù)主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù);不能在泛型分類集中檢測(cè)GUI對(duì)象子集;不能在GUI層支持主機(jī)應(yīng)用程序的多實(shí)例;不能透明地實(shí)現(xiàn),且需要對(duì)應(yīng)用程序源碼進(jìn)行修改或需要來自編譯處理的某些輸出;以及不支持用于高效快速處理的分布式的本地和遠(yuǎn)程狀態(tài)機(jī)。題為"應(yīng)用程序的端對(duì)端響應(yīng)時(shí)間測(cè)量和分解(ApplicationEnd-To-EndResponseTimeMeasurementandDecomposition),,的第6,108,700號(hào)美國專利涉及一種端對(duì)端測(cè)量,其通常跨越全部同級(jí),并為用于合并各種數(shù)據(jù)類型的框架。題為"萬維網(wǎng)終端用戶請(qǐng)求時(shí)間監(jiān)控器(WorldWideWebEndUserResponseTimeMonitor)"的第6,078,956號(hào)美國專利公開了HTTP層的監(jiān)控請(qǐng)求,其中,先計(jì)算與第一HTTP請(qǐng)求相關(guān)聯(lián)的響應(yīng)時(shí)間,然后將其傳遞至服務(wù)器并存入用于之后使用。題為"使用開始和結(jié)束隊(duì)列對(duì)計(jì)算機(jī)程序進(jìn)行端對(duì)端響應(yīng)時(shí)間測(cè)量(End-To-EndResponseTimeMeasurementforComputerProgramsUsingStartingandEndingQueues),,的第5,991,705號(hào)美國專利及第6,202,036號(hào)的延續(xù)申請(qǐng)涉及用于測(cè)量計(jì)算機(jī)執(zhí)行的事務(wù)的端對(duì)端響應(yīng)時(shí)間的系統(tǒng)。題為"用可插入事件隊(duì)列監(jiān)控事件序列操作的裝置和方法(ApparatusandMethodforMonitoringEventQueueOperationsWithPluggableEventQueues)"的第6,189,047號(hào)美國專利公開了定制消息隊(duì)列的使用,由于用戶GUI交互,其反應(yīng)了由應(yīng)用程序使用的系統(tǒng)消息隊(duì)列。以上所述的每個(gè)美國專利的全文都通過引用并入本文。特別地,現(xiàn)有專利5,991,705、6,108,700和6,078,956都未公開可根據(jù)主機(jī)應(yīng)用程序的GUI表示層生成監(jiān)控?cái)?shù)據(jù)的方法或系統(tǒng)?,F(xiàn)有技術(shù)中的技術(shù)都不支持用于高效快速處理的分布式(本地的和遠(yuǎn)程的)狀態(tài)機(jī),也不對(duì)GUI對(duì)象集執(zhí)行簡單隊(duì)列之外的任何建?;驑浣Y(jié)構(gòu),也不支持GUI多實(shí)例處理?,F(xiàn)有技術(shù)中的技術(shù)都未公開泛型分類集中的GUI對(duì)象的子集的使用,并且也未能提供方法監(jiān)控。現(xiàn)有技術(shù)也沒提供用于全部其它形式的非GUI數(shù)據(jù)的GUI上下文。本發(fā)明申請(qǐng)?jiān)谟谔峁┡c本申請(qǐng)人的公布的專利(題為"使用行為和主機(jī)應(yīng)用程序才莫型在軟件應(yīng)用中動(dòng)態(tài)協(xié)助的系統(tǒng)和方法(SystemandMethodForDynamicAssistanceInSoftwareApplicationsUsingBehaviorandHostApplicationModels),,的第6,340,977號(hào)美國專利)以及本申請(qǐng)人的未決的延續(xù)申請(qǐng)(2001年11月20日提交的第09/989,716號(hào)美國專利)類似的主題。申請(qǐng)人還具有由申請(qǐng)人以商標(biāo)為"用戶性能測(cè)量3.0(Knoa操作響應(yīng)時(shí)間監(jiān)控器,Knoa用戶&應(yīng)用程序4普誤監(jiān)控器,Knoa應(yīng)用程序使用監(jiān)控器)(UserPerformanceMeasurement3.0(KnoaOperationResponseTimeMonitor,KnoaUser&ApplicationErrorsMonitor,KnoaApplicationUsageMonitor)),,、"Knoa商業(yè)處理測(cè)量3.0(Knoa商業(yè)處理監(jiān)控器)(KnoaBusinessProcessMeaurement3.0(KnoaBusinessProcessMonitor))"和"Knoa兼容觀'J量2.0(Knoa用戶兼容監(jiān)控器)(KnoaComplianceMeasurement2,0(KnoaUserComplianceMonitor))"出售的商業(yè)實(shí)施。本申請(qǐng)專注于申請(qǐng)人的現(xiàn)有工作并對(duì)其做出了改進(jìn)?,F(xiàn)有技術(shù)中缺少能對(duì)主機(jī)應(yīng)用程序的多實(shí)例進(jìn)行自動(dòng)檢測(cè)并能對(duì)GUI結(jié)構(gòu)的子集的多實(shí)例進(jìn)行檢測(cè)的GUI檢測(cè)和系統(tǒng)。此外,現(xiàn)有技術(shù)中缺少能對(duì)主機(jī)應(yīng)用程序的多實(shí)例中的GUI對(duì)象的類別進(jìn)行泛型檢測(cè)、或?qū)χ鳈C(jī)應(yīng)用程序的子集進(jìn)行泛型檢測(cè)的系統(tǒng)。本發(fā)明提供了這些系統(tǒng)并滿足其它需要。
發(fā)明內(nèi)容根據(jù)本發(fā)明的一個(gè)方面,提供了一種用于對(duì)來自表示層的事件和目標(biāo)應(yīng)用的軟件方法進(jìn)行監(jiān)控的方法。該方法包括以下步驟獨(dú)立于對(duì)所述目標(biāo)應(yīng)用的源代碼的重編譯,提供在所述目標(biāo)應(yīng)用內(nèi)的層運(yùn)行的腳本。該腳本掃描目標(biāo)應(yīng)用程序的對(duì)象的運(yùn)行期實(shí)例,并實(shí)時(shí)地為所述對(duì)象實(shí)例分配結(jié)構(gòu)。對(duì)分配的結(jié)構(gòu)進(jìn)行調(diào)整,以創(chuàng)建所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映。該反映與檢測(cè)到的與預(yù)定對(duì)象結(jié)構(gòu)相匹配的對(duì)象實(shí)例共同用于捕獲檢測(cè)到的對(duì)象的環(huán)境譜的至少一部分。12根據(jù)本發(fā)明的另一方面,提供了一種方法,包括對(duì)發(fā)生在服務(wù)器機(jī)器和客戶/本地化機(jī)器中至少之一上的狀態(tài)機(jī)事件進(jìn)行處理;將狀態(tài)機(jī)事件與環(huán)境語相關(guān)聯(lián),并基于相關(guān)聯(lián)的狀態(tài)機(jī)事件演繹出用戶經(jīng)驗(yàn)。根據(jù)本發(fā)明的另一方面,提供了一種配之以對(duì)計(jì)算機(jī)目標(biāo)應(yīng)用程序的表示層中的事件進(jìn)行監(jiān)控的系統(tǒng)。所述系統(tǒng)包括在通信網(wǎng)絡(luò)中相互連接的服務(wù)器和客戶計(jì)算機(jī)。其中,服務(wù)器操作指令監(jiān)控程序,監(jiān)控程序包括能夠在所述表示層以下的層上運(yùn)行的腳本。監(jiān)控程序包括能夠操作以實(shí)現(xiàn)以下步驟的指令掃描對(duì)象的運(yùn)行期實(shí)例,所述對(duì)象包括目標(biāo)應(yīng)用程序的方法調(diào)用、方法返回以及GUI對(duì)象;實(shí)時(shí)地為所述對(duì)象實(shí)例分配結(jié)構(gòu);調(diào)整分配的結(jié)構(gòu),以創(chuàng)建所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映;檢測(cè)與預(yù)定對(duì)象結(jié)構(gòu)相匹配的一個(gè)或多個(gè)對(duì)象;以及至少捕獲檢測(cè)到的對(duì)象的內(nèi)容。通過附圖和對(duì)某些示例性實(shí)施方式的描述,可進(jìn)一步預(yù)期上述和其它方面、特征及有益效果。術(shù)語定義書中使用的術(shù)語一般具有其在本領(lǐng)域中的普通含義。下面或在說明書的其它地方對(duì)某些術(shù)語進(jìn)行討論,以在對(duì)本發(fā)明的裝置和方法進(jìn)行的描述中向?qū)嵺`者對(duì)如何制造和使用本發(fā)明的裝置和方法提供額外的指導(dǎo)。可以認(rèn)識(shí)到,同一個(gè)事物可用不止一個(gè)方式表達(dá)。因此,對(duì)于本文討論的術(shù)語中的任意一個(gè)或多個(gè),都可使用替代性的語言和同義詞,而并不根據(jù)本文是否對(duì)術(shù)語進(jìn)行了詳細(xì)描述和討論而使其具有任何特別的重要性。提供了某些術(shù)語的同義詞。列出一個(gè)或多個(gè)同義詞并不排除其它同義詞的使用。本說明書中任何地方使用的實(shí)施例(包括本文討論的任何術(shù)語的實(shí)例)都^f又僅是示例性的,而不在任何方面對(duì)本發(fā)明或任何示例性術(shù)語的范圍和含義進(jìn)行限制。同樣,本發(fā)明不限于優(yōu)選的實(shí)施例。"代理(Agent)"表示與單一引擎DLL的一個(gè)或多個(gè)運(yùn)行實(shí)例相關(guān)^:的主代碼單元。"組件(Component)"表示由待執(zhí)行的程序代碼和數(shù)據(jù)組成的常規(guī)操作系統(tǒng)包。組件程序代碼包括用于執(zhí)行應(yīng)用程序或服務(wù)的功能性的方法或函數(shù)調(diào)用,并有利于代碼的重新使用和用于復(fù)雜的主機(jī)應(yīng)用程序的模塊化封裝。組件執(zhí)行由公司創(chuàng)建的多種不同技術(shù),以促進(jìn)外部應(yīng)用接口的重新使用和/>布。包含面向?qū)ο蟮念惢虺绦虼a的組件可在組件技術(shù)中實(shí)現(xiàn),組件技術(shù)例如微軟(即,MicrosoftCorporationofRedmond,WA)COM(組件對(duì)象模型)、用于開發(fā)并支持程序組件對(duì)象COM的框架或其它類型的組件技術(shù)。"環(huán)境語(EnvironmentalSpectrum),,表示在目標(biāo)應(yīng)用程序中呈現(xiàn)的不變的和時(shí)變的條件,這些條件表現(xiàn)為對(duì)象、GUI、對(duì)象、消息、方法調(diào)用和方法返回,^旦不限于此。"事件模型(EventModel)"表示這樣一組事件,其事件檢測(cè)和收集反映并表示在主機(jī)應(yīng)用程序中已發(fā)生的某些真實(shí)過程。"輸出函數(shù)(ExportedFunction)"是一種方法接口,當(dāng)將該輸出函數(shù)的名稱提供到程序模塊頭部(header)時(shí),該方法接口被輸出至DLL組件中。"框架(Framework)"表示對(duì)GUI對(duì)象以及方法調(diào)用和返回事件的狀態(tài)和檢測(cè)進(jìn)行建模的工作基本結(jié)構(gòu)。"泛型的(Generic)"表示4企測(cè)一組目標(biāo)的操作。這里的一組可指相似對(duì)象的類或范疇,此處用于表示一組GUI對(duì)象、一組方法或一組其它事件。"泛型的"的反面是"具體的(Specific)",其通常指單一的GUI對(duì)象、方法或其它事件。"gMg引擎(gMgEngine)"表示對(duì)包含邏輯說明和條件說明的二進(jìn)制腳本文件進(jìn)行處理的腳本解釋器,所述的邏輯說明和條件說明執(zhí)行監(jiān)控目標(biāo)范圍內(nèi)的選擇性監(jiān)控。"gMgGUI對(duì)象樹(gMgGUIObjectTree)"表示本發(fā)明中用于對(duì)包括主機(jī)應(yīng)用程序的用戶接口有用的GUI對(duì)象進(jìn)行建才莫和表示的分層結(jié)構(gòu)。"gMgGUI上下文(gMgGUIContext)"表示gMg系統(tǒng)內(nèi)任何數(shù)據(jù)類型在GUI數(shù)據(jù)流中的交叉,其中GUI數(shù)據(jù)提供用于分析的GUI(用戶)上下文,以更好地反映用戶對(duì)應(yīng)用程序的經(jīng)-瞼。"gMg解決方案(gMgSolution)"表示編譯腳本的二進(jìn)制封裝,編譯腳本描述了為實(shí)現(xiàn)主機(jī)應(yīng)用程序監(jiān)控而執(zhí)行的條件、邏輯和選擇性目標(biāo)。"GUI"是圖形用戶接口的簡寫,其由主機(jī)應(yīng)用程序控制。其為用戶和主機(jī)應(yīng)用程序之間的主接口。"GUI對(duì)象"是一類對(duì)象,其為通常在RAM中被編程的GUI結(jié)構(gòu)的一部分,這類對(duì)象包括被顯示的用戶接口,并通過主機(jī)應(yīng)用程序代碼對(duì)計(jì)算機(jī)輸入裝置起作用和受其控制。"鉤子(Hook)"表示傳感器的一部分,該部分對(duì)操作系統(tǒng)消息和由主機(jī)應(yīng)用程序生成并將由外部系統(tǒng)進(jìn)一步處理的消息進(jìn)行捕獲,或基于主機(jī)應(yīng)用程序的運(yùn)行時(shí)間消息執(zhí)行改變動(dòng)作。"主機(jī)應(yīng)用程序(HookApplication)"表示用于監(jiān)控的應(yīng)用程序。"IE"代表一種因特網(wǎng)瀏覽器應(yīng)用(Microsoft'sInternetExplorer)。"實(shí)例(Instance)"表示一些功能性的程序,其操作代碼可被跟蹤到派生集,其中單一的派生集可將一個(gè)或多個(gè)操作單元以實(shí)例的形式創(chuàng)建到存儲(chǔ)器中以實(shí)現(xiàn)功能。存儲(chǔ)在已啟動(dòng)的存儲(chǔ)器中并作為派生操作的結(jié)果而運(yùn)行的程序代碼可稱為實(shí)例。"邏輯事件(LogicalEvent)"表示狀態(tài)機(jī)處理的事件,這些事件代表可被處理到一個(gè)或多個(gè)層級(jí)(即,在不同的物理位置處(例如客戶機(jī)或服務(wù)器)的狀態(tài)機(jī)處理的連續(xù)階段)的目標(biāo)狀態(tài)。"方法"與"函數(shù)"在程序函數(shù)中相互同義地使用。"方法事件(MethodEvent)"表示通過對(duì)組件的方法或函數(shù)(例如程序函數(shù)或方法)進(jìn)行監(jiān)控而生成的事件。"多實(shí)例(Multi-Instance)"表示指定單元的不止一個(gè)實(shí)例同時(shí)存儲(chǔ)在存儲(chǔ)器中。"對(duì)象變量(ObjectVariable)"表示附接于存儲(chǔ)在GUI對(duì)象樹中的現(xiàn)有GUI對(duì)象成員的、本發(fā)明的特指對(duì)象。"OS"是計(jì)算機(jī)操作系統(tǒng)的簡寫。"傳感器"是一種專門的編碼單元,其使用公共的或私有的接口15從應(yīng)用組件處獲取實(shí)時(shí)數(shù)據(jù)。"具體的(Specific)"表示一個(gè)操作將檢測(cè)一個(gè)邏輯條件,例如單一GUI對(duì)象的4企測(cè)。"狀態(tài)機(jī)(StateMachine)"表示一種處理單元,其具有輸入和輸出事件,并通過與持久性存儲(chǔ)相耦合的輸入事件的條件處理,確定序列或發(fā)展中的離散的不同狀態(tài)。"形實(shí)轉(zhuǎn)換程序(Thunk)"表示用于在方法監(jiān)控中執(zhí)行代碼或存儲(chǔ)實(shí)例信息的動(dòng)態(tài)分配的結(jié)構(gòu)。形實(shí)轉(zhuǎn)換程序結(jié)構(gòu)用于捕獲函數(shù)調(diào)用或函數(shù)返回的多種情況。"虛擬函數(shù)(VirtualFunction)"表示這樣一種函數(shù),當(dāng)其由子類覆蓋時(shí),其將由基類調(diào)用。"V表(VTable)"表示一種虛擬表,其為COM中的表,該表中包含對(duì)屬于一類的方法或函數(shù)的方法指針。計(jì)算系統(tǒng)和GUI圖1示出了根據(jù)本發(fā)明實(shí)施方式的計(jì)算機(jī)以及客戶機(jī)和服務(wù)器硬件;圖2示出了根據(jù)本發(fā)明實(shí)施方式的、在示例性GUI網(wǎng)絡(luò)應(yīng)用中的GUI表示層;監(jiān)控目標(biāo)圖3示出了根據(jù)本發(fā)明實(shí)施方式的客戶機(jī)或服務(wù)器上的計(jì)算機(jī)操作環(huán)境(非GUI)中的監(jiān)控器目標(biāo);gMg系統(tǒng)組件概述圖4示出了根據(jù)本發(fā)明實(shí)施方式的gMg系統(tǒng)組件概觀;gMg系統(tǒng)事件流圖5示出了根據(jù)本發(fā)明實(shí)施方式的gMg系統(tǒng)中的事件和性質(zhì)流概觀;圖6示出了根據(jù)本發(fā)明實(shí)施方式的主事件源;GUI對(duì)象樹圖7示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)GUI對(duì)象樹的更新;圖8示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)象樹gMg事件對(duì)GUI對(duì)象樹的更新以及gMg創(chuàng)建和破壞事件;用于多實(shí)例支持的函數(shù)圖9示出了根據(jù)本發(fā)明實(shí)施方式的加載程序功能性;圖IO示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)象變量;圖11示出了才艮據(jù)本發(fā)明實(shí)施方式的WhenObject結(jié)構(gòu);圖12示出了根據(jù)本發(fā)明實(shí)施方式的具有進(jìn)程的進(jìn)程窗口上下文以及不同的窗口元素;圖13示出了根據(jù)本發(fā)明實(shí)施方式的上下文和多個(gè)彈出式窗口;圖14示出了根據(jù)本發(fā)明實(shí)施方式的進(jìn)程鉤子;GUI對(duì)象的類屬4企測(cè)圖15示出了根據(jù)本發(fā)明實(shí)施方式的具體的到類屬的譜;方法傳感技術(shù)圖16示出了根據(jù)本發(fā)明實(shí)施方式的方法監(jiān)控概觀;圖17示出了根據(jù)本發(fā)明實(shí)施方式的用于方法監(jiān)控的模塊樹;圖18示出了根據(jù)本發(fā)明實(shí)施方式的方法監(jiān)控器的創(chuàng)建;圖19示出了根據(jù)本發(fā)明實(shí)施方式的方法簽名以及方法代碼覆蓋;圖20示出了根據(jù)本發(fā)明實(shí)施方式的用于方法監(jiān)控的形實(shí)轉(zhuǎn)換程序分配;圖21示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)虛擬函數(shù)的監(jiān)控;圖22示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)方法返回的監(jiān)控-堆棧復(fù)制;圖23示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)方法返回的監(jiān)控-堆棧分配;分析圖24示出了根據(jù)本發(fā)明實(shí)施方式的、具有本地和遠(yuǎn)程狀態(tài)機(jī)處理的狀態(tài)^L層次;圖25示出了根據(jù)本發(fā)明實(shí)施方式的用于狀態(tài)機(jī)中的轉(zhuǎn)變的靜態(tài)和實(shí)例評(píng)估;圖26示出了根據(jù)本發(fā)明實(shí)施方式的狀態(tài)機(jī)事件處理;圖27示出了根據(jù)本發(fā)明實(shí)施方式的處理流程圖28示出了根據(jù)本發(fā)明另一實(shí)施方式的處理流程圖;以及圖29A和29B示出了根據(jù)本發(fā)明再一實(shí)施方式的處理流程圖。具體實(shí)施例方式通過介紹,提出了對(duì)主機(jī)應(yīng)用程序的多實(shí)例中的具體事件或具有遺傳結(jié)構(gòu)的事件提供及時(shí)跟蹤和監(jiān)控的系統(tǒng)和方法的實(shí)施方式。這種跟蹤和監(jiān)控是從應(yīng)用程序的表示層得到,例如在GUI層得到或在函數(shù)或方法層得到。事件和之后的模式檢測(cè)分析的生成提供了洞察和測(cè)量統(tǒng)計(jì),用于對(duì)包括但不限于以下各項(xiàng)的測(cè)量進(jìn)行監(jiān)控響應(yīng)時(shí)間、錯(cuò)誤檢測(cè)以及應(yīng)用程序事件的收集。用戶監(jiān)控提供了可用于辨別用戶上下文和應(yīng)用程序交互的信息。隨著企業(yè)環(huán)境中的應(yīng)用程序越來越復(fù)雜,對(duì)實(shí)際用戶經(jīng)驗(yàn)的理解和測(cè)量也變得越來越困難。當(dāng)用戶經(jīng)歷從慢的加載或響應(yīng)時(shí)間、隱含的錯(cuò)誤消息、部分提供的頁面到不完整的數(shù)據(jù)塊表和記錄等的每一件事情時(shí),可出現(xiàn)各種問題。IT部門現(xiàn)在完全集中于后端基礎(chǔ)設(shè)施,即使其實(shí)際上是推動(dòng)公司收入和效益的商業(yè)用戶。為了確定對(duì)用戶經(jīng)驗(yàn)的定量測(cè)量,在用戶或服務(wù)器環(huán)境中可能具有許多可用的信息源。由于具有許多與集中式數(shù)據(jù)源進(jìn)行交互和事務(wù)處理的組件,因此,每個(gè)組件都變?yōu)榘ㄓ脩艚?jīng)驗(yàn)的長事件鏈中的一個(gè)鏈接。這些組件可位于網(wǎng)絡(luò)層、硬件層(CPU、存儲(chǔ)器、虛擬存儲(chǔ)器)、GUI表示層、應(yīng)用程序服務(wù)器中等。18由于用戶在與應(yīng)用程序的GUI層交互時(shí)驅(qū)動(dòng)關(guān)鍵商業(yè)處理,因此,理想地,應(yīng)該將在應(yīng)用程序的任何基本架構(gòu)等級(jí)內(nèi)的全部動(dòng)作和活動(dòng)的GUI層的上下文和識(shí)別問題追溯到某個(gè)用戶上下文中的用戶動(dòng)作。來自GUI層的事件正好提供該上下文。系統(tǒng)在該層進(jìn)行跟蹤,并"見用戶所見"。該GUI被組織為分層結(jié)構(gòu),并包含GUI對(duì)象的多個(gè)子集。根據(jù)用戶動(dòng)作和應(yīng)用程序的組織邏輯,可在運(yùn)行時(shí)間對(duì)這些子集進(jìn)行復(fù)制,應(yīng)用程序的組織邏輯控制GUI對(duì)象結(jié)構(gòu)如何生成和如何在運(yùn)行時(shí)間保持在存儲(chǔ)器中。系統(tǒng)提供了將各結(jié)構(gòu)區(qū)分開了的支持識(shí)別機(jī)制,這些結(jié)構(gòu)在其它方面可表現(xiàn)為相同的。特別地,如果用戶遇到從基本架構(gòu)任意等級(jí)生成的錯(cuò)誤消息,那么捕獲錯(cuò)誤實(shí)例以用于之后的分析,從而有利于該應(yīng)用程序的補(bǔ)救。在現(xiàn)在的網(wǎng)絡(luò)世界中,應(yīng)用程序經(jīng)常都以多實(shí)例運(yùn)行,其中,多個(gè)窗口都具有可同時(shí)運(yùn)行的相同結(jié)構(gòu),從而給應(yīng)用程序的多實(shí)例中的GUI對(duì)象的精確檢測(cè)帶來了問題。特別地,一個(gè)問題在于清楚地識(shí)別用戶看起來不相同、但內(nèi)部結(jié)構(gòu)可能相同的接口?,F(xiàn)代的應(yīng)用程序可在用戶接口上產(chǎn)生用不同文字標(biāo)記、但具有相同的內(nèi)部對(duì)象結(jié)構(gòu)的許多窗口。這種多實(shí)例還是現(xiàn)代編程實(shí)踐(其努力使程序共享最大化)的一種后期效應(yīng)(aftereffect),并還重新使用組件/人而達(dá)到更大的運(yùn)4亍時(shí)間效率和維護(hù)效率。對(duì)于透明性問題,監(jiān)控系統(tǒng)相對(duì)于目標(biāo)的主機(jī)應(yīng)用程序而言需為非侵入性的并為透明的,并且如同不存在監(jiān)控組件一樣地操作。企業(yè)應(yīng)用程序最通常的配置都不向例如監(jiān)控程序的外部應(yīng)用程序提供對(duì)啟動(dòng)《1妄口并7>布定制事件的源碼的訪問。對(duì)于監(jiān)控系統(tǒng),問題則變?yōu)槿绾卧诓桓淖儜?yīng)用程序的情況下對(duì)進(jìn)行選擇性監(jiān)控的應(yīng)用程序進(jìn)行擴(kuò)展。為了實(shí)現(xiàn)這種透明性,監(jiān)控系統(tǒng)會(huì)對(duì)輸入的事件進(jìn)行攔截和過濾,并對(duì)其進(jìn)行讀取和處理??蛇x地,該系統(tǒng)還可濾除持續(xù)傳遞到主才幾應(yīng)用程序的事件。對(duì)于可用的測(cè)量源的問題,企業(yè)主才幾應(yīng)用程序內(nèi)的跟蹤業(yè)務(wù)處理在利用可用測(cè)量源來執(zhí)行真實(shí)的用戶性能監(jiān)控方面具有很大的挑戰(zhàn)。在GUI層,洞察復(fù)雜的處理需要從比標(biāo)準(zhǔn)表中已經(jīng)可用的維數(shù)更多的19維數(shù)中獲得更多的數(shù)據(jù)。盡管企業(yè)應(yīng)用程序賣主公布了許多應(yīng)用程序接口(API),但是,多數(shù)邏輯仍然是保持隱藏的,通常,有些關(guān)鍵事件或?qū)傩詢H能從私有組件中獲得。通過對(duì)這些私有組件的訪問,精確性和可訪問性都極大增強(qiáng)。對(duì)于監(jiān)控覆蓋的問題,由于現(xiàn)在的企業(yè)應(yīng)用程序的復(fù)雜性和規(guī)模(scale),執(zhí)行監(jiān)控覆蓋可為使人畏縮的任務(wù)。通過大數(shù)據(jù)庫的排列和組合,可能具有幾百甚至幾千個(gè)模塊以及幾千個(gè)操作?;趶臄?shù)據(jù)中得到的條件,這些大數(shù)據(jù)庫可動(dòng)態(tài)地生成用戶接口。為了監(jiān)控甚至是基本的使用,系統(tǒng)必須檢測(cè)上百個(gè)狀態(tài)或條件,并實(shí)時(shí)高效地捕獲數(shù)據(jù)。此外,方案監(jiān)控的系統(tǒng)實(shí)現(xiàn)必須足夠快速,以適應(yīng)企業(yè)的要求并提供足夠的反饋和覆蓋。對(duì)于聚合實(shí)時(shí)檢測(cè)問題,在具有有限資源的環(huán)境下,對(duì)大的用戶基數(shù)(userbase)的復(fù)雜檢測(cè)在有限資源的編程環(huán)境下進(jìn)行高效編程方面面臨極大的挑戰(zhàn)。通常,企業(yè)應(yīng)用程序可生成許多事件,其中,鑒于數(shù)據(jù)業(yè)務(wù)、傳遞速度和透明監(jiān)控的限制,可以證明選擇性業(yè)務(wù)處理或操作的處理和檢測(cè)是非常具有挑戰(zhàn)性的。因此,為解決上述問題,本發(fā)明提供了多種機(jī)制。為解決GUI層的上下文和識(shí)別問題,在gMg(泛型多實(shí)例方法和GUI檢測(cè))系統(tǒng)中,提供了用戶上下文,其為可與該環(huán)境中任何其它類型的可用數(shù)據(jù)交錯(cuò)、并可與其它外部源(尤其是來自服務(wù)器或環(huán)境基礎(chǔ)設(shè)施的數(shù)據(jù))相關(guān)聯(lián)的GUI事件流。在GUI層檢測(cè)到的事件提供了用戶經(jīng)驗(yàn)和交互與應(yīng)用程序的表示層之間的直接映射。完全從GUI上下文中的綜合角度來看,該系統(tǒng)能用不同傳感器的實(shí)施方式(即,方法傳感器)對(duì)多種數(shù)據(jù)源進(jìn)行尋址。使用專用的透明GUI傳感器,可將全部其它形式的數(shù)據(jù)交錯(cuò)在GUI事件流中,以便為用戶的實(shí)際運(yùn)行時(shí)間經(jīng)驗(yàn)提供直接的事件通信。在gMg系統(tǒng)中,動(dòng)態(tài)沖莫塊與實(shí)時(shí)主^L應(yīng)用程序結(jié)構(gòu)同步,以解決應(yīng)用程序的多實(shí)例問題,并提供對(duì)通常具有多個(gè)相似或相同的GUI結(jié)構(gòu)的復(fù)雜主機(jī)應(yīng)用程序圖形接口的支持。動(dòng)態(tài)GUI對(duì)象樹對(duì)主機(jī)應(yīng)用程序的GUI對(duì)象進(jìn)行建模??筛郊觿?dòng)態(tài)變量以在樹中選擇GUI對(duì)象,從而支持GUI對(duì)象多實(shí)例。企業(yè)應(yīng)用開發(fā)的復(fù)雜性以及它們的部署使得企業(yè)應(yīng)用程序的任何改變即使完全可能發(fā)生,但是改變也會(huì)非常慢且麻煩。gMg系統(tǒng)包括各種傳感器的實(shí)施方式,這些傳感器通過從企業(yè)應(yīng)用程序及其環(huán)境中獲取事件和屬性而有助于使應(yīng)用程序具有透明性,而并不用改變企業(yè)應(yīng)用程序的源碼。因此,這些傳感器不對(duì)主機(jī)應(yīng)用程序的任何組件進(jìn)行重新編譯就能夠擴(kuò)展該應(yīng)用程序的功能性。這些傳感器最小化地且非侵入性地介入,以捕獲填充企業(yè)應(yīng)用程序模型所必需的數(shù)據(jù)。根據(jù)這些模型,可生成精確的事件從而允許進(jìn)行分析。gMg系統(tǒng)的方法監(jiān)控功能性極大地?cái)U(kuò)展了可用的測(cè)量源。在主機(jī)應(yīng)用程序環(huán)境內(nèi),具有兩類接口公共的和私有的。公共接口是公開的,用于和外部系統(tǒng)進(jìn)行集成。通過編程語言的慣例,API(應(yīng)用程序接口)能將組件功能與外部系統(tǒng)的外部功能集成到一起。私有接口則是不公開的,但是,如果找出其行為,其則可提供有價(jià)值的且有時(shí)是關(guān)鍵的事件或?qū)傩?,以建立用于測(cè)量的附加的上下文,全部這些上下文可構(gòu)成在GUI上下文中。下面介紹傳感器,該傳感器能透明地(例如,不改變主;f幾應(yīng)用程序的源碼)4企查z^共組件和私有組件,并能將這些組件在單一的開發(fā)編程環(huán)境中的其它類型的事件集成到測(cè)量處理中,從而使測(cè)量處理具有開放的、附加的更大維數(shù)。為了監(jiān)控GUI層的覆蓋,現(xiàn)有技術(shù)需要手動(dòng)實(shí)現(xiàn)每個(gè)具體的GUI對(duì)象的相應(yīng)描述符,并手動(dòng)選擇應(yīng)用程序的GUI的廣泛設(shè)備。為了有效地實(shí)現(xiàn)應(yīng)用程序的足以實(shí)現(xiàn)有效監(jiān)控的覆蓋,需要更有效的機(jī)制通過合理少量的操作提供廣泛覆蓋。通過優(yōu)化并極大地減少執(zhí)行測(cè)量方案所需的努力,gMg系統(tǒng)通過其對(duì)方法或GUI結(jié)構(gòu)的泛型檢測(cè)而實(shí)現(xiàn)這種更有效的機(jī)制。在GUI層和其它結(jié)構(gòu),應(yīng)用程序的內(nèi)部組織固有地具有對(duì)象的相關(guān)集,以實(shí)現(xiàn)并提供可視的表現(xiàn)層。利用該固有的組織的優(yōu)勢(shì),可從對(duì)相關(guān)的實(shí)時(shí)GUI對(duì)象結(jié)構(gòu)的檢測(cè)中得到事件,這些實(shí)時(shí)GUI對(duì)象結(jié)構(gòu)產(chǎn)生分類的事件,并作為泛型操作執(zhí)行以監(jiān)控GUI對(duì)象集。這種系統(tǒng)方法的極大益處在于,在開發(fā)期內(nèi),監(jiān)控方案的開發(fā)者不必描述每個(gè)可能的輸出,而僅需對(duì)將檢測(cè)目前和將來的全部類似結(jié)構(gòu)的結(jié)構(gòu)化算子表示進(jìn)行檢測(cè)。然后將遺傳地收集的數(shù)據(jù)與系統(tǒng)的其它資源集成到一起,以提供用戶與主機(jī)應(yīng)用程序的交互的多維觀察。對(duì)于聚合實(shí)時(shí)檢測(cè),在gMg系統(tǒng)中提供了對(duì)檢測(cè)到的第一級(jí)事件進(jìn)4亍處理的分布式本地和遠(yuǎn)程狀態(tài)才幾的可選實(shí)施方式。在GUI上下文數(shù)據(jù)流中,源處的狀態(tài)機(jī)可處理局部化的事件,并生成更高的邏輯狀態(tài),然后向收集服務(wù)器發(fā)出跟蹤消息。接收到邏輯狀態(tài)之后,其它的遠(yuǎn)程狀態(tài)機(jī)然后可對(duì)該邏輯事件類型以及從其它用戶計(jì)算機(jī)接收到的其它類似的邏輯事件類型進(jìn)一步處理。分布式處理的這種配置提供了用于大的用戶基數(shù)的非??斓臋z測(cè)速率。利用本地(客戶)或遠(yuǎn)程(服務(wù)器)GUI模型,gM2g(本文中稱為"gMg")是自動(dòng)的多實(shí)例具體和泛型GUI和方法跟蹤系統(tǒng),其用建;f莫。gMg能力可被透明地應(yīng)用,而無需對(duì)目標(biāo)應(yīng)用程序源碼重新編譯。位于本地客戶機(jī)或遠(yuǎn)程服務(wù)器上的gMg模型是反映主機(jī)應(yīng)用程序的實(shí)際結(jié)構(gòu)的GUI和方法對(duì)象框架,并為對(duì)收集的數(shù)據(jù)進(jìn)行重構(gòu)并將其翻譯為輸出分析的系統(tǒng)機(jī)制。由對(duì)事件和GUI對(duì)象屬性進(jìn)行過濾以;險(xiǎn)測(cè)實(shí)際GUI對(duì)象集的代碼命令對(duì)邏輯GUI對(duì)象進(jìn)行跟蹤。由響應(yīng)于對(duì)組件的主機(jī)應(yīng)用程序方法調(diào)用和返回而對(duì)翻譯器引擎創(chuàng)建的事件進(jìn)行;險(xiǎn)測(cè)的代碼命令對(duì)方法對(duì)象進(jìn)行跟蹤。然后,GUI和任何其它可用的事件和屬性都可從組件中得到。如同使用上述gMg模型的動(dòng)態(tài)系統(tǒng),gMg處理分配結(jié)構(gòu),并實(shí)時(shí)地-使這些結(jié)構(gòu)適應(yīng)于為主才幾應(yīng)用程序中的真實(shí)GUI和方法對(duì)象的多實(shí)例。對(duì)這些結(jié)構(gòu)進(jìn)行處理以得到邏輯事件,并對(duì)其進(jìn)行重編以反映不同上下文中的多實(shí)例結(jié)構(gòu),而無需獲得主機(jī)應(yīng)用程序的全部關(guān)系或?qū)傩缘南闰?yàn)知識(shí)。動(dòng)態(tài)地將從主機(jī)應(yīng)用程序中實(shí)時(shí)提取的數(shù)據(jù)組織到對(duì)象、進(jìn)程和代碼模塊樹中之后,gMg系統(tǒng)則用其對(duì)應(yīng)的多個(gè)屬性集(例如文本)處理復(fù)雜的多個(gè)結(jié)構(gòu),并將這些結(jié)構(gòu)關(guān)聯(lián)到一起用于精確分析。通過由客戶機(jī)和/或服務(wù)器上運(yùn)行的多種配置的相連狀態(tài)機(jī)的多實(shí)例處理,得到對(duì)報(bào)告、警報(bào)或響應(yīng)的分析。為了檢測(cè)單一的主機(jī)應(yīng)用程序的多個(gè)相關(guān)實(shí)例中的事件,提供了不同的可擴(kuò)展的代碼元件用于不同類型的傳感器,這些傳感器檢測(cè)在應(yīng)用中的各個(gè)點(diǎn)上出現(xiàn)的事件類別或從GUI層到組件方法調(diào)用的其操作環(huán)境。該系統(tǒng)包括對(duì)專有腳本進(jìn)行分析的多實(shí)例解釋器組件,該專有腳本具體地或泛型地對(duì)從傳感器傳遞的事件進(jìn)行過濾和解釋。根據(jù)事件和屬性條件,解釋器生成跟蹤消息??蛇x地,在生成跟蹤消息之前,解釋過的事件可在本地化的狀態(tài)機(jī)組件中的流中被可選地分析。然后,通信組件則封裝其解釋過的或本地化的狀態(tài)機(jī)跟蹤消息,并將其發(fā)送至對(duì)接收的跟蹤消息進(jìn)一步分析的遠(yuǎn)程狀態(tài)機(jī)組件。作為一種選擇,遠(yuǎn)程狀態(tài)機(jī)可將消息直接路由至警報(bào)或其它狀態(tài)機(jī),用于更及時(shí)地傳輸并顯示在顯示控制臺(tái)上。才艮告組件可#丸4亍對(duì)聚合7見點(diǎn)(aggregateviewpoint)、趨向、分組和分類的分析。該分析可繪制在多種圖形的、列表的或文字的表格中,并可用于多種用戶角色。這些角色可用于技術(shù)基礎(chǔ)設(shè)施支持群組、線式管理、用戶支持、教育以及可以是許多其它角色。本文介紹的系統(tǒng)和方法可用于許多方面。例如,當(dāng)在產(chǎn)品環(huán)境中使用時(shí),其在需要持續(xù)監(jiān)控的、用于用戶性能的多種應(yīng)用中是可用的。對(duì)于基礎(chǔ)設(shè)施支持,系統(tǒng)可用于測(cè)量響應(yīng)事件,并檢測(cè)用戶遇到的全部錯(cuò)誤消息。為了進(jìn)行訓(xùn)練,使用信息可檢測(cè)用戶在應(yīng)用程序的哪部分遇到了困難。對(duì)于順應(yīng)性(compliance),監(jiān)控進(jìn)程可檢測(cè)用戶在何處偏離了接受的政策實(shí)踐并生成警報(bào)進(jìn)行管理。對(duì)于安全性應(yīng)用,檢測(cè)一個(gè)或多個(gè)應(yīng)用程序上的可疑用戶活動(dòng)可生成到安全管理器的警報(bào)。對(duì)于資源規(guī)劃,使用信息描述了如何應(yīng)用資源,并揭露了峰值時(shí)間的分布(profile)。對(duì)于編程開發(fā),反饋、精確的響應(yīng)事件和錯(cuò)誤可導(dǎo)致快速傳輸固定的和新的發(fā)行版本。GUI事件被測(cè)量用于兩個(gè)事務(wù),并且位于兩個(gè)事務(wù)之間,所述交易使得不同的數(shù)據(jù)類型相交錯(cuò),且將它們表現(xiàn)為用戶的GUI上下文中的單一集。對(duì)于幫助桌面支持,使用、錯(cuò)誤和響應(yīng)事件信息提供了對(duì)幫助標(biāo)簽事件(helpticketincidents)的自動(dòng)成形,并有助于故障診斷處理。本說明書的組織如下首先簡單概括硬件和GUI環(huán)境,然后從討論不同類型的監(jiān)控目標(biāo)開始描述gMg監(jiān)控系統(tǒng),接著概述使用的組件。對(duì)GUI數(shù)據(jù)結(jié)構(gòu)(例如,gMgGUI對(duì)象樹)進(jìn)行研究之后,討論事件模型。然后對(duì)在多進(jìn)程和線程環(huán)境中實(shí)現(xiàn)gMg引擎和腳本的多實(shí)例的方法進(jìn)行介紹。在介紹了在COM對(duì)象中使用gMg方法簽名和虛擬函數(shù)進(jìn)行方法調(diào)用和返回的監(jiān)控之后,對(duì)泛型的和具體的GUI對(duì)象檢測(cè)進(jìn)行討論。最后一部分對(duì)使用分層的分布式狀態(tài)機(jī)進(jìn)行分析以實(shí)現(xiàn)快速實(shí)時(shí)檢測(cè)和動(dòng)作進(jìn)行了探索。圖1示出了能實(shí)現(xiàn)和操作泛型GUI方法監(jiān)控系統(tǒng)和方法的客戶計(jì)算機(jī)100和月良務(wù)器105的配置的實(shí)施方式。gMg系統(tǒng)和方法可為由客戶計(jì)算機(jī)100執(zhí)行的應(yīng)用程序或軟件,客戶計(jì)算機(jī)100可為個(gè)人計(jì)算才幾、工作站或其它計(jì)算平臺(tái)(例如,PDA(個(gè)人數(shù)字助理)或PED(個(gè)人電子設(shè)備),PED可包括手機(jī)、MP3播;故器、照片和^L頻數(shù)碼照相機(jī)以及個(gè)人視頻錄像機(jī)等)。服務(wù)器105(通過其服務(wù)器軟件而區(qū)分開來的另一個(gè)計(jì)算機(jī))從多個(gè)客戶計(jì)算機(jī)處收集數(shù)據(jù),并補(bǔ)充客戶處理任務(wù)。網(wǎng)絡(luò)連接器110提供到例如服務(wù)器的外部計(jì)算機(jī)的連通性。標(biāo)準(zhǔn)的連接協(xié)議在遠(yuǎn)程計(jì)算機(jī)之間發(fā)送和接收任何格式的數(shù)據(jù)??蛻粲?jì)算機(jī)100可包括由內(nèi)部系統(tǒng)連接到一起的子系統(tǒng)。包含在系統(tǒng)RAM130內(nèi)的指令由中央處理單元150執(zhí)行。大量的外部裝置通過端口140連接于1/0(輸入/輸出)控制器115,端口140在串口(未示出)上提供到例如調(diào)制解調(diào)器的外部設(shè)備的連接。2D和3D圖形和視頻或任何形式的移動(dòng)圖像的顯示都由視頻適配器120處理,視頻適配器120在監(jiān)控器125上顯示圖形緩沖的內(nèi)容。聲音處理由聲音硬件135實(shí)現(xiàn)。定位裝置155和鍵盤145將用戶輸入轉(zhuǎn)換為輸入數(shù)據(jù),用戶輸入是由用戶與顯示的可視信息的交互而生成的。永久存儲(chǔ)160保留計(jì)算機(jī)在關(guān)機(jī)狀態(tài)和運(yùn)行時(shí)間(需要的話)之間存在的數(shù)據(jù)。圖2示出了典型的應(yīng)用程序GUI,本實(shí)施例中,其為web因特網(wǎng)應(yīng)用。實(shí)際上,有兩類GUI對(duì)象被監(jiān)控,即,Win32和WebIE控件。主窗口205包含全部子目GUI結(jié)構(gòu),子目GUI結(jié)構(gòu)包4舌web頁面,并包括兩類容器應(yīng)用(即,瀏覽器)和瀏覽器的頁面內(nèi)容,頁面內(nèi)容可包括多個(gè)web頁面(即,html元件)。瀏覽器容器應(yīng)用由Win32元件(例如,主窗口205、窗口標(biāo)題、主窗口控件215、菜單項(xiàng)225、URL接口地址顯示220以及導(dǎo)航和操作圖標(biāo)230)構(gòu)成。主窗口的其它元件提供狀態(tài)指示符235和安全狀態(tài)指示符240。主頁面本身表示由服務(wù)器送達(dá)的主機(jī)應(yīng)用程序的html頁面,并由用于用戶交互和信息獲取的各種函數(shù)接口構(gòu)成。圖2示出了簡單的日歷功能,其中示出了提供不同的視圖和過濾操作的各種元件,包括用于以下各項(xiàng)的各種標(biāo)簽控件和圖標(biāo)應(yīng)用程序的主要組織部分245、250;項(xiàng)目3見圖255;用戶過濾、項(xiàng)目及分類265;添加260和搜索275操作符;數(shù)據(jù)顯示270;圖形日歷顯示280以及項(xiàng)目狀態(tài)圖標(biāo)285。該實(shí)施例示出了如何將兩種GUI應(yīng)用處理結(jié)合繪制GUI,以提供用于gMgWin32和網(wǎng)頁(Web)IE傳感器的兩個(gè)目標(biāo)類型。用戶接口提供GUI事件的關(guān)鍵流,根據(jù)該關(guān)鍵流,可在GUI上下文中設(shè)置多種其它的計(jì)數(shù)器(從統(tǒng)計(jì)數(shù)據(jù)、響應(yīng)時(shí)間、計(jì)算機(jī)性能計(jì)數(shù)器到方法事件計(jì)數(shù)器),以直接連接于用戶經(jīng)驗(yàn),用于對(duì)應(yīng)用程序的性能或商業(yè)處理進(jìn)行更精確的分析。該簡單的日歷為主機(jī)應(yīng)用程序的一個(gè)實(shí)施例。本發(fā)明不限于任何特定類型或?qū)傩缘闹鳈C(jī)應(yīng)用程序。監(jiān)控目標(biāo)為主機(jī)應(yīng)用程序內(nèi)的任何實(shí)體或有組織的實(shí)時(shí)處理,其屬性、事件或行為可通過檢測(cè)被翻譯為邏輯事件,用于由gMg系統(tǒng)解釋和分析。在目標(biāo)環(huán)境中,具有廣泛的潛在的監(jiān)控目標(biāo),在操作系統(tǒng)或應(yīng)用程序中,這些目標(biāo)環(huán)境被分成提供私有方法或公共API。每個(gè)監(jiān)控目標(biāo)都可包含其自己的值或具有可檢測(cè)的事件,這些值和事件可用于構(gòu)建用于關(guān)心的和感興趣的任何范圍的行為。參照?qǐng)D3,用戶302對(duì)主機(jī)應(yīng)用程序GUI304進(jìn)行交互,主才幾應(yīng)控制。必要時(shí),GUI和組件層都與操作系統(tǒng)組件310-326進(jìn)行交互,以實(shí)現(xiàn)全部的功能。盡管操作系統(tǒng)具有許多方面,但是此處僅示出與內(nèi)核312、網(wǎng)絡(luò)314、322和324、例如CPU、內(nèi)存、進(jìn)程和線程的核25心才喿作326、文件320以及其它操作系統(tǒng)組件310、318相關(guān)的少數(shù)關(guān)鍵功能。主機(jī)應(yīng)用程序組件306與這些OS子系統(tǒng)中的任意或全部進(jìn)行交互,以執(zhí)行例如網(wǎng)絡(luò)通信、圖形顯示等的基本功能性。通過公共API(應(yīng)用程序接口)308和328-336,操作系統(tǒng)發(fā)行者提供了可用的、操作環(huán)境中不同的標(biāo)準(zhǔn)子系統(tǒng),這些API被集成到gMg系統(tǒng)中的356處,并被集成到gMg傳感器338中。應(yīng)用程序API308可根據(jù)內(nèi)部信息的各種類別而提供事件和屬性。通常將這些類別公開,以供應(yīng)用程序伙伴對(duì)應(yīng)用程序功能性進(jìn)行擴(kuò)展,用于用戶定制或服務(wù)定制。操作系統(tǒng)API318根據(jù)OS的進(jìn)程、線程、內(nèi)存、內(nèi)存分配等提供關(guān)于OS的全部方面的功能。"PerfMon(性能監(jiān)控)"是在MicrosoftWindows內(nèi)公布的特別構(gòu)建的API316,其提供關(guān)于硬件或服務(wù)的多個(gè)方面(例如,CPU利用,虛擬存儲(chǔ)等)的計(jì)數(shù)器和數(shù)據(jù)。瀏覽器控件API328提供關(guān)于瀏覽器容器應(yīng)用程序的DOM(文檔對(duì)象模型)的屬性和事件,并用于支持網(wǎng)頁GUI監(jiān)控應(yīng)用。瀏覽器控件對(duì)應(yīng)于Win32GUIAPI通信接口330,該接口對(duì)Win32客戶應(yīng)用程序GUI進(jìn)行監(jiān)控。還具有許多其它的GUIAPI332,例如用Java(來自加利福利亞州圣克拉才立市的太陽微系統(tǒng)有限/>司(SunMicrosystems,Inc.ofSantaClara:CA))、VisualBasic和.NET(均來自華盛頓州雷蒙德市的微軟公司(MicrosoftCorporationofRedmond,WA))編寫的客戶應(yīng)用程序。gMg系統(tǒng)可構(gòu)建在以上所述全部的接口類別上,以創(chuàng)建不同的監(jiān)控?cái)?shù)據(jù)源,用于收集和分析處理。gMg系統(tǒng)實(shí)現(xiàn)了具有各種傳感器類型338的數(shù)據(jù)源的生成和集成。這些傳感器通過其適配器鏈接于各種可用的監(jiān)控目標(biāo)接口(308和328到336)。這些傳感器被配置,并對(duì)饋送至gMg提取層348中的事件進(jìn)行檢測(cè),提取層則輸出gMg事件350。這些輸出事件然后被饋送至gMg解釋器352中用于實(shí)時(shí)條件分析,實(shí)時(shí)條件分析又創(chuàng)建另一個(gè)跟蹤事件層,這些跟蹤事件被饋送至收集和分析服務(wù)器354中。分析產(chǎn)生從警報(bào)、關(guān)聯(lián)到直接動(dòng)作的大量輸出。作為gMg系統(tǒng)的一部分,還具有專用的gMg方法4全測(cè)器(即,gMg方法監(jiān)控340、342、344、346),其對(duì)組件范圍內(nèi)從主機(jī)應(yīng)用程序到才喿作系統(tǒng)的目標(biāo)方法調(diào)26用執(zhí)行一般的監(jiān)控。方法傳感器可在適當(dāng)?shù)臈l件和場(chǎng)景中,從私有組件和公共組件中提取事件和屬性。假設(shè)具有多種可擴(kuò)展且可適應(yīng)的傳感器,在用戶GUI上下文中,gMg系統(tǒng)則可從多種類型的源中調(diào)度數(shù)據(jù),以提供對(duì)主機(jī)應(yīng)用程序和環(huán)境處理的全面監(jiān)控。在服務(wù)器環(huán)境中,當(dāng)在操作期間沒有經(jīng)由GUI接口的直接用戶交互時(shí),那么,公共的和私有的全部其它監(jiān)控接口則對(duì)生成gMg監(jiān)控?cái)?shù)據(jù)源保持有效。在服務(wù)器內(nèi)(不具有用戶302)將不會(huì)出現(xiàn)GUI運(yùn)行時(shí)間層303、304和327。然而,用戶服務(wù)器管理工具的GUI則可出現(xiàn)并被監(jiān)控。圖4示出了在典型企業(yè)環(huán)境中使用的gMg組件,參照?qǐng)D4,用戶402可訪問一個(gè)或多個(gè)主才幾應(yīng)用程序404、406、408或由主才幾應(yīng)用程序服務(wù)器410傳送的同一個(gè)應(yīng)用程序的一個(gè)或多個(gè)實(shí)例。gMg系統(tǒng)開發(fā)工具412可創(chuàng)建并封裝準(zhǔn)備部署到用戶的計(jì)算環(huán)境中的gMg方案426。開發(fā)工具包括GUI和方法觀察攻擊、編譯器、調(diào)試器、服務(wù)器分析狀態(tài)機(jī)工具、管理和部署封裝實(shí)用程序、以及集成的開發(fā)環(huán)境。gMg可執(zhí)行對(duì)象包括單一的代理執(zhí)行程序(AgentgMg.exe)414以及一個(gè)或多個(gè)Engine.DLLs416、418、419、420。AgentgMg.exe、一個(gè)或多個(gè)Engine.DLL以及gMg方案的集合包括gMg系統(tǒng)436的實(shí)例。圖4示出了多引擎監(jiān)控主機(jī)應(yīng)用程序406以及Engine.DLLs419。共享存儲(chǔ)機(jī)制442對(duì)多個(gè)引擎之間的協(xié)調(diào)和共享資源方面起作用。在需要時(shí),gMg系統(tǒng)動(dòng)態(tài)地跟蹤主機(jī)應(yīng)用程序內(nèi)的多個(gè)進(jìn)程,傳感器438、439和440則4企測(cè)主沖幾應(yīng)用程序內(nèi)的方法調(diào)用或GUI事件,以構(gòu)建用于收集的數(shù)據(jù)的用戶上下文。對(duì)包括系統(tǒng)上下文的用戶上下文(例如,方法調(diào)用、方法返回以及消息)進(jìn)行捕獲,以創(chuàng)建主機(jī)應(yīng)用程序和系統(tǒng)的環(huán)境譜的"快照(snapshot)"。將AgentgMg.exe和引擎部署在目標(biāo)環(huán)境內(nèi),而不i侖該目標(biāo)環(huán)境是桌面計(jì)算機(jī)、服務(wù)器(GUI模式或非GUI模式)還是終端服務(wù)器(在將光柵化的(rasterized)顯示數(shù)據(jù)傳遞給用戶終端服務(wù)器上執(zhí)行客戶組件的服務(wù)器)。在開發(fā)階段,可選的調(diào)試DLL422、424用于實(shí)時(shí)調(diào)試,其與開發(fā)工具結(jié)合以提供斷點(diǎn)、變量顯示、跟蹤以及其它類型的調(diào)試工具特性。經(jīng)過小的簡單的動(dòng)態(tài)更新之后,gMg方案426、428、430、432、434由編譯過的腳本構(gòu)成,腳本對(duì)分離的或重疊的監(jiān)控目標(biāo)進(jìn)行限定和描述,并執(zhí)行跟蹤操作。這些方案由不同的engine.DLL實(shí)例運(yùn)行,并可在需要時(shí)對(duì)可分離或重疊的監(jiān)控目標(biāo)進(jìn)行跟蹤。檢測(cè)到GUI或方法事件之后,創(chuàng)建跟蹤消息,并由通信模塊444將跟蹤消息發(fā)送至服務(wù)器和跟蹤數(shù)據(jù)庫446。收集服務(wù)器根據(jù)有效的要求和計(jì)算資源進(jìn)行實(shí)時(shí)分析、近實(shí)時(shí)分析、或后期(posttime)分析。處理和分析模塊448的輸出包括警報(bào)450、與外部數(shù)據(jù)源的相關(guān)性(例如后端監(jiān)控統(tǒng)計(jì)452)、或才艮告454。#4居與真實(shí)GUI用戶上下文中與應(yīng)用程序進(jìn)程的交互相關(guān)的聚合的處理數(shù)據(jù)顯示組或詳細(xì)的個(gè)體行為,報(bào)告454可為多種形式。企業(yè)中,技術(shù)支持、訓(xùn)練、基礎(chǔ)設(shè)施支持等的不同角色458可對(duì)報(bào)告的信息或警報(bào)進(jìn)行訪問,以產(chǎn)生改進(jìn)和改正的行動(dòng)456,或支持終端用戶。參照?qǐng)D5,用戶503與具有主^/L應(yīng)用程序網(wǎng)站506的桌上型電腦或終端服務(wù)器上的一個(gè)或多個(gè)并發(fā)的主機(jī)應(yīng)用程序、相關(guān)組件512、以及主才幾應(yīng)用程序的表示GUI509的一個(gè)或多個(gè)實(shí)例545相交互。主機(jī)應(yīng)用程序的元件可位于表示層中,并能夠由用戶調(diào)用操作并接收應(yīng)用程序響應(yīng)。主才幾應(yīng)用程序可同時(shí)運(yùn)行不止一個(gè)實(shí)例,或可同時(shí)運(yùn)行作為主機(jī)應(yīng)用程序的子集的GUI集的多實(shí)例。GUI可在存儲(chǔ)器內(nèi)被組織為分級(jí)結(jié)構(gòu),并可具有多個(gè)GUI對(duì)象子集。這些GUI對(duì)象子集根據(jù)用戶動(dòng)作和控制GUI對(duì)象結(jié)構(gòu)如何生成的應(yīng)用程序的組織邏輯,在運(yùn)行時(shí)間進(jìn)行復(fù)制。除了表示層之外,應(yīng)用程序還包含許多執(zhí)行功能(例如,與服務(wù)器的通信、計(jì)算、環(huán)境屬性檢索、與計(jì)算機(jī)操作系統(tǒng)的交互等)組件或DDL512。組件庫包含用于執(zhí)行功能的方法,方法事件的gMg檢測(cè)提供對(duì)與支持主機(jī)應(yīng)用程序的組件的功能相關(guān)的進(jìn)程的屬性、輸入、輸出、事件或其它信息的訪問。從提供GUI或某些其它底層主機(jī)應(yīng)用程序功能的庫組件中檢測(cè)方法事件。gMg系統(tǒng)利用GUI對(duì)象屬性528和對(duì)象狀態(tài)信息支持分析。一組名稱-值對(duì)及其與其它對(duì)象的關(guān)系反映任何給定時(shí)間的對(duì)象狀態(tài)??墒褂幂喸?cè)谌魏螘r(shí)間通過程序得到屬性的值。對(duì)象還可具有與之相關(guān)的、由傳感器通過腳本定義和控制的定制屬性。從狀態(tài)和之前事件的組合可得到額外的狀態(tài)信息。反作用于主機(jī)應(yīng)用程序的進(jìn)程流的gMg傳感引擎548可生成一組實(shí)時(shí)事件515,這組實(shí)時(shí)事件是從用戶、應(yīng)用程序、OS事件以及GUI對(duì)象和方法屬性的特定值得到的事件。這些事件反映了滿足給定時(shí)刻或應(yīng)用程序的當(dāng)前狀態(tài)(即,環(huán)境i普)的條件。這些事件可為以下多個(gè)類別的事件由例如計(jì)算機(jī)鼠標(biāo)或鍵盤的輸入裝置生成的用戶事件;從用戶動(dòng)作直接得到的事件;由應(yīng)用程序自發(fā)生成(例如,由消息更新刷新窗口)的應(yīng)用程序事件;例如由文件操作、注冊(cè)動(dòng)作或網(wǎng)絡(luò)得到的操作系統(tǒng)事件;以及用于監(jiān)控具體組件功能的方法條用和返回事件。其它事件可具有提供細(xì)節(jié)或其它限定事件的屬性。根據(jù)低級(jí)事件的輸入,可通過條件的邏輯處理隨意地獲得邏輯事件521,以通過狀態(tài)機(jī)確定狀態(tài)。當(dāng)邏輯事件和未處理事件到達(dá)通信模塊524時(shí),其均準(zhǔn)備用于傳輸至遠(yuǎn)程收集服務(wù)器557。該模塊在傳輸之前控制緩沖和壓縮或安全性。緩沖還提供了一種機(jī)制,將數(shù)據(jù)臨時(shí)存儲(chǔ)在收集事件、網(wǎng)絡(luò)、中斷或非連接環(huán)境中。在客戶548和服務(wù)器557之間提供信息交換??蛻敉ㄐ拍K傳送邏輯事件值或選擇的GUI對(duì)象屬性,并從服務(wù)器接收控制命令。在收集和分析階段,將數(shù)據(jù)以跟蹤消息的形式傳送到收集服務(wù)器實(shí)例557,該跟蹤消息可在數(shù)據(jù)塊中處理或存儲(chǔ)。將事件流反多路轉(zhuǎn)換(de-multiplex)為由分析參數(shù)動(dòng)態(tài)確定的分離的用戶邏輯上下文。根據(jù)數(shù)據(jù)是否作為GUI對(duì)象屬性到達(dá),在低層事件或在邏輯層事件中確定如何路由數(shù)據(jù)554。如果作為低層多事件到達(dá),那么,狀態(tài)機(jī)處理則產(chǎn)生邏輯事件530和上下文。然而,如果數(shù)據(jù)作為先前已處理的狀態(tài)機(jī)邏輯事件到達(dá),那么,進(jìn)一步的狀態(tài)機(jī)處理則可產(chǎn)生新的上下文527。當(dāng)通過泛型^f全測(cè)或具體斥企測(cè)^r出時(shí),形成GUI對(duì)象集和泛型的或具體的事件集533。進(jìn)一步的分析完成預(yù)定的度量和狀態(tài)識(shí)別模式536,以產(chǎn)生完全處理的數(shù)據(jù)集。將完全處理形式的數(shù)據(jù)饋送至分析和報(bào)告階段539,用于圖形表示的聚合、趨向和報(bào)告處理,并用于在gMg報(bào)告控制臺(tái)內(nèi)使用。對(duì)于很多用戶,控制臺(tái)是用于例如改變控制、程序修復(fù)、支持、調(diào)試、優(yōu)化等??蛇x地,可將處理過的事件直接路由至系統(tǒng)的動(dòng)作組件542,動(dòng)作組件542包括需要更優(yōu)先地注意的門限條件(例如,錯(cuò)誤或慢響應(yīng)時(shí)間)的顯示和通信。動(dòng)作可包括與外部系統(tǒng)560的通信,外部系統(tǒng)560提供例如發(fā)出支持權(quán)證(supportticket)、自動(dòng)修復(fù)、訓(xùn)練、或最終影響到用戶的其它限定的動(dòng)作。參照?qǐng)D6,gMg系統(tǒng)使用多個(gè)主要類別的事件源。在一般事件610中,具有經(jīng)由API得到的Windows32操作系統(tǒng)事件、鉤子功能和回調(diào)(callback)。這些事件提供到許多不同的通信、屬性和函數(shù)的訪問,所述函數(shù)使得用戶、應(yīng)用程序和操作系統(tǒng)之間的交互的處理的多個(gè)不同方面可訪問。另一個(gè)事件源可來自瀏覽器(例如,因特網(wǎng)瀏覽器事件),其說明了容器應(yīng)用程序如何暴露數(shù)據(jù)模型和類型相關(guān)的事件和屬性,例如用于由監(jiān)聽程序和可用的COM對(duì)象得到的外部處理的DOM(文檔對(duì)象模型)。例如IE的網(wǎng)頁(web)瀏覽器說明了現(xiàn)代因特網(wǎng)應(yīng)用程序GUI的動(dòng)態(tài)特性,這些GUI展示了復(fù)雜的多實(shí)例窗口結(jié)構(gòu)。gMg系統(tǒng)內(nèi),COM監(jiān)聽程序被啟動(dòng),并使用回調(diào)函數(shù)(IEEvents.cpp)檢測(cè)IE事件。將類(class)注冊(cè)到IE,并且,只要事件發(fā)生時(shí)通過COM接口提供了IE對(duì)象屬性的檢索,就調(diào)用該類中的方法。事件類型的另一個(gè)實(shí)施例是調(diào)用-返回方法事件,其提供由gMg傳感器監(jiān)控組件創(chuàng)建的多種傳感器事件。全部這些事件都^皮傳送到gMg解釋腳本625中。在達(dá)到解釋器之前,使用鎖定機(jī)制620將這些事件串行化。鎖定機(jī)制還進(jìn)一步被區(qū)別用于引擎的N個(gè)不同實(shí)例和/或腳本625、630、635。一旦對(duì)腳本進(jìn)行分析并對(duì)已串行化的事件進(jìn)行處理,則在主機(jī)應(yīng)用程序的GUI605內(nèi)執(zhí)行間歇性的輪詢操作(通過應(yīng)用程序掃描640)。同時(shí),具有經(jīng)由計(jì)時(shí)器回調(diào)過程615到達(dá)的操作系統(tǒng)計(jì)時(shí)器事件,該回調(diào)過程以可配置且可調(diào)整的設(shè)置速率對(duì)主機(jī)應(yīng)用程序GUI640的掃描進(jìn)行調(diào)度。這一過程發(fā)生時(shí),由分支記錄結(jié)構(gòu)655、660、665構(gòu)成的gMgGUI對(duì)象樹660變?yōu)槠銰UI的應(yīng)用程序狀態(tài)的系統(tǒng)當(dāng)前視圖的快照的更新、刪除或復(fù)制。gMg腳本還設(shè)置其它計(jì)時(shí)器645,其它計(jì)時(shí)器645以低于對(duì)象gMgWhenObject命令的優(yōu)先級(jí)被處理。命令WhenObject處理65030是當(dāng)不具有由主機(jī)應(yīng)用程序和操作系統(tǒng)產(chǎn)生的事件時(shí),在640創(chuàng)建用于需要同步的GUI對(duì)象的gMg創(chuàng)建和破壞事件的處理。命令WhenObjects提供gMg模擬計(jì)時(shí)器,以輪詢GUI對(duì)象的具體集。不同監(jiān)控進(jìn)程的gMg集提供整個(gè)應(yīng)用環(huán)境和操作系統(tǒng)中的多種源類別。交互速率可控制用于執(zhí)行屬性檢索的只讀操作,以提取細(xì)節(jié)并建立用于跟蹤消息和之后的分析的記錄。以下是在啟動(dòng)過程中建立的GUI支持機(jī)制、進(jìn)程多實(shí)例以及運(yùn)行時(shí)間腳本處理。gMg特性包括GUI對(duì)象樹、多腳本的加載和組織、支持主機(jī)應(yīng)用程序多實(shí)例處理(例如,對(duì)象變量以及WhenObject命令)特性的腳本特性、上下文的提供、截獲、以及GUI對(duì)象集的泛型檢測(cè)。gMg系統(tǒng)可以大量不同的部署方式進(jìn)行配置。在客戶/服務(wù)器配置中,可安裝本地代理及其引擎和方案,以在本地計(jì)算機(jī)上執(zhí)行以檢測(cè)事件。在網(wǎng)絡(luò)環(huán)境中,當(dāng)已安裝了gMg代理和引擎時(shí),可將gMg方案碼注入并安裝在服務(wù)器上,并將gMg方案碼動(dòng)態(tài)地傳送到用戶的本地計(jì)算機(jī)。盡管這一種部署都具有優(yōu)勢(shì),但這兩種部署都將基于共同的結(jié)構(gòu)檢測(cè)事件,并能根據(jù)需要提取具體的屬性。gMg部署配置不限于以上所述,特別地,只要gMg系統(tǒng)是可操作的,其它配置就也在本發(fā)明的范圍內(nèi)。一旦部署了gMg系統(tǒng),啟動(dòng)激活后,就對(duì)命令行進(jìn)行分析用于例如加載腳本、停止等的選項(xiàng),命令行還建立與消息隊(duì)列的通信。對(duì)氣ini文件(可包括腳本或腳本目錄)中的運(yùn)行選項(xiàng)進(jìn)行檢查,并將其發(fā)送至主分析命令行例程。氣ini文件中的腳本列表可在啟動(dòng)時(shí)運(yùn)行,并可注入到多進(jìn)程中。對(duì)函數(shù)changehookTidL的調(diào)用使得gMg.exe通過其自身的窗口將引擎注入其中,并且將其自身的解釋器(gMg引擎)運(yùn)行為如同其在監(jiān)控另一個(gè)應(yīng)用程序。作為一種選擇,與gMg關(guān)聯(lián)的窗口與用于與相同的Agent.exe相關(guān)聯(lián)的、已注入其它應(yīng)用程序的其它gMg引擎的gMg協(xié)議也可用作引擎內(nèi)通信。文件路徑用于構(gòu)造和注冊(cè)特殊的窗口消息,該窗口消息將gMg處理登記到操作系統(tǒng)中。使用gMg.exe模塊的完整路徑名,并且該路徑名變?yōu)榇翱谙⒌奈ㄒ粯?biāo)識(shí)符,以在全部其它實(shí)例與同時(shí)運(yùn)行的代理和引擎的復(fù)制和版本之間區(qū)分,從而允許動(dòng)態(tài)的唯一的實(shí)例運(yùn)行。在實(shí)例之間區(qū)分的能力使得能將安裝在多個(gè)目錄下的gMg.exe分離,以建立其自身的運(yùn)行時(shí)間結(jié)構(gòu)用于適當(dāng)?shù)耐瑫r(shí)操作。如果不多于兩個(gè)的主機(jī)應(yīng)用程序在運(yùn)行,從而不止一個(gè)的gMg引擎實(shí)例在運(yùn)行,并且兩個(gè)引擎都發(fā)出同樣的請(qǐng)求(例如,用于輸出列表),那么,在主目錄下可出現(xiàn)文件沖突,例如文件未能打開或一個(gè)文件改寫另一個(gè)文件。優(yōu)選地,為解決這一問題,將文件名附著于實(shí)例。這變?yōu)榱擞糜趧?dòng)態(tài)多實(shí)例支持的基礎(chǔ)的一部分。在這種條件下,在相同的位置可存在具有相同名稱的兩個(gè)文件。啟動(dòng)后,一個(gè)目標(biāo)在于,當(dāng)需要截獲程序在應(yīng)用程序接收窗口消息之前執(zhí)行對(duì)窗口消息的攔截時(shí),使用鉤子功能設(shè)置gMg監(jiān)控傳感器。鉤子程序處于線程級(jí),其中一個(gè)線程具有一個(gè)鉤子程序。監(jiān)控用于窗口消息的線程使得gMgDLL將注入關(guān)聯(lián)的進(jìn)程空間,其中一個(gè)gMgDLL(通過CALLWNDPROC,具有SetWindowsHookEx的GETMESSAGE鉤子)注入一個(gè)進(jìn)程。如果需要的話,gMg腳本將其它進(jìn)程截獲,并將DLL注入進(jìn)程空間。給定句柄之后,獲得屬于被監(jiān)控的對(duì)象的線程,并驅(qū)動(dòng)線程對(duì)象查找實(shí)例(即,線程id),用于將線程截獲或取下。為了進(jìn)一步控制線程的截獲,函數(shù)ChangeHookTid具有鎖定和解鎖的多個(gè)版本。當(dāng)需要設(shè)置鎖定時(shí),使用鎖定版本。如果已經(jīng)設(shè)置了鎖定,則調(diào)用函數(shù)的解鎖版本。在將共享存儲(chǔ)初始化之后,啟動(dòng)碼還調(diào)用loadDBGDll,將調(diào)試DLL(如果作為選項(xiàng)存在的話)加載至同一個(gè)進(jìn)程空間。由于單一的應(yīng)用程序中通常具有多個(gè)線程,因此,當(dāng)使用腳本解釋器時(shí),gMggMglock執(zhí)行鎖定進(jìn)程,并將全部事件強(qiáng)加于單一的線程。如果應(yīng)用程序中的兩個(gè)線程試圖生成gMg感興趣的事件,或者如果具有來自不同源的N個(gè)事件,引擎則強(qiáng)制實(shí)現(xiàn)事件的串行化。串行化指一個(gè)接一個(gè)處理的事件。解釋器操作碼執(zhí)行碼首先由gMglock鎖定,然后調(diào)用DogMgEvent()處理每個(gè)事件。由gMg.exe函數(shù)調(diào)用的函數(shù)LoadProgram傳遞線程id、腳本文件名和選項(xiàng)(加載/卸載)。gMg系統(tǒng)檢查寬字符,并將文件名傳遞給統(tǒng)一代碼。如果指定的線程id調(diào)用具有星號(hào)"*"的ChangeHook(),那么,解除全部的掛起。由于系統(tǒng)支持引擎的多實(shí)例,因此,可運(yùn)行多個(gè)腳本。然而,當(dāng)請(qǐng)求不止一個(gè)腳本時(shí),系統(tǒng)則控制可啟動(dòng)多少個(gè)腳本(例如,具有星號(hào)通配符的啟動(dòng)腳本不被允許)。如果腳本不具有通配符,那么建立掛起,并掛起具有該掛起的線程。然后Changescript函數(shù)向通過其的線程發(fā)送消息,告知其文件名及其自身的線程id以及可能的選項(xiàng),以加栽/卸載腳本、直接加載程序、4企查運(yùn)行的全部程序的列表、加載具有卸載選項(xiàng)的單一腳本、或者重載腳本。一旦腳本在運(yùn)行,函數(shù)Do—gMgEvent()就傳遞事件中的對(duì)象。并且如果已設(shè)置了鎖定,則對(duì)正在處理的事件的數(shù)量進(jìn)行計(jì)數(shù)。GUI對(duì)象樹圖7和圖8必須在腳本剛啟動(dòng)時(shí)且在對(duì)第一事件進(jìn)行處理之前就建立。優(yōu)選地,每個(gè)腳本都被處理,但是,如果設(shè)置了卸載標(biāo)記,則執(zhí)行腳本卸載操作,包括發(fā)送腳本結(jié)束跟蹤消息。然而,如果腳本還未初始化,那么,首先將啟動(dòng)跟蹤消息(空事件零對(duì)象)發(fā)送至腳本,以將其初始化并發(fā)送用于全部存在的對(duì)象的存在事件。這一動(dòng)作調(diào)用開始監(jiān)聽事件的腳本。對(duì)于每個(gè)腳本,這一啟動(dòng)循環(huán)連續(xù)開始,以去除腳本、初始化或向其傳遞事件。用于同步傳感器和引擎的機(jī)制是共享存儲(chǔ)器的集中式塊,該共享存儲(chǔ)器包含全部gMg主要可執(zhí)行模塊的窗口句柄。gMg代碼檢測(cè)可執(zhí)行程序的終止,或者如果具有另一個(gè)運(yùn)行的版本且如果可執(zhí)行程序的窗口不再存在,那么,則將標(biāo)記清除。狀態(tài)檢驗(yàn)完成后,如果設(shè)置了另一個(gè)標(biāo)記,那么,可選地將消息框顯示為給定狀態(tài),并指示是否有另一個(gè)gMg.exe在后臺(tái)運(yùn)行。如果才企測(cè)到另一個(gè)可執(zhí)行程序,gMg則使用WM—COPY消息將整個(gè)命令行作為數(shù)據(jù)塊傳遞給全部其它引擎實(shí)例,然后退出。然而,如果沒有其他實(shí)例在運(yùn)行,則處理繼續(xù)以創(chuàng)建主窗口。乂人不顯示的gMg.exe的主窗口用于通信以4吏gMg.exe能作為應(yīng)用程序?qū)ζ渥陨磉M(jìn)行監(jiān)控。將保持在共享存儲(chǔ)中的句柄設(shè)置為指向gMg.exe自身的實(shí)例。在終止階段,gMg多實(shí)例處理仍是需要的。在關(guān)機(jī)時(shí),在調(diào)用DLLProcessDETACH期間,進(jìn)程中的標(biāo)記阻止當(dāng)前運(yùn)行的任務(wù)執(zhí)4亍額外的工作,因?yàn)槠渌牟僮魅匀皇钱惒竭\(yùn)行的。在網(wǎng)頁應(yīng)用程序中調(diào)用CleanIEthread()的函數(shù)Cleanthread()調(diào)用斷開和任何回調(diào)或釋放,或者在IE中留下的COM對(duì)象可被清除。DLLProcessDETACH及與其對(duì)應(yīng)的DLLProcessATTACH是遞歸的,以支持多實(shí)例和動(dòng)態(tài)主機(jī)應(yīng)用程序環(huán)境。每個(gè)主機(jī)應(yīng)用程序進(jìn)程至少具有一個(gè)gMg腳本。作為一種選擇,多個(gè)gMg腳本可監(jiān)控單一的進(jìn)程。腳本設(shè)計(jì)以處理進(jìn)程的全部線程,但是單一的腳本監(jiān)控任何數(shù)量的線程,例如在通過一個(gè)窗口一個(gè)線程而建立的應(yīng)用程序中發(fā)現(xiàn)的線程(例如網(wǎng)頁應(yīng)用程序中通常發(fā)現(xiàn)的線程)。腳本被快速處理,而屬性檢索被極高速緩存,用于實(shí)現(xiàn)更好的性能。當(dāng)在相同的線程中讀取屬性或安全地檢索屬性具有不利條件時(shí),則實(shí)施高速緩存。在進(jìn)行交互線程訪問時(shí),或當(dāng)從調(diào)度行為(mashalingbehavior)未知的COM對(duì)象中訪問線程時(shí),尤其是當(dāng)運(yùn)行在IE環(huán)境中時(shí),可發(fā)生潛在的問題。然而,關(guān)于COM對(duì)象的較差線程訪問(尤其是在IE環(huán)境中)的問題變得不那么重要,因?yàn)間Mg事件是由特殊的線程生成的,只對(duì)與該線程相關(guān)的對(duì)象尋址,并且極少對(duì)其它線程中的對(duì)象起作用。當(dāng)對(duì)其它線程中的對(duì)象進(jìn)行處理時(shí),gMg處理必須在對(duì)其它線程的對(duì)象進(jìn)行尋址之前完成對(duì)當(dāng)前線程的處理。通過將事件處理串行化,避免了沖突。串行化防止了例如當(dāng)兩個(gè)線程共享和修改共同的變量時(shí)產(chǎn)生模糊。gMg中的處理由現(xiàn)有技術(shù)中已知的解決通常的并行問題的原則指引。串行化原則用于例如COM和非COM(組件)應(yīng)用程序這兩種組件環(huán)境。在COM環(huán)境內(nèi),接口方法可在多個(gè)線程內(nèi)激活。不論什么線程模型(例如,安全線程、單一線程等),都用gMglock使線程的監(jiān)控串行化。處理IE事件可在每個(gè)線程內(nèi)實(shí)現(xiàn),但是gMg腳本需要為確定性的,并因此對(duì)于每個(gè)事件串行化。按線程處理對(duì)于那些關(guān)聯(lián)的、但由gMg腳本內(nèi)容確定的事件是重要的。gMg系統(tǒng)對(duì)事件進(jìn)程使用單一線程,并將其延伸至任何事件。傳遞到調(diào)用(Invoke)的全部參數(shù)都具有之后用于檢索事件屬性的指針。如果腳本要求事件屬性,那么,其使用事件參數(shù)的一個(gè)全局指針,并檢索事件細(xì)節(jié)。這一機(jī)制使檢索保持為集中式,防止其變?yōu)榉植荚谔辔恢枚鴮?dǎo)致過多的進(jìn)棧/出棧操作。事件和腳本的串行化必須是有效的。例如,如果由單一線程處理應(yīng)用程序的GUI,那么,gMg傳感則被容易地處理。但是,如果應(yīng)用程序具有多個(gè)窗口,每個(gè)窗口都具有各自的線程,那么則可發(fā)生線程沖突。優(yōu)選地,通過使用一個(gè)線程A處理事件,而強(qiáng)迫另一個(gè)線程B等待全局gMglock,可避免這種潛在的問題。由于允許消息被A處理,因此線程B等待gMglock釋放。gMg系統(tǒng)使用鎖定機(jī)制建立生成的事件的串行化。BeginLock(其為LockMacro(鎖定宏))執(zhí)行參數(shù)的互鎖交換,如果其返回0(也就是先前的值為0),則完成了鎖定。設(shè)置線程id,并通過轉(zhuǎn)發(fā)鎖定在何處使用以及實(shí)現(xiàn)鎖定的線程id確定調(diào)用者的位置。當(dāng)BeginLock記錄線程時(shí),另一個(gè)宏gTid使用存儲(chǔ)在gMglock中的線程id。一旦確定已設(shè)置gMglock,gTid則快速得多,這是因?yàn)槠鋬H需要取出存儲(chǔ)在鎖定中的線程id。對(duì)于調(diào)試死鎖(deadlock),如果存在遞歸鎖定,那么beginlockD則可處理具體的動(dòng)作。與僅執(zhí)行超時(shí)或疏忽而導(dǎo)致失敗相反,當(dāng)在某些情況下一級(jí)遞歸被允許具有執(zhí)行用于遞歸的不同動(dòng)作時(shí),BeginlockD也能處理用于遞歸鎖定的具體動(dòng)作。Beginlock執(zhí)4亍互鎖交換并存儲(chǔ)線程id。gMg系統(tǒng)的鎖定機(jī)制等價(jià)于臨界區(qū),但當(dāng)鎖定位于共享存儲(chǔ)器中時(shí),其跨越多個(gè)進(jìn)程工作,并且當(dāng)不具有沖突時(shí),其還非??焖佟H绻嬖跊_突,優(yōu)選地,gMg進(jìn)程強(qiáng)迫調(diào)用執(zhí)行快鎖定Quicklock,Quicklock測(cè)試以查看線程id是否為當(dāng)前的線程id。如果線程id是當(dāng)前的線程id,則保持遞歸計(jì)數(shù)以用于統(tǒng)計(jì),并返回-1。否則,則對(duì)遞歸進(jìn)行標(biāo)記,并將沖突計(jì)數(shù)加1。然后執(zhí)行控制回路,其中回路休眠1.0毫秒,然后醒來并具有IO秒的超時(shí)設(shè)定。通過檢查使得,如果在全局gMglock上完成了鎖定,那么則存在正在凈皮l丸行的對(duì)指令的回路計(jì)數(shù)(即,腳本計(jì)數(shù))。如果gMg腳本很大,當(dāng)大量的參數(shù)和樹中每個(gè)對(duì)象的全部屬性都被取出時(shí),超時(shí)設(shè)定則延伸超過默認(rèn)設(shè)置。如果等待gMglock且執(zhí)行了腳本代碼,那么,如果有沖突的話則僅調(diào)用Quicklock。偶爾地,具有遞歸鎖定(函數(shù)BegLockD),并發(fā)出消息用于診斷。當(dāng)對(duì)封鎖中的超時(shí)進(jìn)行計(jì)數(shù)時(shí),如果存在完全超時(shí),Quicklock則返回0。如果成功設(shè)置了鎖定,函數(shù)則返回l,如果其自身線程已鎖定,則返回-1。應(yīng)該注意到,線程id(tid)可作為參數(shù)傳遞到Quicklock,這樣就不必再對(duì)其檢索。如果某些其它的進(jìn)程具有鎖定的線程、而解釋器仍然在執(zhí)行腳本代碼時(shí),代碼可自動(dòng)擴(kuò)展gMglock_timeout消息。為了進(jìn)行診斷,Quicklock結(jié)構(gòu)包含關(guān)于鎖定的信息、線程id、沖突計(jì)數(shù)、超時(shí)、遞歸計(jì)數(shù)、最后的鎖定的行數(shù)以及模塊文件信息。gMgLock可控制由gMgDbgDLL提供的調(diào)試診斷,用于提供了對(duì)內(nèi)聯(lián)式的診斷以及對(duì)代碼塊的診斷。DbgDLL包含函數(shù)診斷,用于將發(fā)出的診斷枚舉請(qǐng)求傳遞以用于運(yùn)行時(shí)間分析。為了診斷支持,如果未成功地設(shè)置gMgLock鎖定,其則作為失效保險(xiǎn)機(jī)制,并且處理則停止診斷函數(shù)并將其設(shè)置為低優(yōu)先級(jí)。為了對(duì)來自真實(shí)的主機(jī)應(yīng)用程序的事件進(jìn)行建模,gMg系統(tǒng)可包括三個(gè)主要的樹一個(gè)用于例如窗口和html元件的GUI對(duì)象,一個(gè)用于進(jìn)程和線程對(duì)象,一個(gè)用于跟蹤組件模塊和方法。gMg系統(tǒng)還包括計(jì)時(shí)器對(duì)象列表。圖7示出了GUI對(duì)象樹715,其是為全部收集的跟蹤數(shù)據(jù)提供GUI上下文的基礎(chǔ)。GUI對(duì)象樹715可由全部運(yùn)行的腳本775共享,并且其維持每個(gè)腳本的狀態(tài)。圖7中示出了GUI對(duì)象的三個(gè)集一一即,集P725、集Q720、735、740以及集R730。下面介紹用從主才幾應(yīng)用結(jié)構(gòu)的GUI705提取的動(dòng)態(tài)結(jié)構(gòu)更新GUI對(duì)象樹715結(jié)構(gòu)的過程。函數(shù)UpdateTree對(duì)主機(jī)應(yīng)用程序的GUI或者被監(jiān)控的其它進(jìn)程和目標(biāo)進(jìn)行建模。為了向gMg腳本引擎提供事件,需要在環(huán)境中對(duì)動(dòng)態(tài)地改變的對(duì)象進(jìn)行精確檢測(cè)。為此,函數(shù)UpdateTree將全部主要更新處理到其內(nèi)部結(jié)構(gòu),以適當(dāng)?shù)乇O(jiān)控在受控的調(diào)度中,舊的對(duì)象和新的對(duì)象之間的差別。關(guān)于調(diào)度,UpdateTree函數(shù)具有大量機(jī)制來控制對(duì)象的速率與主機(jī)應(yīng)用程序同步。UpdateTree具有其自身的計(jì)時(shí)器,以避免過處理,也就是避免當(dāng)計(jì)時(shí)器在作為時(shí)間的函數(shù)的間隔中運(yùn)行時(shí),其仍然正常地對(duì)樹進(jìn)行掃描。如果由于應(yīng)用程序繁忙而沒有調(diào)用計(jì)時(shí)器事件,那36么,UpdateTree則會(huì)在事件檢測(cè)過程中被調(diào)用。并且,gMg截獲的任何事件都可使UpdateTree代碼仍然運(yùn)行。處理優(yōu)先級(jí)上升到更高級(jí)別,并且即使應(yīng)用程序看起來是被阻塞了,其也使UpdateTree掃描、更新對(duì)象并捕獲信息。UpdateTree還在旁設(shè)置一個(gè)線程,以處理在此期間來自其它線程的全部窗口。例如,如果三個(gè)線程都以每秒兩次的4侖詢速率運(yùn)行,那么,僅有一個(gè)線程被授權(quán)用于檢查來自其它線程的窗口以提高性能。對(duì)象過濾在線程級(jí)實(shí)現(xiàn),輪詢速率可由gMg腳本進(jìn)一步調(diào)整。此外,還具有大量的其它選項(xiàng),例如清除對(duì)象樹,或者處理與僅將處理限制為當(dāng)前線程的處理相反的全部線程。為了處理主機(jī)應(yīng)用程序的動(dòng)態(tài)特性,gMg系統(tǒng)包括跟蹤機(jī)制,跟蹤機(jī)制對(duì)經(jīng)常改變、刪除或創(chuàng)建的GUI對(duì)象的變化狀態(tài)進(jìn)行跟蹤。參照?qǐng)D7,為了適應(yīng)這些變化的條件,保持了將被破壞的對(duì)象的列表760。gMg處理破壞消息并生成發(fā)送至腳本解釋器745的事件770。列表Slist760是包含一系列舊的對(duì)象的列表的結(jié)構(gòu),例如從舊列表750中移除(如果仍然存在的話)、然后添加到新列表755的結(jié)尾處的對(duì)象。先前的對(duì)象集仍然在舊列表中,但是先前不存在的新對(duì)象被添加到新列表755中。在樹720的頂部設(shè)置指向真實(shí)的現(xiàn)有窗口集的指針,將該集的狀態(tài)變?yōu)榕f,然后將其騰空,并建立從該點(diǎn)開始的新列表。當(dāng)掃描應(yīng)用程序GUI時(shí),或者如果不再存在的項(xiàng)將窗口項(xiàng)》文入石皮壞列表,Enumwindows函數(shù)則通過掃描每個(gè)窗口實(shí)現(xiàn)更新,并查找舊列表且根據(jù)需要將其放入新列表。然后對(duì)保留在舊列表中的任何項(xiàng)進(jìn)行處理。接收到保留在舊列表中的任何被破壞的窗口的通知。更新處理發(fā)生在Enumwindowsproc710中?;卣{(diào)函數(shù)Enumwindowsproc由Win32API調(diào)用,用于每個(gè)頂層窗口780。Lparam是指向SList結(jié)構(gòu)的指針。還解鎖窗口線程進(jìn)程id。該函數(shù)獲得窗口線程進(jìn)程id,并檢查舊列表中是否存在該窗口。對(duì)對(duì)象進(jìn)行檢查,以確定其是否在舊列表中。包括指向?qū)ο髽浣Y(jié)構(gòu)的一組指針的舊列表被檢索,并將仍然存在的對(duì)象標(biāo)記以使其根據(jù)需要變?yōu)樾铝斜淼某蓡T。完成后,對(duì)用于窗口的進(jìn)程或線程對(duì)象進(jìn)行處理。如果檢測(cè)到新窗口屬于特殊的線程,那么,系統(tǒng)則創(chuàng)建用于所37述線程的進(jìn)程和線程對(duì)象。使用訪問標(biāo)記作為狀態(tài)指示符,以標(biāo)記對(duì)象是否在窗口或線程的給定進(jìn)程中被列出(作為列表的一部分)。訪問標(biāo)記被檢查,并用于告訴腳本,對(duì)象已通過破壞事件770終止。通常情況下,當(dāng)樹結(jié)構(gòu)沒有改變時(shí),代碼有效地操作。如果沒有改變,代碼則對(duì)對(duì)象解除鏈接,對(duì)用于其線程和進(jìn)程的標(biāo)記進(jìn)行更新,并將窗口鏈接于新列表(例如,將窗口從舊列表移除并放入新列表)。利用線程,檢查的窗口處于相同層級(jí),而沒有窗口處于被檢查的當(dāng)前層級(jí)之下。這一機(jī)制跳過屬于另一線程的任何頂層窗口,并且一次只處理一個(gè)線程。優(yōu)選地,如果處理不受限制,一個(gè)線程的處理將降低到零,這意味著該進(jìn)程已被授權(quán)處理其全部的線程。參照?qǐng)D8,示出了在讀取了窗口806的類之后,對(duì)象樹832上的操作,其中窗口806與腳本812使用相同的接口808。如果該類已在gMg緩存810中,那么,其則不必從作用的應(yīng)用程序804中檢索。如果檢索到的類與(窗口的)IE類相匹配,其則來自屬于對(duì)象樹成員的特殊線程(和當(dāng)前線程814)。樹832中的對(duì)象包含關(guān)聯(lián)的線程id,因此樹的每個(gè)分支都僅由其線程與樹對(duì)象的線程844匹配的窗口服務(wù)。函數(shù)notifydestroytree建立破壞列表816,并廢除舊列表820。如果處理不調(diào)用notifydestroytree,那么舊列表中的先前的舊樹則仍然為保持原樣。但是,如果分支對(duì)象與當(dāng)前的線程相匹配,處理則將繼續(xù)進(jìn)行?,F(xiàn)在,則具有空的新列表822,且全部子窗口都枚舉在下一級(jí)中。處理遞歸地繼續(xù),以捕獲當(dāng)前窗口結(jié)構(gòu)。圖形元件832表示更新之前由P836、834、Q838、842、848、850、852以及R840構(gòu)成的對(duì)象樹。參照更新后的樹854,如果具有新的IE窗口或GUI對(duì)象,則調(diào)用GetIETree,用于對(duì)層次866、870中的HTML子元件進(jìn)行-險(xiǎn)索,然后調(diào)用Notifydestroyrealtree()消除樹中全部剩余舊對(duì)象。這是枚舉用于全部窗口(包括從舊列表到新列表都存在856、858、862、860、868、872的窗口或GUI對(duì)象)的樹的基本處理。一旦對(duì)象在舊列表中被標(biāo)記為廢除的,新創(chuàng)建的每個(gè)對(duì)象866、870都自動(dòng)鏈接到全局列表中。該位置剩余的每個(gè)對(duì)象都調(diào)用變體(即,調(diào)用函數(shù)Notifydestroyevents818),并且在對(duì)樹進(jìn)行分析的過程中。當(dāng)期檢測(cè)到對(duì)象不再存在時(shí),將向腳本發(fā)出破壞事件828。先前的樹結(jié)構(gòu)仍然保持原樣,以使得在舊樹的上下文中發(fā)送破壞事件,以保持gMg腳本的當(dāng)前上下文有序地對(duì)刪除或維持的對(duì)象進(jìn)行更新。函數(shù)SynchTree826處理實(shí)際為新樹的真實(shí)窗口集。Dwindows結(jié)構(gòu)824包含舊樹,舊樹是gMg系統(tǒng)使用的樹。SynchTree代碼的這部分已用真實(shí)窗口下的相同對(duì)象建立新樹,其代表全部新的對(duì)象并向gMg告知舊樹(其保持原樣用于之后由腳本使用)上下文中的全部被^t壞的對(duì)象。調(diào)用SynchTree,該調(diào)用遞歸地將真實(shí)指針復(fù)制到Dwindows中,并導(dǎo)致將真實(shí)的當(dāng)前樹轉(zhuǎn)換為gMg樹。此時(shí),gMg腳本812現(xiàn)在具有到新樹的通道,且舊樹不再存在。此外,全部祐破壞的對(duì)象不再存在于樹864中。現(xiàn)在具有創(chuàng)建的全部新對(duì)象的全局列表。向gMg腳本發(fā)出創(chuàng)建事件830,以向該腳本告知存在的每個(gè)新對(duì)象866、870。同時(shí),如果在已發(fā)現(xiàn)的DOM具有HTML文件對(duì)象,那么函數(shù)IEEvent將被設(shè)置為預(yù)定。完成樹更新處理之后,用于存儲(chǔ)全部新對(duì)象的臨時(shí)列表被解鏈接并被清除。然后對(duì)新對(duì)象列表末端指針重新設(shè)定,以指回列表的頭部。該列表以創(chuàng)建對(duì)象時(shí)這些對(duì)象^皮發(fā)現(xiàn)的順序建立,而不是以相反的順序建立。函數(shù)Updatetree對(duì)應(yīng)用程序進(jìn)行掃描,并生成創(chuàng)建/石皮壞事件。首先發(fā)出用于已消失對(duì)象的破壞事件,然后發(fā)出用于已檢測(cè)到的新對(duì)象的創(chuàng)建事件。在屬于單一gMg.exe(代理)的一組gMg引擎中,可用登記的OS窗口gMg消息建立gMg引擎的不同實(shí)例之間的通信。該消息是唯一的gMg窗口消息,其還使用完整目錄路徑名和模塊文件名(即,gMg.exe)創(chuàng)建。完整目錄名包括用于gMg消息的標(biāo)識(shí)符,并且存儲(chǔ)在共享的存儲(chǔ)區(qū)域,用于由并行運(yùn)行的引擎訪問。登記的窗口消息登記在OS中,因?yàn)槠湟髴?yīng)用程序具有對(duì)計(jì)算機(jī)系統(tǒng)唯一的窗口消息。例如gMg代理及其引擎的應(yīng)用程序?qū)⒄{(diào)用OSAPI函數(shù)傳遞標(biāo)識(shí)串,OS根據(jù)該標(biāo)識(shí)串檢查用于識(shí)別串的內(nèi)部表,并且如果存在的話,則返回已分配的標(biāo)識(shí)符。消息第一次:被應(yīng)用程序發(fā)送時(shí),其4皮添加到內(nèi)部表中,并被分配全局唯一的窗口消息,用于在OS內(nèi)可執(zhí)行的且易失的應(yīng)用程序,如果計(jì)算枳^皮重啟,該標(biāo)識(shí)符則丟失。例如,對(duì)于內(nèi)部程序通信,如果兩個(gè)程序都具有OS登記的窗口消息,那么唯一的串將識(shí)別每個(gè)程序應(yīng)用。OS將返回分別對(duì)應(yīng)于每個(gè)程序?qū)ο蟮奈ㄒ粯?biāo)識(shí)符。登記之后,窗口消息信息被存儲(chǔ)在gMg的共享存儲(chǔ)中,以備由被gMg傳感器注入的全部目標(biāo)進(jìn)程檢索。主目錄包含全部gMg代理系統(tǒng)組件,包括主要可執(zhí)行程序(即,gMg.exe)、DLL、*.ini文件以及其它組件。主目錄的完整OS路徑名在多實(shí)例gMg代理和引擎中起作用。包含主要代理的可執(zhí)行文件的^各徑和目錄用戶包含組件集的關(guān)鍵內(nèi)部gMg實(shí)例。如果在單一的計(jì)算機(jī)上具有多個(gè)代理,那么每個(gè)代理都在其自己的目錄下。此外,gMg引擎的全部運(yùn)行時(shí)間實(shí)例都通過完整文件名和路徑鍵入目錄中,使得多個(gè)安裝的引擎能同時(shí)運(yùn)行。OS對(duì)鍵入每個(gè)DLL名及其路徑的共享存儲(chǔ)塊的一部分進(jìn)行分配,以確保唯一性。該存儲(chǔ)塊獨(dú)立地跨越不同的安裝的引擎,以防止沖突。對(duì)于全部運(yùn)行時(shí)間操作,OS將共享的存儲(chǔ)與每個(gè)引擎DLL的主目錄相關(guān)聯(lián)。參照?qǐng)D9,每個(gè)代理和引擎都可從目錄或從遠(yuǎn)程服務(wù)器位置處加載一個(gè)或多個(gè)腳本939,以支持gMg多實(shí)例能力。如果相同的腳本在N個(gè)進(jìn)程中運(yùn)行以在N個(gè)主機(jī)應(yīng)用程序901、902、903中執(zhí)行,那么腳本945、948、951的N個(gè)實(shí)例和副本將通過918到936的多個(gè)線程在N個(gè)進(jìn)程909、912、915中運(yùn)行。每個(gè)進(jìn)程中還可運(yùn)行不同的腳本,每個(gè)腳本可處理其各自進(jìn)程中的線程?;蛘邌我坏倪B接腳本可監(jiān)控全部N個(gè)進(jìn)程。gMg腳本級(jí)的多實(shí)例主要由腳本數(shù)據(jù)區(qū)處理。為了處理單一引擎中的N個(gè)腳本,函數(shù)LoadProgram942通過命令行執(zhí)行加載操作,或?yàn)間Mg腳本本身中的命令的結(jié)果。通過大量選項(xiàng)(例如,加載、卸載或重載)傳遞文件名。程序列表(PGMLIST)957^L維護(hù)用于同時(shí)運(yùn)行的全部腳本。在程序加載過程中,確定腳本二進(jìn)制文件的大小,并將存儲(chǔ)器分配給具體的大小。一旦文件被成功加載,則關(guān)閉文件。執(zhí)行完整性校驗(yàn),并在塊的起始處查找簽名(Signature)。如果有效,貝'J力卩載有效的文件,并將該文件添加到程序列表(ProgramList)結(jié)構(gòu)的維持的列表957中。程序列表操作包括移除、添加或替換。如果腳本已運(yùn)行,則不進(jìn)行加載。重載操作終止當(dāng)前運(yùn)行的腳本,并加栽具有相同文件名的腳本。當(dāng)腳本名作為程序列表中的標(biāo)識(shí)符時(shí),引擎一次僅能運(yùn)行一個(gè)具有相同文件名的腳本。作為一種選擇,如果腳本位于不同目錄下時(shí),引擎可運(yùn)行具有相同名稱的兩個(gè)腳本。由于名稱也包含了路徑名,因此,具有相同名稱但在不同路徑下的兩個(gè)腳本可被同時(shí)加載和執(zhí)行,而不具有沖突。卸載函數(shù)還允許使用通配符字符(例如,卸載目錄名\*(DirectoryName\*)),將所有對(duì)象從目錄名(DirectoryName)下移除。當(dāng)腳本在進(jìn)程中運(yùn)行時(shí),裝載函數(shù)(LoadProgram)不能被執(zhí)行,因?yàn)長oadProgram942要求通常已由執(zhí)行的腳本設(shè)置的gMg被設(shè)置。如果試圖加載或卸載未處理完事件的腳本,那么在另一個(gè)腳本可被加載之前,操作先停止當(dāng)前的腳本。然后,腳本啟動(dòng)并執(zhí)行加載操作。解釋腳本將事件串行化,并且由于每一遍僅處理單一的事件,因此腳本運(yùn)行非常短的時(shí)間。當(dāng)事件發(fā)生時(shí),腳本運(yùn)行并通常在1或2毫秒內(nèi)就完成對(duì)事件的處理。因此,腳本通常都是不運(yùn)行的,且引擎空閑。當(dāng)具有可能是在高層級(jí)其形式最簡單的許多組織和結(jié)構(gòu)時(shí),腳本的作用就像一組"如果(if)"或"切換(switch)"語句。當(dāng)需要在調(diào)度上對(duì)腳本進(jìn)行遠(yuǎn)程自動(dòng)更新時(shí),如果gMg腳本在運(yùn)行且由gMglock管理,那么則可執(zhí)行對(duì)新版本的更新。通過代理的腳本的控制,可運(yùn)行各種動(dòng)作,例如更新、移除、重載等,也就是可如何根據(jù)需要加載和激活腳本。指定的主gMgMain組件(即,代理)可從服務(wù)器或跨越進(jìn)程的某些其它源接收GLOBAL—RELOAD—SCRIPT消息(其由RUN命令生成)。該消息可由主gMgmain組件變換或直接到命令消息之后,目標(biāo)引擎和/或腳本操作將導(dǎo)致腳本加載或更新命令的執(zhí)行。gMg監(jiān)控系統(tǒng)內(nèi)的兩個(gè)附加特性是ObjectVariables(對(duì)象變量)和WhenObject關(guān)4建字,這兩個(gè)附加特性對(duì)于允許響應(yīng)、建模以及處理多實(shí)例GUI對(duì)象集是重要的。gMg腳本關(guān)鍵字ObjectVariable提供在經(jīng)常改變的環(huán)境中跟蹤不41同對(duì)象集的機(jī)制。優(yōu)選地,為了跟蹤每個(gè)不同進(jìn)程內(nèi)的動(dòng)態(tài)狀態(tài),當(dāng)具有多個(gè)腳本時(shí),每個(gè)腳本都具有其自己的變量集。每一個(gè)變量集都獨(dú)立于其它變量集,并支持每個(gè)引擎和各自的腳本實(shí)例。ObjectVariable提供實(shí)時(shí)響應(yīng)于同時(shí)在多個(gè)進(jìn)程和線程中運(yùn)行的GUI對(duì)象集和子集的潛在的不同實(shí)例的機(jī)制。腳本可被書寫,以反映應(yīng)用程序的運(yùn)行時(shí)間的動(dòng)態(tài)多實(shí)例結(jié)構(gòu)并對(duì)其建模。術(shù)語"ObjectVariables"指gMg腳本"對(duì)象",這些對(duì)象趨向于用于抽象操縱、操作或用于響應(yīng)于動(dòng)態(tài)的主機(jī)應(yīng)用程序GUI結(jié)構(gòu)并與之關(guān)聯(lián)的動(dòng)態(tài)分配。參照?qǐng)D10,gMg對(duì)象變量1035定義了附著于gMg運(yùn)行時(shí)間GUI對(duì)象樹1015中的GUI對(duì)象1020的抽象結(jié)構(gòu)。對(duì)象變量用于表示反映主機(jī)應(yīng)用程序的用戶接口的目標(biāo)GUI對(duì)象或GUI對(duì)象集。此外,對(duì)象變量的將指針存儲(chǔ)到對(duì)象變量內(nèi)部的對(duì)象的能力進(jìn)一步在非常動(dòng)態(tài)的應(yīng)用程序GUI對(duì)象環(huán)境中支持多實(shí)例和多實(shí)例管理。可將對(duì)象參考存儲(chǔ)為對(duì)象內(nèi)的變量或存儲(chǔ)為指向另一個(gè)對(duì)象或?qū)ο笞兞康闹羔?。指向?qū)ο笞兞康闹羔樋蓜?dòng)態(tài)地創(chuàng)建在位于GUI對(duì)象樹1015中的每個(gè)對(duì)象中,并可響應(yīng)于多實(shí)例主才幾應(yīng)用程序;f企測(cè)凈皮分配其自己的變量集。此外,可將對(duì)象指針存儲(chǔ)在不論是否位于某些其它結(jié)構(gòu)內(nèi)的GUI對(duì)象樹中任何對(duì)象變量中,或者可在別處獨(dú)立地對(duì)該對(duì)象指針明確地說明。例如,如果具有同一類型的兩個(gè)對(duì)象變量,那么每個(gè)對(duì)象變量則具有其自己"私有的"變量集。這些變量位于GUI對(duì)象樹中的對(duì)象內(nèi),而不位于腳本的數(shù)據(jù)區(qū)域內(nèi)。在另一個(gè)實(shí)施例中,如果對(duì)象樹中具有二十個(gè)對(duì)象,那么則具有用于二十個(gè)變量集的、由gMg引擎動(dòng)態(tài)分配的二十個(gè)相應(yīng)的位置。參照?qǐng)D10,任何給定的對(duì)象變量1005可附接變量列表1010,其中的關(guān)聯(lián)由函數(shù)Setnumobjvar(ObjHandle,Progid)處理。在編譯時(shí),可在腳本內(nèi)生成用于該對(duì)象變量的唯一id(例如,分配給其的對(duì)象變量名稱值)。在gMg腳本1040中,可為分配到物理結(jié)構(gòu)的腳本對(duì)象變量分配值。對(duì)附著于對(duì)象的數(shù)字的或字符串的或其它類型的對(duì)象變量列表進(jìn)行掃描,直到發(fā)現(xiàn)屬于當(dāng)前程序結(jié)構(gòu)的、并包含在為對(duì)象變量編譯程序時(shí)分配的匹配id的對(duì)象變量。由于具有具體的對(duì)象變量集1039,每個(gè)對(duì)象變量集都具有其各自的變量列表用于每個(gè)程序腳本,因此,當(dāng)運(yùn)行多個(gè)腳本或程序時(shí),每個(gè)腳本都具有其子集的對(duì)象變量,即使其引用1045全部其它并發(fā)腳本共享或引用的、應(yīng)用程序的相同GUI對(duì)象。一組腳本將共享反映運(yùn)行進(jìn)程的相同GUI對(duì)象樹1015,每個(gè)腳本都具有包含在對(duì)象樹內(nèi)的、附著于每個(gè)對(duì)象變量1039的其自己的獨(dú)立變量集,用于多實(shí)例支持。優(yōu)選地,具有單一的對(duì)象樹,其可擴(kuò)展具有相似的實(shí)例支持結(jié)構(gòu)的多個(gè)樹。狀態(tài)變量的這種動(dòng)態(tài)分割帶來了同時(shí)對(duì)應(yīng)用程序的GUI的多個(gè)實(shí)例進(jìn)行跟蹤的能力。作為對(duì)象變量的實(shí)現(xiàn)的實(shí)施例,可由多個(gè)單獨(dú)的腳本同時(shí)從不同角度對(duì)同一個(gè)頁面進(jìn)行跟蹤。為此,運(yùn)行腳本并建立監(jiān)聽程序和傳感器。當(dāng)事件發(fā)生時(shí),將事件發(fā)生到每個(gè)單獨(dú)的腳本,每個(gè)腳本確定如何獨(dú)立地處理事件。作為一種選擇,在另一個(gè)實(shí)施方式中,每個(gè)gMg對(duì)象變量(例如,位于對(duì)象樹中、或?yàn)槠渌Y(jié)構(gòu),并對(duì)應(yīng)于應(yīng)用程序GUI對(duì)象或內(nèi)部抽象組織)可依次包括在腳本中說明的對(duì)象屬性值(例如,字符串、布爾值、數(shù)值等)。這就提供了進(jìn)一步的處理深度,用于對(duì)不同狀態(tài)的對(duì)象變量及其屬性進(jìn)行比較、條件測(cè)試、或?qū)崿F(xiàn)邏輯。第二gMg命令,也就是圖11所示的WhenObject關(guān)鍵字,是支持gMg監(jiān)控系統(tǒng)1133中的多實(shí)例能力的另一特征。參照?qǐng)D11,WhenObject是在屬于主機(jī)應(yīng)用程序1103的GUI對(duì)象樹1115中附著于任何對(duì)象1106、1109、1112的對(duì)象。WhenGUI對(duì)象在樹中是多實(shí)例的,WhenObjects也是多實(shí)例的。WhenObject命令的作用是在不存在與主^L應(yīng)用程序GUI的改變相關(guān)^f關(guān)的明顯事件(由OS、主^L應(yīng)用程序或其容器發(fā)出的明顯事件)時(shí),檢索屬性或估計(jì)GUI對(duì)象屬性的變化。有時(shí),當(dāng)沒有事件發(fā)生時(shí),也會(huì)有GUI屬性變化。相反,有時(shí)有事件發(fā)生但沒有GUI屬性發(fā)生變化。其它時(shí)候,識(shí)別使用哪些事件檢測(cè)目標(biāo)屬性的改變變得更加困難或模糊。通過經(jīng)由輕量輪訓(xùn)機(jī)制訪問GUI對(duì)象屬性,WhenObject命令解決了這些問題。具體的gMg腳本命令WhenObject使得在WhenObjects例程中將調(diào)用PollWhenObjects1148。該例程將腳本^碼塊1160與WhenObject431157相關(guān)聯(lián),并保持跟蹤其屬于哪個(gè)腳本。在主機(jī)應(yīng)用程序進(jìn)程中運(yùn)行有多個(gè)線程1121、1124、1127,在每個(gè)線程中,由gMg代碼分別實(shí)現(xiàn)對(duì)Pollwhenobjects()的調(diào)用1148。每個(gè)線程首先設(shè)置gMglock1120,以使腳本引擎僅執(zhí)行一個(gè)腳本,也就是在事件串行化過程中一次執(zhí)行一個(gè)事件。此時(shí),對(duì)全部相關(guān)的WhenObjects的列表1151進(jìn)行處理。具有清除操作,其中,如果WhenObject與GUI對(duì)象斷開連接,則將其舍棄(即,將GUI對(duì)象刪除),并且將其相應(yīng)的WhenObject對(duì)應(yīng)物從WhenObject列表中移除。如果GUI對(duì)象屬于當(dāng)前運(yùn)行的線程,那么該線程則運(yùn)行適當(dāng)?shù)腤henObject。當(dāng)前程序被設(shè)置以引用發(fā)出WhenObject請(qǐng)求的任何gMg程序腳本,然后設(shè)置代碼指針1157,代碼指針1157為指向WhenObject條件表達(dá)式的腳本解釋器程序計(jì)數(shù)器,該條件表達(dá)式在測(cè)試WhenObject執(zhí)行是否應(yīng)該激活的腳本代碼1160的片段中限定。腳本程序計(jì)數(shù)器指向腳本代碼(即,建立上下文的程序結(jié)構(gòu))。其指向在腳本代碼的主體中被編譯的實(shí)際布爾表達(dá)式,且發(fā)出WhenObject事件。在附著有WhenObject的GUI對(duì)象樹1136中存在對(duì)象1139、1142、1145。調(diào)用Getnumber(),且如果其估計(jì)為真實(shí),那么WhenObject則變?yōu)榛顒?dòng)的。表達(dá)式在腳本程序和事件對(duì)象的上下文中被估計(jì),并設(shè)置"執(zhí)行上下文(executioncontext)"。該上下文確保了處理發(fā)生在正確的進(jìn)程、線程、樹中的GUI對(duì)象等中。gMg腳本對(duì)WhenObject事件進(jìn)行處理,該WhenObject事件為被處理的全局(當(dāng)前的)事件。WhenObject事件的對(duì)象是對(duì)象樹中鏈接于由適當(dāng)?shù)木€程處理的WhenObject結(jié)構(gòu)的對(duì)象。如果表達(dá)式為真,則將其添加到統(tǒng)計(jì)數(shù)字中,該統(tǒng)計(jì)數(shù)字保持關(guān)于WhenObjects多少次變?yōu)榛顒?dòng)的信息。不斷地對(duì)命令進(jìn)行處理,直到遇到停止操作碼。在gMg解釋器1153(以及主機(jī)應(yīng)用程序進(jìn)程中的示出的運(yùn)行1130)中,函數(shù)ExecCommand()執(zhí)行g(shù)Mg腳本的操作碼集。變量gPC指針是指向腳本代碼(指向條件表達(dá)式并且在條件表達(dá)式之后緊接著是一系列語句,然后接著是停止操作碼)的全局解釋器程序計(jì)數(shù)器。對(duì)表達(dá)式進(jìn)行估計(jì),使得程序計(jì)數(shù)器通過該表達(dá)式。如果表達(dá)式為真實(shí)的,那么則使其指向第一語句并執(zhí)行命令,在這種情況下,具有WhenObject命令。這樣,WhenObject命令通過表達(dá)式Getnumber執(zhí)行輪詢才喿作,Getnumber獲取對(duì)象的屬性,然后執(zhí)行腳本命令。來自全部腳本的全部WhenObject進(jìn)入集中式列表1151。此外,腳本對(duì)象指示與各腳本之間的關(guān)聯(lián)。當(dāng)腳本終止時(shí),將WhenObject(結(jié)構(gòu))移除,而當(dāng)對(duì)象終止時(shí),也將具體的對(duì)應(yīng)的WhenObject移除。結(jié)構(gòu)gWhenObject是來自全部并行的多實(shí)例腳本的WhenObject的集體列表。WhenObject需要由腳本的線程執(zhí)行,由線程控制確定何時(shí)在哪個(gè)線程中執(zhí)行哪個(gè)腳本。因此,在當(dāng)前線程中,僅對(duì)與當(dāng)前線程相關(guān)聯(lián)的WhenObjects進(jìn)行處理。線程在執(zhí)行函數(shù)之前,設(shè)置用于各腳本1154的上下文(對(duì)1130處位于應(yīng)用程序進(jìn)程中的引擎和腳本的擴(kuò)展表示)。通過設(shè)置上下文,線程看到屬于該腳本的對(duì)象變量,并阻止對(duì)其它腳本的對(duì)象變量進(jìn)行訪問。WhenObjects可為對(duì)于運(yùn)行的全部腳本而言是集中式的。以下代碼樣本示出了gMg系統(tǒng)的多實(shí)例能力的實(shí)施方式。該腳本檢測(cè)不限數(shù)量的線程,每個(gè)線程控制一個(gè)同時(shí)具有不限數(shù)量的消息窗口的彈出式窗口。如果gMg腳本對(duì)應(yīng)用程序中的每個(gè)GUI對(duì)象的使用期限進(jìn)行監(jiān)控以用于完整監(jiān)控,那么則需要?jiǎng)?chuàng)建多個(gè)實(shí)例結(jié)構(gòu)。對(duì)于每個(gè)對(duì)象而言,gMg自動(dòng)維護(hù)表示GUI對(duì)象的實(shí)例的結(jié)構(gòu)。對(duì)象樹具有用于每個(gè)對(duì)象的屬性高速緩存,并具有用于每個(gè)對(duì)象的對(duì)象變量存儲(chǔ)?!?Manylnstances"-thisscripthandlesanunlimitednumberofobjectsobjvarcreatetime:number;if(create)〃oncreation{createtime=sys一time;〃createtimeisanobjvarthatiscreated(hencean〃instance)forthecurrentEvent.Whereaninstanceis〃aresultantactionoftheEventvars=title;〃sisatemporaryvariableandillustratesgMg'ss=class;〃instantiatingability.Heretitleandclassforthe}〃currentobjectarestoredseparatelyinsidetheGUIObjectTreeif(destroy){〃thecurrenttime—createtime(whichtookplacepreviously)yieldsthe〃lifetimeoftheobjectdbg(objtypename(objtype)+'['+title+']['+class+']existedfor'+string(sys—time-createtime)+,ms\n,);}〃.............——..................■〃Booleanexpressionthatindicatesifthecurrentobjectisapopupwindowfunctionispopup=iswindow&&title=='blabla'&&class='whatever';〃indicatesifthecurrentobjectisamessagewindowofinterestfunctionismsgwindow=iswindow&&title='blabla'&&class='whatever';〃ifacreateeventandthecreateisapopup,andinthethreadobjectofthepopup〃storeaptrtotheobjectthatpoppedup,objectisakeywordthatreferstothe〃currentobjecti.e.theobjectthat'sbeingcreated,createsaptrtothepopupin〃thethreadobjectwhateverthreadtheobjectbelongstoobjvarmypopup:object;if(create&&ispopup&&thread.mypopup=none)〃ifacreate,threadvalwouldbeemptythread.mypopup=object〃pointertopopupobject〃ifadestroyevtandtheobjectbeingdestroyedandtheobjectisinthread.mypopupif(destroy&&object=thread.mypopup)thread.mypopup=none;〃clearsthread.mypopup〃whenamessagewindowiscreatedaWhenObjectisattachedtoobjvar〃prevtitle;checkingifthetitlechangedcomparedtotheprevtitlei.e.the〃changedfn.objvarprevtitlerstring;if(create&&ismsgwindow)WhenObject(changed(livejitle,prevtitle)&&thread.mypopup!=none)〃threadvalisnonzero大量關(guān)鍵字或?qū)ο笞兞慷x具有響應(yīng)于當(dāng)前對(duì)象由GUI對(duì)象(例如,"prevtitle"、"title"和"class")的動(dòng)態(tài)分配確定的隱含4亍為,其中當(dāng)前對(duì)象是反映當(dāng)前事件和由解釋器處理的當(dāng)前對(duì)象的結(jié)構(gòu)。變量mypopup是對(duì)象變量。在處理期間,調(diào)用函數(shù)Getnumobjvar()。初始化之后,首先發(fā)現(xiàn)對(duì)象不存在,并返回默i人值零。然后調(diào)用函數(shù)SetObjObjVar(),將當(dāng)前對(duì)象的基準(zhǔn)值置于用于彈出式窗口的位置,并且將彈出式窗口的基準(zhǔn)值置于其自己的線程對(duì)象中。"LiveTitle(活動(dòng)標(biāo)題)"是當(dāng)前的,其在標(biāo)題變化的情況下刷新標(biāo)題,如果活動(dòng)標(biāo)題值與先前的標(biāo)題不同,則"LiveTitle"為真,其中先前的標(biāo)題存儲(chǔ)在消息窗口對(duì)象中。例如,如果應(yīng)用程序創(chuàng)建十個(gè)消息窗口,那么每個(gè)消息窗口則將具有其自己的先前的標(biāo)題值,并將保持對(duì)全部標(biāo)題變化進(jìn)行跟蹤。十個(gè)WhenObject與每個(gè)消息窗口相關(guān)聯(lián)。系統(tǒng)對(duì)消息窗口進(jìn)行監(jiān)控,每個(gè)消息窗口將被監(jiān)控,以檢測(cè)"LiveTitle"的內(nèi)容,即,乂人先前標(biāo)題變化為當(dāng)前標(biāo)題(改變的命令)。如果其值為真,且彈出式窗口標(biāo)題為"abc",那么則檢查各彈出窗口是否在與消息窗口相同的線程中運(yùn)行。因此,當(dāng)消息窗口標(biāo)題改變且顯示的彈出式窗口標(biāo)題是"abc"時(shí),當(dāng)檢測(cè)到之后,條件分析為正確且執(zhí)行WhenObject動(dòng)作。WhenObject激活用于4企測(cè)到的每個(gè)消息窗口,然后通過用于彈出式窗口的測(cè)試進(jìn)一步對(duì)其限定??删哂胁幌迶?shù)量的線程,每個(gè)線程可具有不限數(shù)量的消息窗口,但是只允許一個(gè)彈出式窗口用于一個(gè)線程。該代碼還示出了對(duì)象內(nèi)的對(duì)象指針(即,thread.mypopup=object)。作為實(shí)施例,可具有二十個(gè)線程,其中的每個(gè)線程都具有自己的彈出式窗口。對(duì)于每二十個(gè)線程,名為mypopup的變量記錄關(guān)于每個(gè)線程的信息及其相應(yīng)的彈出式窗口。根據(jù)這些結(jié)構(gòu),可跟蹤每個(gè)線程變量各自的彈出式窗口是否存在。下面介紹gMg上下文及其在GUI結(jié)構(gòu)的多實(shí)例識(shí)別中的作用。參照?qǐng)D12,gMg腳本上下文關(guān)4建字說明了分級(jí)的組織實(shí)體,該實(shí)體表示多實(shí)例GUI應(yīng)用程序結(jié)構(gòu)的一部分,以向服務(wù)器提供上下文信息以支持對(duì)收集的跟蹤數(shù)據(jù)進(jìn)行分析。上下文命令可用于全部對(duì)象類型。頂層是進(jìn)程1215,但是如果該進(jìn)程具有多個(gè)頂層窗口1210,那么從當(dāng)前進(jìn)程的頂層窗口開始的子上下文則建立窗口的分層關(guān)系,以表示并識(shí)別用于發(fā)送到服務(wù)器的生成的跟蹤事件的上下文。上下文描述在描述多種對(duì)象組織方面是靈活的。如果指定了頂部窗口,那么跟蹤消息就形成有頂部窗口及其父類進(jìn)程,否則,僅發(fā)送進(jìn)程。為了跟蹤進(jìn)程范圍內(nèi)的事件,可設(shè)置上下文以進(jìn)行處理,但是,如果跟蹤例如多個(gè)彈出窗口1205的對(duì)象,上下文則可相對(duì)于發(fā)生事件的具體的彈出式窗口設(shè)置。根據(jù)定義,上下文設(shè)置由服務(wù)器分析的隱含分級(jí)。存在有五層分級(jí)的任意門限,該門限與每個(gè)跟蹤消息記錄一起發(fā)送。對(duì)于多數(shù)情況來說,五層被認(rèn)為是足夠的。但是,層級(jí)門限可容易地?cái)U(kuò)展或減少。參照?qǐng)D13,如果在主^/L應(yīng)用程序的GUI樹組織1305中,存在GUI對(duì)象或GUI對(duì)象集或?qū)ο蟮亩鄠€(gè)相似實(shí)例,那么,上下文層級(jí)值變得很重要。例如,如果給定具有多個(gè)線程1320到1335(其具有多個(gè)彈出式窗口1340到1355,即,每個(gè)窗口用于一個(gè)線程)的進(jìn)程1315,且每個(gè)彈出式窗口包含具有多個(gè)標(biāo)簽1360的標(biāo)簽窗口,那么,這就描述為第四層上下文。上下文提供外部信息,該外部信息在每個(gè)實(shí)例可-陂識(shí)別時(shí)是有用的(例如,如果窗口中一組標(biāo)簽中的每個(gè)標(biāo)簽是唯一的)??紤]典型窗口GUI對(duì)話框的改變字體大小標(biāo)簽中的OK按鈕,在此實(shí)施例中,當(dāng)相似的OK按鈕的多個(gè)相同實(shí)例和結(jié)構(gòu)同時(shí)出現(xiàn)時(shí),上下文是絕對(duì)必要的。尤其是網(wǎng)絡(luò)應(yīng)用中的微軟IE瀏覽器允許多線程,其中每個(gè)線程可具有與其它線程相同的網(wǎng)頁。對(duì)于具有這種深層GUI對(duì)象的應(yīng)用程序而言,上下文是絕對(duì)必要的,其中每個(gè)GUI都具有多實(shí)例。由于上下文通??赏ㄟ^屬性和用于檢測(cè)的其它機(jī)制識(shí)別,因此,五層是足夠的。在另一個(gè)實(shí)施例中,對(duì)于通常在網(wǎng)頁應(yīng)用程序中發(fā)現(xiàn)的具有多個(gè)標(biāo)簽的窗口而言,僅發(fā)送標(biāo)簽控件名或其它標(biāo)記就可指示哪個(gè)標(biāo)簽存在或被點(diǎn)擊。然而,如果全部標(biāo)簽控件都具有相同的結(jié)構(gòu)用于不同位置的應(yīng)用程序,那么,為了在不同的標(biāo)簽中進(jìn)行區(qū)分以用于活動(dòng)跟蹤,則需要另一個(gè)上下文層級(jí)定義。附加的上下文層級(jí)傳遞數(shù)據(jù)(例如唯一id和/或參考值),并反映每個(gè)標(biāo)簽中的具體值。在另一個(gè)實(shí)施例中,聯(lián)系人應(yīng)用包含顧客信息記錄,并向用戶顯示包括姓名、地址、電話和電子郵件數(shù)據(jù)的多個(gè)顧客記錄。在這種情況下,全部記錄都具有由單獨(dú)線程和單獨(dú)彈出窗口構(gòu)成的相同的內(nèi)部結(jié)構(gòu),但包含對(duì)每個(gè)顧客唯一的內(nèi)容信息。彈出式窗口具有相同的結(jié)構(gòu),但是每個(gè)彈出式窗口具有唯一的內(nèi)容。在頂層結(jié)構(gòu)中,這些彈出式窗口看起來與沒有附加信息的gMg系統(tǒng)是相同的。為了解決這種模糊性,將外部上下文層級(jí)用于區(qū)分不同的彈出式窗口,從而得到重新配置的上下文信息,該信息用每個(gè)跟蹤消息發(fā)送到服務(wù)器。在服務(wù)器上,將共同的上下文層級(jí)分組到一起,以跟蹤在每個(gè)GUI窗口結(jié)構(gòu)內(nèi)發(fā)生的事件,這樣,如果在一個(gè)窗口上進(jìn)行了點(diǎn)擊,則不會(huì)與其它窗口上的點(diǎn)擊混淆。除了GUI對(duì)象,線程對(duì)象也可作為識(shí)別處理的目標(biāo)。線程可在上下文中識(shí)別,其中GUI多線程應(yīng)用程序中的每個(gè)應(yīng)用程序線程都指定有其各自的上下文。給定具有多線程和多個(gè)相同的頂部窗口的應(yīng)用程序,將引入額外的層級(jí)(進(jìn)程中的線程對(duì)象)和用于識(shí)別的線程id。當(dāng)具有多個(gè)相同的線程,其中每個(gè)線程都具有相同的頂部窗口,從而需要對(duì)每個(gè)頂部窗口群中的活動(dòng)獨(dú)立于其它相同頂部窗口中的活動(dòng)進(jìn)49行跟蹤時(shí),這樣就處理了多線程的情況。由于多個(gè)線程可表現(xiàn)為相同的,因此,定義其它的對(duì)象或關(guān)系(例如,先輩)以識(shí)別不同的線程及其相關(guān)聯(lián)的對(duì)象。當(dāng)識(shí)別GUI結(jié)構(gòu)并從而識(shí)別事件時(shí),在許多網(wǎng)頁應(yīng)用(例如工業(yè)標(biāo)準(zhǔn)CRM(顧客關(guān)系管理)應(yīng)用)中都會(huì)遇到這種模糊的情況。在不同的實(shí)施中,例如在微軟CRM應(yīng)用(CRM是微軟^司的產(chǎn)品)中,發(fā)現(xiàn)彈出式窗口可為任何新的活動(dòng)而打開,然后創(chuàng)建新的線程,然后則需要?jiǎng)?chuàng)建與用于附加彈出式窗口一樣多的許多線程。在這種情況下,gMg的線程上下文的使用將分離的彈出式窗口區(qū)別開來。然而,如果僅具有一個(gè)層級(jí),并且在彈出式窗口內(nèi)可創(chuàng)建附加的多個(gè)相同的窗口實(shí)例,那么則需要附加的上下文層級(jí)。最終,微軟CRM實(shí)施例僅要求兩個(gè)層級(jí)。層級(jí)數(shù)量的擴(kuò)展可證明為更方便的,并可保留用于將來的擴(kuò)展。作為一種選擇,可在彈出式窗口中利用其它屬性進(jìn)行區(qū)分。通過定義具有足夠深度(分辨率)的GUI對(duì)象上下文層級(jí),可將其它方面相同的GUI對(duì)象結(jié)構(gòu)區(qū)分。如果具有多個(gè)相同的GUI對(duì)象結(jié)構(gòu)窗口,則可^f吏用頂部窗口將其分組。邏輯組中的之間與目標(biāo)GUI對(duì)象相關(guān)聯(lián)。gMg上下文特征支持多實(shí)例能力,用于進(jìn)行對(duì)象區(qū)分。下面討論為了支持多實(shí)例以建立掛起而進(jìn)行識(shí)別和事件檢測(cè)的問題,討論提供了用于gMg系統(tǒng)的一個(gè)主要事件類別。參照?qǐng)D14,ChangeHook和lockgMgEngine傳遞線程id,并根據(jù)需要掛起應(yīng)用程序進(jìn)程1406。然后,發(fā)送gMg消息1424,并用函數(shù)PostgMgMsg()將其登記到應(yīng)用程序中。利用傳遞的線程id,PostgMgMsg函數(shù)找到使用該線程id的窗口,然后設(shè)置窗口消息。如上所述,gMg使用.exe的完整路徑名登記其唯一的窗口消息,該路徑名寸吏得多個(gè)gMg.exe具有唯一性。PostgMgMsg通用地工作,并發(fā)送消息的多個(gè)副本以完成登記過程,其中成功的第一消息與丟棄的剩余消息一起在系統(tǒng)中使用。共享存儲(chǔ)1454用于對(duì)每個(gè)gMg代理或引擎實(shí)例的gMg消息的廢棄進(jìn)行控制和跟蹤。對(duì)于診斷支持,tmdiagnostics包含在消息wparam中,具有指向位于共享存儲(chǔ)中的診斷數(shù)據(jù)的50lparam。當(dāng)某些gMg組件需要診斷信息時(shí),gMg窗口消息則發(fā)送diag—exports消息,該消息到達(dá)一個(gè)winhook例牙呈。在來自操作系統(tǒng)1403的時(shí)鐘1457的驅(qū)動(dòng)下,所有運(yùn)4于的掛起例程1433到1442最終都攔截消息,并調(diào)用例程Handlemsg()1445。在Handlemsg內(nèi),在getmessagehook例禾呈1445處,基于當(dāng)前由系統(tǒng)i殳置的掛起數(shù)量,將getmessagehook與數(shù)N相連接。掛起在O-N的一組宏1427中實(shí)現(xiàn),這組宏調(diào)用函數(shù)handlegetmsghookmessage1430。當(dāng)掛起操作完成后,還具有指向每個(gè)例程的指針陣列,其中在編譯過程中將autoinline設(shè)置為關(guān)閉,以防止gMgMsg例程在每個(gè)實(shí)例中被多次復(fù)制。此夕卜,在Handlemsg中,具有N個(gè)Sendmessagehooks,其也對(duì)調(diào)用HandleMsgHookMsg1451的sendmessage1448消息進(jìn)行處理。這些例程將攔截消息,而不管消息的來源。優(yōu)選地,使用主才幾線程1409、1412、1418、1421,而不是創(chuàng)建專用的工作線程用于對(duì)處理進(jìn)行監(jiān)控。僅使用在進(jìn)程中創(chuàng)建的計(jì)時(shí)器使窗口創(chuàng)建最小化,以建立回調(diào)函數(shù)。此外,由于掛起的目標(biāo)是要透明且最小地侵入,因此不創(chuàng)建工作窗口。即使建立了工作窗口,該窗口也需要計(jì)時(shí)器用戶進(jìn)程控制。gMg系統(tǒng)向主^/L應(yīng)用程序的現(xiàn)有窗口發(fā)送消息,然后攔截消息。消息很少被跨越進(jìn)程地發(fā)送,但是如果的確發(fā)生了這樣的事情,那么將對(duì)主機(jī)應(yīng)用程序中的N個(gè)不同窗口進(jìn)行搜索。一旦查找到gMg,其則在每個(gè)窗口中設(shè)置掛起,并且在消息到達(dá)各自的目標(biāo)窗口時(shí)攔截消臺(tái)當(dāng)每個(gè)線程具有一個(gè)掛起時(shí),tid宏得到當(dāng)前線程id。通常,從擁有當(dāng)前線程的窗口接收消息。但有時(shí)候也從其它窗口線程接收消息。執(zhí)行sendmessage的線程必須屬于相同的進(jìn)程,否則,DLL必須侵入未明確掛起的另一個(gè)外來進(jìn)程。如果Sendmessage由不同的進(jìn)程啟動(dòng),那么則將其放入目標(biāo)進(jìn)程中,然后在該進(jìn)程中分配調(diào)用掛起例程的線程。Handlemsgs例程/人Getmsghook()和Sendmsghook()1445中調(diào)用。消息處理具有一致的行為,即,不論消息如何到達(dá),gMg都嘗試進(jìn)行截獲oGetExtParams()用于在SendMessage調(diào)用期間使用gMg進(jìn)程內(nèi)窗口消息(例如,加載腳本、卸載引擎等)將額外的參數(shù)和信息傳遞穿過多個(gè)進(jìn)程。其在共享存儲(chǔ)中具有鎖定,包括版本號(hào)和索引。該函數(shù)將版本號(hào)屏蔽,并可索引到共享存儲(chǔ)中的陣列中,以得到將在索引之后用消息傳遞的附加數(shù)據(jù)。如果(包括該版本的)共享存儲(chǔ)id與要求的id不匹配,該共享存儲(chǔ)id則為廢棄的條目。32位數(shù)id不斷增加。最后六位是到ExParams結(jié)構(gòu)中的循環(huán)緩沖器的索引。如果緩沖器中的32位id與傳遞的參數(shù)不匹配,那么則確定該id已^皮重復(fù)使用或凈皮廢棄。GetExtPamms()讀取lparam,并且如果其為廢棄的,則返回空值。如果lparm不為廢棄的,則用外部參數(shù)處理消息。具有用于將引擎的釋放版本的代碼移除的宏。還用測(cè)試4企查是否加載了dbgdll。在gMg系統(tǒng)中檢測(cè)GUI對(duì)象集的GUI對(duì)象檢測(cè)機(jī)制稱為泛型檢測(cè)GUI事件。具有兩類GUI對(duì)象操作具體的和泛型的。在泛型方法中,通過非常少的操作描述符對(duì)對(duì)象進(jìn)行檢測(cè),以創(chuàng)建一組或一類GUI對(duì)象??蓪?duì)饋送到函數(shù)中的輸入?yún)?shù)進(jìn)行分析,以檢測(cè)一類GUI對(duì)象,而不是僅檢測(cè)一個(gè)具體的GUI對(duì)象。在客戶機(jī)上,在圖15的GUI檢測(cè)的鐠(spectrum)1515中,特意將gMg腳本表達(dá)式示為更泛型的1510(例如,用于4企測(cè)相關(guān)GUI對(duì)象的整個(gè)類別)或更具體的1505(例如,用于檢測(cè)單一的GUI對(duì)象)。檢測(cè)表達(dá)式可檢測(cè)對(duì)該概念語中任何位置的GUI對(duì)象進(jìn)行檢測(cè)。gMg傳感器收集主機(jī)應(yīng)用程序GUI對(duì)象數(shù)據(jù),并使用該gMg腳本遺傳性地(或分類地)限定用于GUI對(duì)象檢測(cè)的表達(dá)式。將得到的GUI對(duì)象細(xì)節(jié)和屬性的集合打包并發(fā)送至服務(wù)器。服務(wù)器接收這些分類的事件和伴隨的屬性,并對(duì)其進(jìn)一步處理以確定具體的GUI對(duì)象事件。服務(wù)器通過使用跟蹤消息層和預(yù)定的語義和約定,建立用戶上下文。對(duì)于具體的GUI檢測(cè),將跟蹤消息發(fā)送至包含關(guān)于對(duì)象的具體屬性的、識(shí)別的每個(gè)GUI對(duì)象。在泛型檢測(cè)中,發(fā)送包含用于服務(wù)器的足夠數(shù)據(jù)的跟蹤消息,以滯后地確定具體GUI對(duì)象分析和識(shí)別。在以下的具體的和泛型的綁定代碼實(shí)施例中,第一實(shí)施例示出了52具體綁定(針對(duì)單一的GUI對(duì)象),其中客戶機(jī)濾除并發(fā)送不同的跟蹤消息,用于被跟蹤的四個(gè)定義的GUI按鈕中的每個(gè)1.檢測(cè)類是否為"按鈕",標(biāo)題是否為"OK"且頂部窗口是否為開放的(Open)窗口。如果全部為真,則發(fā)送跟蹤消息,指示按下了打開成功(OpenOK);2.如果其為Save(保存)對(duì)話框中的OK按鈕,則將發(fā)送保存成功跟蹤消息(SaveOK);3.進(jìn)一步地,如果其為打開對(duì)話框中的Cancel(取消)按鈕,則將發(fā)送打開取消跟蹤消息(CancelOpen);4.如果其為保存按鈕(SaveButton)和具有保存/取消(Save/Cancel)消息的保存對(duì)話框,則將發(fā)送適當(dāng)?shù)母櫹?CancelSave)。下面示出了如何對(duì)四個(gè)具體類型的按鈕進(jìn)行檢測(cè)。/*SpecificandGenericBindingCodeSample*/contextprocess=processserver"someserver"contextthread=threadinprocesscontexttopwindow=topwindowinthread〃SpecificBinding-clientdeterminesspecificobjectandsendsuniquetrackmessageforeachif(wlbutdown&&class='BUTTON'&&title=='OK'&&topwindow(title=Open"&&class=="332767"))track(priority,pressed,topwindow,"OpenOk");if(wlbutdown&&class=='BUTTON'&&title='OK'&&topwindow(title=="Save"&&class=="332767"))track(priority,pressed,topwindow,"SaveOk"》53if(wlbutdown&&class='BUTTON'&&title=='Cancel'&&topwindow(title="Open"&&class=="332767"))track(priority,pressed,topwindow,"OpenCancel");if(wlbutdown&&class='BUTTON'&&title=='Cancel'&&topwindow(title=="Save"&&class="332767"))track(priority,pressed,topwindow,"SaveCancel");〃GenericBinding-clientsendsonetrackmessageforall,butwithinfoforservertofigureoutwhichif(wlbutdown&&class='BUTTON')track(priority,pressed,topwindow,"Button",title=title,toptitle=topwindow.title,to/oclass=to/owindow.class》與按下事件耦合的、"按鈕"類的任何對(duì)象上的任何按下按鈕消息發(fā)送跟蹤消息,指示按下了按鈕(任何按鈕)。頂部窗口和頂部窗口類也可轉(zhuǎn)發(fā)至服務(wù)器,以對(duì)四個(gè)按鈕中的哪個(gè)被激活進(jìn)行分析和檢測(cè)。在泛型代碼中,與在傳輸至服務(wù)器之前清楚識(shí)別目標(biāo)GUI對(duì)象不同,的。'A、^八"。、5在具體的和泛型的情況下,由解釋器接收事件,并且,在事件解釋器處理中,基于在兩種情況下的腳本中描述的條件,事件執(zhí)行屬性檢索以允許執(zhí)行條件表達(dá)式。屬性檢索是條件的一部分或是條件語句(例如,if(Q){R},其中R可包含一個(gè)或多個(gè)跟蹤消息)的主體的一部分。此外,服務(wù)器處理并檢測(cè)不同的GUI對(duì)象,并且查找例如Save(保存)、Cancel(取消)、OK等各類按鈕或分析文本以執(zhí)行字符串匹gMg系統(tǒng)的方法監(jiān)控使用專用傳感器監(jiān)控包含在組件內(nèi)的方法。該專用靈活的傳感器使得本發(fā)明可生成并集成跨越客戶機(jī)或服務(wù)器上的操作系統(tǒng)中的目標(biāo)主機(jī)應(yīng)用程序譜的多種類型的事件。方法監(jiān)控包含對(duì)組件方法的攔截,以支持?jǐn)r截函數(shù)調(diào)用并返回凈皮打包為DLL的主機(jī)應(yīng)用程序組件的傳感器類型。攔截函數(shù)調(diào)用使gMg系統(tǒng)能從可被傳遞到邏輯腳本用于跟蹤和監(jiān)控的組件中檢索事件和屬性。假定任何函數(shù)都可調(diào)用另一個(gè)函數(shù)或遞歸地調(diào)用其自身,gMg方法監(jiān)控則基于多種情況和組件環(huán)境中的兩個(gè)基本目標(biāo)。首先,目標(biāo)方法的地址將被定位。其次,目標(biāo)方法被攔截。用于對(duì)目標(biāo)方法的地址進(jìn)行定位的技術(shù)依賴于在其實(shí)施中使用了什么組件技術(shù),所述實(shí)施包括COM、非COM對(duì)象、輸出函數(shù)、或typelibrary報(bào)頭中的信息變量、函數(shù)參數(shù)、函數(shù)返回、存儲(chǔ)、vtables等。盡管將COM方法(圖16,項(xiàng)1624到1636)作為gMg能力的實(shí)施例進(jìn)行討論,但是,該原理可用于包含在其它公司的不同組件技術(shù)中的方法,不同組件技術(shù)例如Corba(可從馬薩諸塞州尼德姆鎮(zhèn)的對(duì)象管理集團(tuán)公司(ObjectManagementGroup,Needham,MA)得到)、IBM的SOM(IBM,Armonk,NY)、以及用于建立軟件應(yīng)用程序的許多其它組件系統(tǒng)。對(duì)于gMg系統(tǒng),對(duì)這些附加技術(shù)的擴(kuò)展支持是建立不同組件類型適配器的任務(wù)。對(duì)于本領(lǐng)域技術(shù)人員顯而易見的是,本說明書中提出的技術(shù)可用于其它組件技術(shù)。在另一個(gè)實(shí)施中,當(dāng)監(jiān)控方案在gMg方法傳感器可被激活時(shí)指示存在包含目標(biāo)方法的對(duì)象時(shí),產(chǎn)生COM內(nèi)的4吏用gMg臨時(shí)對(duì)象的附加因素和技術(shù)變化。然而,如果對(duì)象還不存在,那么對(duì)新的對(duì)象的操作系統(tǒng)的創(chuàng)建進(jìn)行監(jiān)控則將產(chǎn)生這些對(duì)象的方法位置。gMg以保存主機(jī)應(yīng)用程序的執(zhí)行連續(xù)性的方式操作(即,在監(jiān)控方法時(shí)不中斷地執(zhí)行)。方法目標(biāo)嵌入在各種組件技術(shù)中,這些組件技術(shù)基于操作系統(tǒng)中或主機(jī)應(yīng)用程序中的可用接口。為了支持COM方法攔截,如果在COM組件已創(chuàng)建之后將gMg方法傳感器激活,那么首先對(duì)VTables定位以4企索方法地址。VTable或虛擬表是COM類中的表,其包含指向該類的方法或函數(shù)的方法指針。然后將gMg方法簽名攔截的技術(shù)用于建立監(jiān)控。注意到,如果公布了COM接口,那么其則歸檔為TypeLibs,并在DLLs/OCXs中找到。另一個(gè)組件類別,輸出函數(shù)具有暴露在DLL組件中的方法接口,其中輸出函數(shù)名列在程序模塊報(bào)頭中的組件的輸出表中。一旦被定位,gMg方法簽名監(jiān)控(指圖16中的項(xiàng)1612、1621、1639)則在對(duì)方法進(jìn)行主機(jī)應(yīng)用程序調(diào)用或返回時(shí)建立捕獲點(diǎn)。確定組件類型(COM或輸出函數(shù))之后,圖16A中的gMg方法簽名監(jiān)控(項(xiàng)1657)是關(guān)鍵的,并且在目標(biāo)方法被定位之后在多個(gè)情況下深入地用于整個(gè)gMg方法監(jiān)控。方法簽名定義為方法的入口點(diǎn)的操作碼模式,其在gMg系統(tǒng)中描述并用gMg檢查工具發(fā)現(xiàn)。定義了操作碼模式之后,這些操作碼模式用于對(duì)方法入口點(diǎn)進(jìn)行定位和驗(yàn)證,然后這些方法入口點(diǎn)用于調(diào)用和返回?cái)r截。方法簽名監(jiān)控可普遍地用于任何定位的函數(shù),而不管其封裝、環(huán)境或位置。在COM或輸出函數(shù)中的一個(gè)組件類型中發(fā)現(xiàn)目標(biāo)方法地址之后,gMg的方法簽名方法監(jiān)控則用于執(zhí)行方法攔截。在另一種配置中,如果當(dāng)調(diào)用以定位的VTable方法開始,并且在VTable方法中,組件還存在對(duì)方法的其它內(nèi)部調(diào)用時(shí),gMg方法簽名監(jiān)控也可用于跟蹤內(nèi)部方法調(diào)用,那么,則進(jìn)行方法簽名監(jiān)控。此外,方法簽名監(jiān)控用于作為COM對(duì)象內(nèi)VTable方法監(jiān)控的設(shè)置的一部分。參照?qǐng)D16,示出了gMg方法監(jiān)控的一般觀察。在操作系統(tǒng)環(huán)境1609中運(yùn)行的主機(jī)應(yīng)用程序1603通過對(duì)操作系統(tǒng)代碼函數(shù)LoadLibraryExW1618進(jìn)行調(diào)用,而啟動(dòng)其DLL組件1615的加載。gMg監(jiān)控設(shè)置對(duì)內(nèi)核函數(shù)LoadLibraryExW的攔截,以確保檢測(cè)到目標(biāo)DLL的全部實(shí)例。DLL包含輸出函數(shù)1620或COMTypelibraries1624。對(duì)于COM方法監(jiān)控,正好在創(chuàng)建目標(biāo)COM對(duì)象之前。為了對(duì)COM的VTable1633進(jìn)行定位,gMg監(jiān)控對(duì)COM創(chuàng)建1627的不同階段進(jìn)行攔截,VTable1633包括指向其全部接口方法1636的指針。這些執(zhí)行階段如下所述gMg攔截DUGetClassObject模塊。DllGetClassObject由主機(jī)應(yīng)用程序調(diào)用,并返回IClassFactory;gMg攔截IClassFactory::CreateInstance;IClassFactory::Createlnstance由主機(jī)應(yīng)用禾呈序調(diào)用并返回新創(chuàng)建的COM對(duì)象;以及具有新創(chuàng)建的COM對(duì)象的檢查和操作產(chǎn)生其VTable的位置。在COM已啟動(dòng)且將其方法"遲綁定(latebound),,的情況下(方法在運(yùn)行時(shí)間而不是編譯時(shí)間被啟動(dòng)和登記在例如VTable的結(jié)構(gòu)中),gMg系統(tǒng)創(chuàng)建其臨時(shí)COM對(duì)象1630,臨時(shí)COM對(duì)象1630向由組件內(nèi)的其它目標(biāo)方法(已綁定)使用的相同的VTable提供地址。VTable被定位之后,gMg系統(tǒng)將其方法簽名監(jiān)控1639用于透明地且不引人注目地監(jiān)控目標(biāo)方法。對(duì)于對(duì)輸出函數(shù)1618進(jìn)行監(jiān)控,gMg方法簽名監(jiān)控還用于攔截函數(shù)調(diào)用。參照?qǐng)D16A1657,當(dāng)方法被定位之后,gMg監(jiān)控設(shè)置簽名方法攔截,用于對(duì)由應(yīng)用程序的方法調(diào)用程序1606直接或間接產(chǎn)生的目標(biāo)方法的調(diào)用1642和返回1645進(jìn)行攔截。gMg攔截代碼維持原始函數(shù)的整體性,并基于主機(jī)應(yīng)用程序的調(diào)用和/或返回,向gMg解釋程序1660發(fā)出適當(dāng)?shù)膅Mg事件,并傳遞由腳本請(qǐng)求的相關(guān)信息。將對(duì)方法返回的監(jiān)控分類為泛型的或具體的(注意不是在GUI對(duì)象的意義上)。圖16A示出了用于泛型返回捕獲的兩種技術(shù),堆棧復(fù)制1648和堆棧分配1651(有時(shí)也叫做按線程分配堆棧),這兩種技術(shù)在下文介紹。具體監(jiān)控1654指這樣的方法,其參數(shù)在例如typelibrary的公開的位置找到。然而,泛型方法攔截可與任何函數(shù)一起工作,而無需預(yù)先知道函數(shù)的參數(shù)和返回值。在這種情況下,當(dāng)調(diào)用了函數(shù)或從函數(shù)返回時(shí),僅生成沒有具體信息的事件。在泛型攔截方法中,執(zhí)行調(diào)用和返回形實(shí)替換程序(Thunk)并執(zhí)行其代碼。在gMg跟蹤和監(jiān)控系統(tǒng)中的三種重要結(jié)構(gòu)(圖7和圖8的GUI對(duì)象樹以及進(jìn)程/線程樹)中,第三種結(jié)構(gòu),也就是代碼模塊樹,包含被動(dòng)態(tài)地檢測(cè)以支持方法監(jiān)控的模塊、函數(shù)監(jiān)控器以及COM對(duì)象實(shí)例。參照示出了由方法監(jiān)控傳感器使用的模塊樹的圖17,其中示出了在根部具有模塊列表1705的分離的模塊樹。函數(shù)監(jiān)控樹項(xiàng)1710、1725和1730可在樹中的任何位置。對(duì)于來自接口監(jiān)控1715的function—call事件,如果(function—call事件(Pl,Ptr—to—COM,...)的)一個(gè)變?cè)?argument)指向COM對(duì)象,那么COM對(duì)象1720則可為function—call事件1715的子事件。在腳本的驅(qū)動(dòng)下,僅監(jiān)控選定的函數(shù)。模塊樹選擇性地僅包含滿足腳本監(jiān)控要求所需的。此外,由腳本中的關(guān)鍵字驅(qū)動(dòng)的gMg解釋器對(duì)GUI對(duì)象樹和模塊樹進(jìn)行更新,以對(duì)真實(shí)GUI應(yīng)用程序建模,并支持應(yīng)用程序中的函數(shù)事件。啟動(dòng)后,由程序模塊1705填充模塊樹。樹中的接口和函數(shù)對(duì)象僅才艮據(jù)腳本的請(qǐng)求而創(chuàng)建。才莫塊樹運(yùn)行后,利用LoadLibraryExW調(diào)用和返回?cái)r截對(duì)模塊樹進(jìn)行維護(hù)。在輸出函數(shù)中,將請(qǐng)求監(jiān)控的腳本請(qǐng)求添加到模塊樹中的模塊對(duì)象的子函數(shù)調(diào)用對(duì)象中。將感興趣的COM對(duì)象的接口對(duì)象也添加為模塊對(duì)象的子對(duì)象,用于參考并監(jiān)控所述類型的對(duì)象的創(chuàng)建。當(dāng)創(chuàng)建了期望類型的COM對(duì)象時(shí),這些對(duì)象也添加為接口對(duì)象的子類。當(dāng)腳本請(qǐng)求對(duì)接口的方法或?qū)OM對(duì)象進(jìn)行監(jiān)控時(shí),將方法函數(shù)調(diào)用對(duì)象添加為接口對(duì)象或COM對(duì)象的子類。從攔截的方法調(diào)用中發(fā)現(xiàn)的COM對(duì)象被臨時(shí)創(chuàng)建用于腳本參考,并且這些COM對(duì)象不總是存在于模塊樹中。這些對(duì)象在使用后由引擎作為無用信息收集。方法簽名監(jiān)控提供了用于監(jiān)控函數(shù)調(diào)用的技術(shù),并且用于在不同的情況下創(chuàng)建gMg方法事件和屬性檢索。方法簽名監(jiān)控識(shí)別字節(jié)操作碼模式,該模式表示認(rèn)出的方法函數(shù)的方法簽名。當(dāng)對(duì)檢測(cè)到的函數(shù)定位之后,;險(xiǎn)測(cè)到的函數(shù)可向例如GUI事件和屬性以及發(fā)生在應(yīng)用程序組件中的其它內(nèi)部事件或進(jìn)程的項(xiàng)提供接口。方法簽名可普遍地應(yīng)用于用于任何類型的調(diào)用的任何組件環(huán)境,并可用于捕獲函數(shù)參數(shù)。確定了程序的地址之后,gMg使用跳轉(zhuǎn)指令將其鏈接到調(diào)用攔截例程和對(duì)目標(biāo)函數(shù)的每個(gè)調(diào)用進(jìn)行跟蹤的INFO結(jié)構(gòu)實(shí)例。INFO結(jié)構(gòu)包含到函數(shù)代碼的字節(jié)指針、到其攔截程序的空指針、以及稱為InterceptMultEdxInfo的攜帶實(shí)例的INFO結(jié)構(gòu)。作為多實(shí)例支持的一部分,具有攜帶和傳遞關(guān)于函數(shù)調(diào)用攔截的相關(guān)信息的技術(shù),例如使用CPU寄存器(即,實(shí)例寄存器)或其它機(jī)制。參照?qǐng)D18,示出了方法監(jiān)控器的創(chuàng)建。由包含在gMg腳本1833內(nèi)的gMg腳本監(jiān)控命令啟動(dòng)函數(shù)之后,首先由MakeFunctionMonitor機(jī)制對(duì)函數(shù)的地址進(jìn)行定位。給定包含N個(gè)方法1827的模塊N1806,如為定位函數(shù)地址和執(zhí)行攔截請(qǐng)求所準(zhǔn)備的,適當(dāng)?shù)哪K列表已找到,并利用模塊枚舉API(例如Createtoolhelp32snapshot1815、Mod32First1809),在攔截的LoadLibraryExW調(diào)用期間自動(dòng)維護(hù)。本領(lǐng)域4支術(shù)人員可容易地理解,當(dāng)發(fā)布了更新的操作系統(tǒng)可用函數(shù)時(shí),可將這些API替換為更新的操作系統(tǒng)可用函數(shù)。模塊列表1803已在攔截請(qǐng)求時(shí)預(yù)先準(zhǔn)備好。MakeFunctionMonitor1851接收函數(shù)名和模塊對(duì)象、接口對(duì)象或COM對(duì)象,并且一旦輸出函數(shù)名或COM方法代碼地址已被定位,則調(diào)用MakeFunction。然后,將函數(shù)監(jiān)控對(duì)象1860創(chuàng)建為gMg對(duì)象類的派生,其中該對(duì)象包含函數(shù)攔截結(jié)構(gòu)。實(shí)施的屬性包含gMg對(duì)象實(shí)例,該實(shí)例返回指向原始程序的指針,并且如果返回成功,則設(shè)置為真。MakeFunctionMonitor執(zhí)行類型"函數(shù)監(jiān)控對(duì)象(FunctionMonitorObject)",與窗口、HTNLDOC或計(jì)時(shí)器不同,該類型是可包含各種屬性(例如,目標(biāo)函數(shù)被調(diào)用了多少次)的函數(shù)對(duì)象類型。函數(shù)的全部實(shí)例和分類都被全局地跟蹤。在進(jìn)行攔截請(qǐng)求時(shí),已知包含期望函數(shù)的模塊,該模塊在攔截請(qǐng)求期間發(fā)現(xiàn)或先前就已確定。gMg腳本傳遞該模塊,并且使用GetProcAddress1824發(fā)現(xiàn)函數(shù)體的起始地址(例如,用于才莫塊對(duì)象的MakeFunctionMonitor在對(duì)InterceptCallMul伍DX1818的調(diào)用中對(duì)函數(shù)名使用函數(shù)GetProcAddress1824)。作為gMg腳本命令1839的結(jié)果被間接調(diào)用之后,Callintercept1848執(zhí)行攔截并對(duì)位于函數(shù)對(duì)象1860內(nèi)的INFO結(jié)構(gòu)1863進(jìn)行訪問。為了避免出現(xiàn)遞歸,如果gMg腳本命令不注意地在攔截處理過程中調(diào)用了攔截的函數(shù),則執(zhí)行g(shù)Mglock上的lockD。在試圖進(jìn)行攔截之前,鎖定機(jī)制檢查1842Callintercept函數(shù)1848未被同樣的線程鎖定,在這種情況下,調(diào)用攔截將被忽略1845。假設(shè)攔截成功,那么,攔截代碼則將全局指針傳遞至該INFO結(jié)構(gòu),然后該INFO結(jié)構(gòu)被轉(zhuǎn)至函數(shù)監(jiān)控對(duì)象。函數(shù)Functionintercept1866具有g(shù)Mg函數(shù)對(duì)象1860。成功攔截后發(fā)出的gMg事件1869被執(zhí)行,然后被傳遞至函數(shù)調(diào)用Do—gMgEvent1872,該函數(shù)調(diào)用對(duì)運(yùn)行的事件和全部腳本1875進(jìn)行處理。Do一gMgEvent接收函數(shù)調(diào)用事件,作用于該事件,并在結(jié)束是清除全局指針和全局鎖定。被gMg解釋器接收之后,由Getstring和GetNum函數(shù)使用的方法事件稱為方法事件屬性(MethodEventProperty)1869。這些Getstring和GetNum函數(shù)被暗含用于每個(gè)類型的gMg對(duì)象,如果沒有識(shí)別出這些函數(shù)的類型,那么其則相互調(diào)用。gMg腳本用索引請(qǐng)求串事件(stringevent)屬性,如果該屬性未被定位,腳本解釋器代碼則調(diào)用用于每類gMg對(duì)象的函數(shù)鏈中的一個(gè)其它類型。如果在event.sl腳本內(nèi)進(jìn)行解釋,那么該解釋則產(chǎn)生一連串調(diào)用,用于查找getstring事件屬性,并且將傳遞表示"si"的索引。對(duì)空指針進(jìn)行檢測(cè),并且由全局事件選擇值確定函數(shù)調(diào)用事件是否正在被處理。優(yōu)選地,如果接收到不同類型的gMg事件,例如正在處理的創(chuàng)建事件,那么,對(duì)象樹掃描的優(yōu)先級(jí)則提升,從而導(dǎo)致對(duì)主機(jī)應(yīng)用程序樹進(jìn)行掃描。如果事件正在處理函數(shù)調(diào)用,那么,則設(shè)置指針,該指針為原始調(diào)用參數(shù)所處的堆棧中的偏移。每個(gè)參數(shù)都可從該堆棧定位中得到。一個(gè)實(shí)施方式提供了一種函數(shù),其用于處理未知字符串長度的參數(shù)。該函數(shù)確定字符串是否位于未知的位置,并返回負(fù)值或正值,分別指示發(fā)現(xiàn)的值是一字節(jié)字符還是兩字節(jié)字符。如果不存在字符串的話,該函數(shù)則返回零。其可確定詢問的字符串屬性是否應(yīng)用于在腳本中4皮處理的當(dāng)前的調(diào)用攔截事件1869。當(dāng)為真時(shí),則在對(duì)函^t調(diào)用Do—gMgEvent1872進(jìn)4亍處理的過程中調(diào)用Interceptargument1878。字符串屬性變量僅在此時(shí)為非零,并從堆棧(即,堆棧地址處)指向INFO結(jié)構(gòu)的地址。在物理上位于對(duì)象結(jié)構(gòu)內(nèi)部的位置,具有指向該對(duì)象結(jié)構(gòu)本身、并指向宿主類(其為使用該指針的唯一位置)的指針,還包含關(guān)于攔截的信息以及指向gMg對(duì)象的指針,該gMg對(duì)象是函數(shù)對(duì)象1860。全部這些類都在方法攔截傳感器中,并為自包含的。參照?qǐng)D19,其示出了方法簽名。為了實(shí)現(xiàn)gMg方法傳感器,gMg方法監(jiān)控系統(tǒng)循環(huán)通過稱為方法簽名1930的目標(biāo)方法的捕獲的字節(jié)圖案陣列1920,并對(duì)運(yùn)行時(shí)間的目標(biāo)函數(shù)字節(jié)圖案進(jìn)行比較(其中目標(biāo)函數(shù)字節(jié)圖案由檢查工具發(fā)現(xiàn)),以檢測(cè)以檢測(cè)方法1905的位置。為了進(jìn)行簽名定義而創(chuàng)建宏,所述宏是表示不同操作碼的字節(jié)串。將該定義用于證明函數(shù)輸入點(diǎn)中的典型操作碼。簽名還包括特別定義的碼,例如don't—care和signature—end碼。例如,具體的庫具有固定序列的某些指令,其位于由在不同版本中變化的DLL的版本確定的函數(shù)中。對(duì)函數(shù)的代碼進(jìn)行分析,以確定輸入碼1910是否可識(shí)別,如果可識(shí)別的話,則返回執(zhí)行匹配的簽名的指針。這種評(píng)估還建議了在插入轉(zhuǎn)移指令之前需要將這些代碼中的多少復(fù)制到別處,以及返回何處以執(zhí)行代碼的持續(xù)時(shí)間。例外情況是,發(fā)現(xiàn)轉(zhuǎn)移指令已經(jīng)是攔截的函數(shù)的一部分,以及4企測(cè)到的gMg已攔截了應(yīng)用程序函數(shù)調(diào)用。由于gMg監(jiān)控處理不能遞歸,因此該處理異常中斷。這種操作碼分析技術(shù)還在不同的派生CPU的類中起作用。在單一線程的應(yīng)用中,還可使用其它可選的技術(shù)在輸入gMg代碼之前恢復(fù)原始目標(biāo)代碼,有效地禁止攔截,然后在從gMg代碼返回之后通過將轉(zhuǎn)移指令放回在目標(biāo)函數(shù)代碼的開頭處而重新開始攔截。對(duì)于每個(gè)歸檔的簽名,處理循環(huán)通過每個(gè)字節(jié)碼,直到對(duì)Signature—terminator1935定位。如果值不匹配,處理則移至下一個(gè)簽名。但是,如果發(fā)現(xiàn)signature—terminator值一直匹配,則存儲(chǔ)起始定4立值,并返回其長度。一旦找到簽名之后,對(duì)于成功攔截而言,重要的是需要對(duì)gMg代碼轉(zhuǎn)移指令覆蓋進(jìn)行定位,并將其放置在清潔的操作碼邊界1955。轉(zhuǎn)移指令不能轉(zhuǎn)移至操作碼的中間,因此需要知道適當(dāng)?shù)牟僮鞔a邊界的定位。在五字節(jié)覆蓋中,前四個(gè)字節(jié)包括兩個(gè)操作碼1960和1965,第五字節(jié)碼包含相對(duì)地址1970。由于該地址是相對(duì)于原始函數(shù)中的執(zhí)行起始處的位置,因此,這種相對(duì)地址防止了對(duì)該覆蓋重新定位以及對(duì)程序的執(zhí)行。在目標(biāo)函數(shù)1940中,對(duì)于目標(biāo)覆蓋而言,最少需要5個(gè)字節(jié)1955(加上signature—end)來設(shè)置32位CPU中的轉(zhuǎn)移指令。該覆蓋還可為7字節(jié)或者10字節(jié),但不大于16字節(jié)。一旦發(fā)現(xiàn)5個(gè)字節(jié)之后,則插入具體值signature—end,指示替換函數(shù)代碼時(shí)轉(zhuǎn)制何處。復(fù)制原始指令,所有的才乘作碼序列1945被覆蓋,以及用跳轉(zhuǎn)至攔截例程197561的跳轉(zhuǎn)指令替代操作碼序列。復(fù)制的操作碼是存儲(chǔ)在短值陣列1980中的字節(jié)值。從攔截例程1975返回之后,程序流返回代碼攔截/延續(xù)點(diǎn)1950。由于函數(shù)傳遞一個(gè)或多個(gè)參數(shù),因此,還具有獲取被監(jiān)控的方法的參數(shù)的gMg函數(shù)(即,Getstringfunctioncall()),其中搡作碼可為數(shù)字類型或字符串類型。例如,如果已知存儲(chǔ)了event.sl(其中sl是字符串屬性),那么,則具有函數(shù)Getstringeventproperty(),其具有一個(gè)參數(shù),該參數(shù)為從NEP(N-事件屬性)列表中得到的字常量。NEP列表定義一系列可能的字常量,這些字常量均為字符串事件屬性。調(diào)用Getstringeventprops(),傳遞事件屬性號(hào)。事件屬性單元是字符串事件屬性,例如,位于瀏覽器中的URL幀報(bào)頭URLSl到Sn中的字符串事件屬性。事件屬性被枚舉為變?cè)筒紶柺录傩?,并用作操作碼中的變?cè)R韵嗤姆绞綄ふ覕?shù)字事件屬性,并將其枚舉為變?cè)筒紶柺录傩?。字符串事件?1"開始作為數(shù)字屬性,布爾事件屬性在運(yùn)行時(shí)以"1000"開始。為了識(shí)別參數(shù)是ASCII還是Unicode,調(diào)用API(例如,IsTexUnicode)或?qū)SCIIUnicode字符以及Unicodestrlength參數(shù)進(jìn)行計(jì)數(shù)。還通過循環(huán)ASCII目標(biāo)并查找總的ASCII長度和字符串中的字符數(shù),而對(duì)ASCII字符計(jì)數(shù)。如果Unicode字符中的大部分都是ASCII代碼字符,并且字符串不太長,那么,其則可為有效的Unicode字符串。否則,則認(rèn)為這些字符不太可能是Unicode字符串,或者其被歸零。返回更大比例的字符串,其中負(fù)的計(jì)數(shù)指示ASCII字符串,并且如果指向空指針,則返回零。如果未定位到字符串,則返回空字符串。該例程還返回指向包含一組寬位字符的堆棧的指針。攔截可發(fā)生在目標(biāo)函數(shù)代碼的開始或中間。gMg監(jiān)控使用為零的函數(shù)基準(zhǔn)偏移,并規(guī)定了用于非零的函數(shù)基準(zhǔn)偏移,在非零的函數(shù)基準(zhǔn)偏移中,攔截點(diǎn)在函數(shù)中間。還可對(duì)相同函數(shù)的多實(shí)例進(jìn)行攔截,或刪除這些攔截。還可在代碼中查找用于gMg形式轉(zhuǎn)換程序的轉(zhuǎn)換指令。如果找到了,函數(shù)則已被攔截,并且攔截設(shè)置處理異常中斷。否則,則對(duì)函數(shù)62進(jìn)行設(shè)置以用于攔截。為了修改目標(biāo)方法代碼,需要控制包含該代碼的存儲(chǔ)塊的功能。gMgChangememory函數(shù)用于改變對(duì)包含待被攔截的函數(shù)的存儲(chǔ)塊的許可。gMgchangememory例程通過去除執(zhí)行選項(xiàng)和設(shè)置讀/寫選項(xiàng)來改變存儲(chǔ)塊的屬性。函數(shù)攔截依賴于存儲(chǔ)塊的改變的屬性,并且如果沒有在主機(jī)應(yīng)用程序代碼中成功修改的話,函數(shù)攔截則會(huì)失敗。使用句柄返回原始保護(hù)并恢復(fù)屬性。由于可經(jīng)常改變存儲(chǔ),因此,將進(jìn)程分為改變存儲(chǔ)和恢復(fù)存儲(chǔ)。形實(shí)轉(zhuǎn)換程序是用于多種支持機(jī)制的技術(shù),所述多種支持機(jī)制為從標(biāo)識(shí)符的后聯(lián)編到實(shí)時(shí)的真實(shí)對(duì)象的支持機(jī)制,或在方法調(diào)用期間對(duì)多實(shí)例進(jìn)行跟蹤的支持機(jī)制。在不同的情況下,形實(shí)轉(zhuǎn)換程序可為指向?qū)嵑瘮?shù)的指針(就像指向代碼的指針),或可在返回實(shí)函數(shù)的形實(shí)轉(zhuǎn)換程序空間內(nèi),或?yàn)樵寄繕?biāo)的實(shí)函數(shù)的地址。指針建立在被監(jiān)控的代碼內(nèi),以指向攔截形實(shí)轉(zhuǎn)換程序,攔截形實(shí)轉(zhuǎn)換程序是具有重寫和可執(zhí)行屬性的存儲(chǔ)部分。形實(shí)轉(zhuǎn)換程序用于跟蹤多調(diào)用或返回實(shí)例。為了幫助對(duì)攔截大量函數(shù)的支持,除了攔截形實(shí)轉(zhuǎn)換和恢復(fù)形實(shí)轉(zhuǎn)換之外的攔截代碼可共享。每個(gè)函數(shù)的輸入碼都由跳轉(zhuǎn)替代,以根據(jù)函數(shù)跳轉(zhuǎn)到單獨(dú)的攔截形實(shí)轉(zhuǎn)換程序。同時(shí),攔截形實(shí)轉(zhuǎn)換程序提供指向表示具體攔截的INFO(引擎數(shù)據(jù)結(jié)構(gòu))的指針,然后調(diào)用由大量被攔截的函數(shù)共享的公共句柄函數(shù)。在虛擬表和COM監(jiān)控部分對(duì)形實(shí)轉(zhuǎn)換程序的作用及其應(yīng)用進(jìn)一步討論。在泛型函數(shù)調(diào)用攔截的情況下(不知道函數(shù)的參數(shù)或格式),句柄函數(shù)在腳本處理之后返回,并且,在跳轉(zhuǎn)至攔截的函數(shù)的剩余部分之后,攔截形實(shí)轉(zhuǎn)換程序跳轉(zhuǎn)至恢復(fù)形實(shí)轉(zhuǎn)換程序,該恢復(fù)形實(shí)轉(zhuǎn)換程序具有對(duì)原始攔截程序的覆蓋輸入碼的復(fù)制。對(duì)于具體的函數(shù)攔截(其中函數(shù)的參數(shù)和格式是已知的),句柄函數(shù)以與實(shí)函數(shù)完全相同的格式接收由應(yīng)用程序傳遞的參數(shù),并且,句柄函數(shù)還額外地接收由攔截形實(shí)轉(zhuǎn)換程序提供的用于攔截的函數(shù)的INFO指針。通過將INFO指針添加到堆棧中或?qū)⑵渲糜谖词褂玫腃PU寄存器中,攔截形實(shí)轉(zhuǎn)換程序可傳遞額外的INFO指針參數(shù)。句柄函數(shù)通過恢復(fù)形實(shí)轉(zhuǎn)換函數(shù)(其可通過INFO結(jié)構(gòu)定位)調(diào)用原始的函數(shù),并將原始函數(shù)結(jié)果返回至調(diào)用的應(yīng)用程序。句柄函數(shù)向腳本通知該調(diào)用以及描述調(diào)用了什么的INFO的引用。句柄函數(shù)還記錄堆棧上參數(shù)的定位,以4吏腳本可將參數(shù)引用為數(shù)字或字符串。當(dāng)攔截的參數(shù)已知時(shí)(公開的函數(shù)、COM類型的庫中的COM方法、輸入的參數(shù)等),還將參數(shù)引用到腳本中作為COM對(duì)象("this"指針除外)或Windows對(duì)象(從窗口句柄中得到)。對(duì)于具體情況(LoadLibraryExW、DllGetClassObject和IClassFactory::Createlnstance除外),句柄函數(shù)還在調(diào)用原始函數(shù)之前或之后進(jìn)行額外的工作(分別為增加新的模塊對(duì)象,攔截IClassFactory::Createlnstance,以及檢查返回的值)。通過形實(shí)轉(zhuǎn)換程序,支持N個(gè)線程,其中需要通過每個(gè)線程將形實(shí)轉(zhuǎn)換分配鎖定。通過線程鎖定是必須的,這是因?yàn)?,例如,兩個(gè)線程可調(diào)用兩個(gè)不同的函數(shù),或可調(diào)用相同的函數(shù)而每個(gè)函數(shù)線程需要其自身的返回形實(shí)轉(zhuǎn)換程序。在某些情況下,一個(gè)調(diào)用的每個(gè)實(shí)例可遞歸地調(diào)用相同的函數(shù)。此外,如果處理可在使用形實(shí)轉(zhuǎn)換程序的每個(gè)調(diào)用期間動(dòng)態(tài)地釋放創(chuàng)建的閑置堆棧,而不管函數(shù)使用的是C調(diào)用還是Pascal調(diào)用,那么,創(chuàng)建用于每個(gè)線程的并行堆棧則變得更容易。在gMg方法監(jiān)控內(nèi)的形實(shí)轉(zhuǎn)換程序的應(yīng)用用于根據(jù)主機(jī)應(yīng)用程序組件方法調(diào)用和返回生成多種事件。圖20示出了當(dāng)發(fā)現(xiàn)了有效長度大于或等于5的方法簽名時(shí),用于方法監(jiān)控的形實(shí)轉(zhuǎn)換程序分配。如果發(fā)現(xiàn)了有效值,虛擬位置函數(shù)(VirtualallocationFunction)2006則分配具有重寫屬性的一段存儲(chǔ)2009,并每次動(dòng)態(tài)分配24字節(jié)。對(duì)于形實(shí)轉(zhuǎn)換分配而言,使用一段可重復(fù)使用的緩沖存儲(chǔ)。在程序內(nèi)具有一個(gè)固定的緩沖器,用于全部公式串,并且在公式串的計(jì)算期間,緩沖器使用需要在每個(gè)gMg指令之后清空的自由臨時(shí)串。這種開銷需要周期性地設(shè)置。專用的gMg堆也用于替代使用應(yīng)用程序堆,以便更獨(dú)立并避免在出現(xiàn)任何gMg錯(cuò)誤時(shí)影響主機(jī)應(yīng)用程序。專用堆函數(shù)創(chuàng)建堆,并然后提供句柄以執(zhí)行全部分配,以使全部新的操作符可與新的專用堆一起使用。InterceptcallmultEDX2003分配兩塊存儲(chǔ)一塊用于攔截調(diào)用的代碼2012,另一塊用于存l渚原始代碼2015以確保對(duì)目標(biāo)函數(shù)的處理連續(xù)64性。在gMg攔截部分內(nèi),插入一系列代碼用于將全部數(shù)據(jù)推入寄存器的PUSHAD指令2018,然后是長值(longvalue)的進(jìn)棧,該長值為需要與攔截實(shí)例相關(guān)聯(lián)的INFOstructure2021的地址。InterceptmultEDX()函數(shù)基于這樣的假設(shè)實(shí)例寄存器(例如,EDX寄存器)可用于由調(diào)用的函數(shù)使用,而無需首先保存該寄存器,從而提高效率。由于需要避免修改CPU堆棧,因此插入移動(dòng)EDX寄存器,用于信息數(shù)據(jù)。然后移動(dòng)數(shù)據(jù)EDX寄存器以將實(shí)例信息傳遞至下一部分代碼。這種方法可在已知攔截了什么函數(shù)之后使用,并且還可用于使用完全相同的參數(shù)創(chuàng)建相同的模板,所述參數(shù)例如Loadlibrary之類的內(nèi)核函數(shù)。由于可能因?yàn)楣蚕淼脑L問而導(dǎo)致與其它線程出現(xiàn)沖突,從而使得存儲(chǔ)在RAM(即,HEAP)中的信息不能用于同樣的EDX目的,因此,該信息不是線程安全的。使用寄存器或堆棧是不需要進(jìn)行同步或其它昂貴操作而傳遞實(shí)例信息的唯一線程安全的方式(thread-safeway)。RAM可用于傳遞實(shí)例信息,一f旦其效率會(huì)4交低。通過使用RAM,攔截器在每次調(diào)用時(shí)都需要基于攔截的函數(shù)的地址進(jìn)行查找。此外,需要對(duì)查找表(函數(shù)地址到信息實(shí)例的映射)的維護(hù)進(jìn)行同步以使其為線程安全的,這一點(diǎn)可為昂貴的操作。在某些情況下可使用堆棧,但是,與RAM類似,這種方法在維持透明性方面具有缺陷。攔截函數(shù)必須完全取代原始函數(shù),并且很可能在進(jìn)程中對(duì)其進(jìn)行調(diào)用。從控制角度上來看,這是困難的。在這種情況下,攔截進(jìn)程必須以與原始函數(shù)相同的方式清空堆棧,并必須具有完全相同的參數(shù),同時(shí),還增加一個(gè)參數(shù)(即,實(shí)例或上下文信息)以支持監(jiān)控系統(tǒng)的攔截。某些目標(biāo)函數(shù)通過跳轉(zhuǎn)指令而被激活,并且堆棧不能由進(jìn)棧改變(進(jìn)棧導(dǎo)致將附加的信息置于目標(biāo)函數(shù)的參數(shù)的返回地址之后,并返回地址)。在這種情況下,攔截例程的代碼對(duì)原始參數(shù)訪問本來是不容易的,并且不能以與原始函數(shù)相同的方式清空堆片戔。例^口Stack:dwFlagshFilelpLibFileNameReturn-address〃Apushdoesnot"add"aparameter.Itfollowsthereturn-address:dwFlagshFilelpLibFileNameHeturn-addressInfo〃forinterceptionroutine對(duì)于EDX方案,可用"PUSHinfoAddr"代替"MOVEDX,infoAdrr",這種選擇也是線程安全的,但這種方案比使用CPU寄存器要更慢。使用CPU寄存器是有益處的。例如,對(duì)于傳遞實(shí)例上下文信息而言,通過寄存器傳遞實(shí)例地址是最佳方式。這種方法只在沒有參數(shù)通過相同的INFO傳遞寄存器傳遞至被監(jiān)控的方法/函數(shù)的時(shí)候才起作用。已發(fā)現(xiàn),通過EDX寄存器傳遞參數(shù)的方式從不用于輸出函數(shù)。然而,可以編寫這樣的代碼,這些代碼會(huì)導(dǎo)致在使用EDX的gMg監(jiān)控中產(chǎn)生崩潰,但是可能會(huì)需要匯編器并且不可能與可用的編譯器一起使用。這種崩潰對(duì)于輸出函數(shù)和COM函數(shù)來說是及其不可能的。此外,使用EDX不會(huì)對(duì)通過"sysenter(系統(tǒng)進(jìn)入)"指令實(shí)現(xiàn)的內(nèi)核級(jí)調(diào)用或通常使用EAX和EDX作為參數(shù)的其它內(nèi)部調(diào)用的拄截起作用。然而,在這些情況下,另一個(gè)寄存器可被替代。使用EDX還減小了代碼大小。本發(fā)明并不局限于在"泛型攔截"時(shí)一定需要使用EDX,而是在堆棧上傳遞也是可以的。然而,當(dāng)用一個(gè)新的句柄函數(shù)取代原始句柄函數(shù)的多實(shí)例時(shí),傳遞CPU寄存器中額外的上下文信息資料要優(yōu)于傳遞堆棧上或存儲(chǔ)器中的額外的上下文信息資料。多實(shí)例HRESULTSTDMETHODCALLTYPEilClassFactory—Createlnstance(IClassFactory*This,66/*[unique][in]*/IUnknown*pUnkOuter,/*[in]*/REFIIDriid,/*[iid—is][out]*/void**ppvObject)HRESULT_stdcalliDHGetClassObject(REFCLSIDrclsid,REFIIDriid,LPVOID*ppv)單一實(shí)例LoadLibraryExW參照?qǐng)D20,已知目標(biāo)函數(shù)2036的參數(shù)之后,對(duì)函數(shù)進(jìn)行攔截,并且將其替代為gMg"代理"(或攔截)函數(shù)2045。原始調(diào)用程序2024保持為被阻止的,等待函數(shù)結(jié)果。gMg代理函數(shù)(proxyfunction)2045調(diào)用原始函數(shù)2048、2042,接收返回值,并將結(jié)果2051返回至原始調(diào)用程序2024。gMg創(chuàng)建具有與原始函數(shù)2030完全相同的參數(shù)的代理函數(shù)2045,但增加至少一個(gè)額外的gMg參數(shù)2033用于實(shí)例信息。這些是為了防止需要在不同DLL2060、2063、2066中掛起全部具有相同方法名2072、2075、2078以及相同函數(shù)簽名的多個(gè)函數(shù)。為了將信息轉(zhuǎn)發(fā)至攔截例程,EDX寄存器還可用于傳遞額外的gMgINFO參數(shù),該參數(shù)避免在調(diào)用攔截期間對(duì)原始應(yīng)用程序的堆棧進(jìn)行修改。gMg攔截函數(shù)對(duì)INFOstructure的實(shí)例的地址的進(jìn)棧進(jìn)行匯編,然后建立調(diào)用攔截處理,該處理;陂指定為在攔截2045、2048期間內(nèi)^^皮調(diào)用。gMg對(duì)被替換的函數(shù)的原始代碼的副本進(jìn)行處理和保存2048。在返回之后,將全部寄存器退棧,從而跳轉(zhuǎn)至形實(shí)轉(zhuǎn)換程序內(nèi)的代碼(保持地址或指針的結(jié)構(gòu))2054,以返回原始的調(diào)用例程。通過指向真實(shí)例程的prealproc,可對(duì)用于原始例程的代碼進(jìn)行訪問。在從主機(jī)應(yīng)用程序代碼中進(jìn)行調(diào)用期間,對(duì)跳轉(zhuǎn)指令2039進(jìn)行匯編,該指令從原始目標(biāo)函數(shù)代碼中的攔截點(diǎn)形實(shí)轉(zhuǎn)換至相關(guān)聯(lián)的gMg攔截例程2045。對(duì)原始代碼進(jìn)行復(fù)制2048,然后對(duì)另一個(gè)跳轉(zhuǎn)指令進(jìn)行匯編,該指令形實(shí)轉(zhuǎn)換回?cái)r截例程返回的(目標(biāo)代碼中的)延續(xù)點(diǎn)2042。這就實(shí)現(xiàn)了兩個(gè)形實(shí)轉(zhuǎn)換程序的構(gòu)建一個(gè)用于攔截,另一個(gè)用于返回。在可選的實(shí)施方式中,將這兩個(gè)形實(shí)轉(zhuǎn)換程序合并為一個(gè)更大的形實(shí)轉(zhuǎn)換程序,其能從gMg攔截例程內(nèi)部對(duì)原始例程直接調(diào)用,或能對(duì)跳轉(zhuǎn)至原始例程的地址prealproc進(jìn)行調(diào)用,從而繞過攔截。在設(shè)置或方法監(jiān)控進(jìn)程和形實(shí)轉(zhuǎn)換程序的使用中出現(xiàn)了大量問題多線程應(yīng)用程序之間的線程沖突以及與gMgGUI對(duì)象樹更新相關(guān)的事件處理。如果另一個(gè)線程正在調(diào)用執(zhí)行該線程的形實(shí)轉(zhuǎn)換程序,那么,在對(duì)原始的形實(shí)轉(zhuǎn)換程序代碼進(jìn)行修改或重寫時(shí)可出現(xiàn)一個(gè)問題,可能將疏忽地執(zhí)行被替代的代碼。為了避免這種問題,gMg系統(tǒng)使用可用于動(dòng)態(tài)地適應(yīng)不同情況(也就是睡眠或線程掛起)的技術(shù)。為了避免方法監(jiān)控中的線程沖突,如果多個(gè)線程試圖在gMg試圖修改代碼時(shí)執(zhí)行相同的代碼,那么,睡眠4支術(shù)則發(fā)出N毫秒的睡眠函數(shù),嘗試避免沖突。睡眠將線程中止,并重新啟動(dòng)用于該線程的時(shí)間片。這意味著,線程具有完整的時(shí)間片來完成其操作,以減少錯(cuò)誤發(fā)生的可能。如上所述,作為修改原始指令的一部分,對(duì)跳轉(zhuǎn)至gMg攔截例程的跳轉(zhuǎn)指令進(jìn)行匯編。這可作為宏或內(nèi)聯(lián)函數(shù)實(shí)現(xiàn),輸入跳轉(zhuǎn)操作碼并計(jì)算偏移地址。另一個(gè)技術(shù)是用API調(diào)用短暫地中止進(jìn)程中的全部線程。如果線程的確引起了異常,那么則可響應(yīng)于某些消息使用異常分支指令攔截該異常,并且該異??稍试S線程引起異常但使線程適度地重新啟動(dòng)。為了進(jìn)一步減少出現(xiàn)問題的可能性,除了睡眠之外,可將線程優(yōu)先級(jí)升為"高"。其它線程也可被啟動(dòng),但具有較小的沖突機(jī)會(huì)。除了在多CPU環(huán)境中監(jiān)控的情況下,單獨(dú)使用睡眠技術(shù)可能就已足夠。在具有多CPU的情況下,OS通常在函數(shù)/方法攔截過程中向不同的進(jìn)程分配處理。關(guān)于多線程,對(duì)于通過輸入表調(diào)用的函數(shù)而言,使用輸入表的額外攔截機(jī)制基本鎖定該調(diào)用,改變用于攔截的代碼,然后通過改變輸入表的值對(duì)調(diào)用解鎖。函數(shù)Getprocaddress將地址提供到輸入表中。此外,通過GUI對(duì)象樹掃描對(duì)方法監(jiān)控進(jìn)行交叉存取,以與主機(jī)應(yīng)用程序一致,并使樹與主機(jī)應(yīng)用程序保持同步。具有事件和樹掃描控制機(jī)制,該機(jī)制調(diào)用以O(shè)bjectlnterfaceEPT開始的一串函數(shù)。首先調(diào)用GetStringEventProperty()并傳遞索引,但是如果未出現(xiàn)屬性,則調(diào)用GetStringWinEventsProperty(),然后調(diào)用StringGetWebEventPropertyQ。在調(diào)用被監(jiān)控的函數(shù)之前,并在應(yīng)用程序調(diào)用被攔截的函數(shù)之前,進(jìn)行測(cè)試以確定gMg是否可能正在監(jiān)控當(dāng)前事件。如果其它事件此時(shí)正在被處理,并且具有檢測(cè)到的事件時(shí),那么,則以對(duì)掃描應(yīng)用程序樹的優(yōu)先級(jí)進(jìn)行更新的方式對(duì)主才幾應(yīng)用程序的GUI樹重新掃描。否則,通常僅根據(jù)計(jì)時(shí)器事件對(duì)應(yīng)用程序樹進(jìn)行掃描。如果應(yīng)用程序忙,那么則可生成許多被攔截的事件。此外,控制OSws」imer事件,從而在檢查中保持應(yīng)用程序的變化。在某些情況下,如果在處理gMg事件時(shí)沒有完成,則對(duì)樹重新掃描,這樣就會(huì)在內(nèi)部產(chǎn)生處理另一類事件的創(chuàng)建或破壞事件。為此,需要重新檢查。不同類型的應(yīng)用程序組件封裝將呈現(xiàn)不同的方法結(jié)構(gòu),并因此需要不同的方法對(duì)目標(biāo)方法/函數(shù)及其接口進(jìn)行定位。由于COM是用于構(gòu)建用于MicrosoftWindows的企業(yè)主機(jī)應(yīng)用程序的重要組件技術(shù),因此,對(duì)于組件監(jiān)控而言,通過用于屬性;險(xiǎn)索或事件;險(xiǎn)測(cè)的VTable對(duì)COM方法進(jìn)行;險(xiǎn)測(cè)是必需的gMg纟支術(shù)。在為類的特定實(shí)例的COM對(duì)象的實(shí)例中,最主要的gMg目標(biāo)是定位對(duì)象的VTable。如果對(duì)象不存在,那么則可在VTable的創(chuàng)建階段對(duì)其進(jìn)行檢索。但是,如果對(duì)象已存在,那么,gMg則通過創(chuàng)建其臨時(shí)對(duì)象而定位VTable。當(dāng)創(chuàng)建了任何新的對(duì)象時(shí),該對(duì)象訪問與已示例的現(xiàn)有對(duì)象相同的VTable。gMg創(chuàng)建臨時(shí)對(duì)象,該臨時(shí)對(duì)象用于對(duì)由屬于組件的一組方法共享的現(xiàn)有VTable進(jìn)行定位。一旦對(duì)VTable定位,gMg方法簽名攔截例程則可設(shè)置為執(zhí)行監(jiān)控進(jìn)程。使用類將對(duì)象示例在存儲(chǔ)器中,并通過GUID(MicrosoftWindows中通常用于識(shí)別任何編程組件的唯一標(biāo)識(shí)符)和接口名對(duì)類進(jìn)行識(shí)別。在類別庫中找到之后,gMg腳本編寫程序^f吏用gMg4全-驗(yàn)工具通過接口名提供id。由DLL公布之后,在例如gMg工具VTree或微軟OLEView的使用程序中可找到該id。DLL包含具有對(duì)COM對(duì)象的描述的類型庫。一旦id被發(fā)現(xiàn),與對(duì)象內(nèi)的類相關(guān)聯(lián)的接口的GUID也可發(fā)現(xiàn)。在運(yùn)行時(shí),對(duì)象接口的id則從腳本中得出。類可實(shí)現(xiàn)多種接口(例如,IUnknown、IDispatch等)。在對(duì)象中實(shí)現(xiàn)的該類的全部其它接口通常在登記處公開。類的id用于創(chuàng)建對(duì)象實(shí)例,以創(chuàng)建到感興趣的對(duì)象的接口。相反地,一旦知道了接口的id,則可得到實(shí)現(xiàn)該接口的類的id。給定了類id和接口id之后,則可創(chuàng)建對(duì)象實(shí)例。該實(shí)例被創(chuàng)建用于非常短的時(shí)間,并且在對(duì)象被破壞之前,當(dāng)在存儲(chǔ)器中發(fā)現(xiàn)VTable的地址時(shí)將其存儲(chǔ)。盡在加載了實(shí)現(xiàn)接口的模塊之后,才對(duì)接口進(jìn)行監(jiān)控。接收模塊對(duì)象上的gMg創(chuàng)建事件,這意味著存在該模塊。當(dāng)Vtable此時(shí)被示例在存儲(chǔ)器中時(shí),可對(duì)接口進(jìn)行監(jiān)控。編譯器已事先創(chuàng)建,并在編譯時(shí)生成全部可能的VTable,這些VTable在運(yùn)行時(shí)位于源代碼中。編譯為包含指向代碼的指針的固定表的VTable由全部實(shí)例共享。當(dāng)創(chuàng)建了對(duì)象實(shí)例之后,向一段存儲(chǔ)分配指向VTable的第一雙字。例如,如果具有相同類型的十個(gè)對(duì)象,那么,其全部通向相同的VTable,該VTable與接口是同義的。關(guān)于不同計(jì)算機(jī)編程語言中的編譯,當(dāng)例如標(biāo)準(zhǔn)C編程接口將使用數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)其方法時(shí),以€++構(gòu)建的組件使用虛擬函數(shù)。如上所討論的,虛擬函數(shù)實(shí)現(xiàn)為VTable,并包含指向相應(yīng)方法的指針。此外,VTable包括大量的接口集,作為COM定義的一部分(即,IUnknown、IDispatch以及其它可選的定制集)。給定可具有多實(shí)例的COM對(duì)象,全部接口集都可從IUnknown中派生出。此外,派生確定VTable的內(nèi)容。例如,如果從Invoke中派生接口,VTable則包含指向Invoke指針的指針,Invoke指針指向方法。但是,如果接口不是從IDispatch中派生出并且執(zhí)行了Querylnterface,那么,將構(gòu)建不同的VTable。作為依賴于例如多類繼承的不同因素的IUnknown的一部分,圖21中VTable的前三個(gè)條目2106總是指向IUnknown接口的方法Querylnterface,然后是AddRef和Release(釋it)。,人IUnknown中派生出的下一個(gè)接口集是包含Invoke的IDispatch。Invoke是用于訪問組件內(nèi)一組方法的泛型方法。70VTable不總是奇異的,因?yàn)槔缭诙嗬^承情況下,可有多于一個(gè)的VTable指向相同的方法。此外,其它VTable可位于連接于相同方法集的其它地方。例如,可具有需要返回的兩個(gè)VTable(例如,方法X)。方法X可用作具有特定接口的VTable內(nèi)的索引N,或其也可通過調(diào)用不同的VTable用作調(diào)度(dispatch)idQ。當(dāng)由VTable起作用時(shí),會(huì)遇到大量問題。包含指針的攔截VTable是監(jiān)控方法調(diào)用的一種方法。然而,在某些情況下,VTable指針的VTable攔截可證明為不合適的,因?yàn)樵诳衫@過VTable的函數(shù)調(diào)用內(nèi)可發(fā)生內(nèi)部調(diào)用。其它問題可包括主機(jī)應(yīng)用程序能直接調(diào)用函數(shù)而無需使用VTable定位函數(shù),并且可具有全部指向相同函數(shù)的多個(gè)VTable。這就暗示了,對(duì)于給定的目標(biāo)函數(shù),監(jiān)控系統(tǒng)將必須攔截全部相關(guān)的VTable,這可i正明是禁止的或者可證明訪問全部這些VTable是否為困難的。通過一個(gè)已知的接口(iKnown),Querylnterface可用于定位多個(gè)VTable,但可創(chuàng)建相當(dāng)多的處理開銷。然而,Querylnterface是一種可選的方法,其中可使用數(shù)字簽名函數(shù)攔截技術(shù)。IDispatch是來自微軟公司的可用產(chǎn)品Automation的一部分,其提供到應(yīng)用程序的組件的接口,其中Automation用于執(zhí)行后結(jié)合(即,在運(yùn)行時(shí)間而不在編譯時(shí)間確定待調(diào)用的函數(shù))。IDispatch是從IUnknown中派生出的。IDispatch包含在VTable中時(shí),如果調(diào)用(Invoke)和直接方法接口都可用,那么其則具有雙接口。在Automation(微:軟的組件:技術(shù))中^見定了方法id,Automation使用泛型激活方法激活索引方法,其中Invoke是IDispatch的一部分。Invoke執(zhí)行具體方法,且每個(gè)對(duì)象都映射到方法用于檢索或設(shè)置屬性。當(dāng)沒有實(shí)現(xiàn)雙接口時(shí),Invoke由于一些因素可為更慢的,這些因素例如必須準(zhǔn)備全部參數(shù)、或者需要在調(diào)用之前設(shè)置變量列表。然而,如果雙接口是可用的,那么,虛擬函數(shù)則存在且具有指向VTable中的函數(shù)的指針,指向位于實(shí)際代碼中的方法。第一目標(biāo)是攔截新的COM對(duì)象實(shí)例的創(chuàng)建,定位iKnown接口,以及確定虛擬函數(shù)是否存在,即使其并不從IDispatch中派生出??蛻粽{(diào)用輸出函數(shù)DLLGetClassObject(),其要求類工廠接口。一旦其得到類結(jié)構(gòu)接口,其則調(diào)用MethodCreatelnstance(),該函數(shù)需要參數(shù)計(jì)算出用于待示例的對(duì)象的接口GUID的id。作為gMg方法監(jiān)控的一部分,還對(duì)Createlnstance進(jìn)行攔截。該方法需要接口的GUID作為參數(shù),該接口是將要?jiǎng)?chuàng)建的實(shí)例所實(shí)現(xiàn)的。當(dāng)DLLGetClassObject完成處理之后,其返回IKnown、接口的GUID、以及ThisPointer,其中從ThisPointer指向VTable的指針可被發(fā)現(xiàn)。如果接口不是從IDispatch方法派生出的,其則暗示了,該應(yīng)用程序使用的是早結(jié)合,也就是說,調(diào)用的函數(shù)是已知的,并在編譯時(shí)就鏈接到了一起,全部這些都是得到gMg系統(tǒng)的支持的。通常,指向Idispatch的指針與對(duì)象的實(shí)例同義。如果接口是從IDispatch派生出的,那么,該接口則創(chuàng)建其自身的VTable,但是相反地,如果接口不是從IDispatch派生出的,那么,則創(chuàng)建完全分離的VTable。在發(fā)現(xiàn)創(chuàng)建了新的COM之后,下一個(gè)對(duì)象將對(duì)實(shí)現(xiàn)包含在COM組件內(nèi)的功能性的真實(shí)方法代碼進(jìn)行定位和訪問。實(shí)際的COM方法執(zhí)4亍具體的動(dòng)作并可^皮直接訪問或通過Invoke訪問,在Invoke中,通過具有id的切換狀態(tài),每個(gè)對(duì)象都是可訪問的。有時(shí),方法還可被直接暴露和調(diào)用。如果在Typelibrary中將對(duì)象說明為虛擬表中的雙接口,并且具有指向虛擬表的指針時(shí),可對(duì)表進(jìn)行檢查以對(duì)目標(biāo)函數(shù)的地址定位。該方法實(shí)際僅存在于例如組件日歷控制實(shí)施例的特定接口的上下文中。如果具有接口的GUID,那么VTable及其接口則都已知。IKnown提供方法的VTable(如果其可用的話)。此外,必須完成Querylnterface,以得到可返回不同VTable的IDispatch。圖21進(jìn)一步示出了COM對(duì)象及其內(nèi)部自動(dòng)接口和VTable。盡管可具有COM對(duì)象的多個(gè)實(shí)例2109、2112、2115,4旦是這些實(shí)例將共享相同的VTable,該VTable反過來也共享相同的代碼2135。在DLL2115內(nèi),具有指向DLL的VTable的指針。位于VTable2136中的虛擬函凄t是作為間接查找方法(例如2139、2142、2145)的結(jié)構(gòu)的一部分的指針。由于是虛擬的,因此可從不同的類中派生出新的類,以形成新的類。例如,可從IDispatch接口2124中派生出新的類。在編譯期間,可對(duì)原始VTable進(jìn)行復(fù)制,除了將有新的指針指向新派生出的Invoke類。從宣布(declare)為具有純虛擬方法的類中派生出的固定類必須在編譯時(shí)具有這些實(shí)際定義的方法的實(shí)現(xiàn),并可覆蓋其各自的接口定義。如果未提供方法,那么則會(huì)發(fā)生編譯錯(cuò)誤。標(biāo)記為"VTable詳情"的附圖部分提供了VTable2136的特寫—見圖2118。COM的Iunknown2121和IDispatch2124(包含Querylnterface2127、Addref2130、Release2133和Invoke2134)對(duì)于創(chuàng)建的類而言是具體的,并且必須具有在組件編譯時(shí)鏈接的其各自的實(shí)現(xiàn)。圖21將用于Invoke方法的具體攔截例程表示為監(jiān)控虛擬函數(shù)的一部分。在對(duì)被監(jiān)控的函數(shù)和暗示的gMg參數(shù)進(jìn)行g(shù)Mg調(diào)用期間,與原始函數(shù)完全相同的參數(shù)被復(fù)制和使用。根據(jù)實(shí)施方式的設(shè)計(jì),可有許多不同的派生出的Invoke包含在組件中。例如,可有任何數(shù)量的Invoke方法從IDispatch中派生出(例如,A類Invoke2148、B類Invoke2154、C類Invoke2157等),還可有對(duì)任何實(shí)現(xiàn)的Invoke類方法的許多調(diào)用。對(duì)各Invoke(A、B、C)的不同調(diào)用使得gMg攔截例程向每個(gè)Invoke分配各自的上下文形實(shí)轉(zhuǎn)換程序2169、2172,用于任何數(shù)量的調(diào)用2175。將InvokeA類作為實(shí)例,gMg調(diào)用攔截^f吏程序流從2163處的重定向移動(dòng),以到達(dá)適當(dāng)?shù)念怉的形實(shí)轉(zhuǎn)換程序2169,用于具體調(diào)用實(shí)例數(shù)據(jù)結(jié)構(gòu)的、調(diào)用包含的上下文數(shù)據(jù)。從Invoke派生出的不同IDispatch會(huì)具有不同的形實(shí)轉(zhuǎn)換程序,例如具有InvokeB的信息2172。然而,gMg攔截處理例程2166對(duì)于全部實(shí)例都是一樣的,并且服務(wù)于全部VTable方法2135。此外,通過^r索適當(dāng)?shù)恼{(diào)用上下文信息和代碼2178,gMg處理從攔截例程路由至適當(dāng)?shù)姆椒康牡?148。這將是包含在上下文數(shù)據(jù)結(jié)構(gòu)中的適當(dāng)?shù)哪康牡刂羔?。上下文信息保持在包含指向形?shí)轉(zhuǎn)換程序的指針的gMg對(duì)象、監(jiān)控函數(shù)延續(xù)定位2160(在由gMg攔截處理插入輸入跳轉(zhuǎn)指令之后)以及其它信息中。gMg攔截的流程如下進(jìn)行通過使用臨時(shí)gMg創(chuàng)建對(duì)象的技術(shù)對(duì)攔截代碼進(jìn)行設(shè)置。然后,當(dāng)調(diào)用程序2103激活目標(biāo)函數(shù)時(shí),攔截設(shè)置進(jìn)程在2148中的被監(jiān)控函數(shù)2163的入口點(diǎn)覆蓋原始代碼的一部分,但將被覆蓋的代碼的副本存儲(chǔ)到2178中。為了執(zhí)行實(shí)函數(shù),攔截調(diào)用73從2178中檢索輸入代碼部分,并在跳轉(zhuǎn)至延續(xù)定位2160之前首先執(zhí)行該部分。對(duì)于待執(zhí)行其自身調(diào)用以實(shí)現(xiàn)例如從方法調(diào)用中檢索某些屬性的任務(wù)的gMg而言,在2178中通過建立的被攔截接口實(shí)現(xiàn)調(diào)用執(zhí)行。如果被監(jiān)控的方法由主機(jī)應(yīng)用程序調(diào)用,那么將生成gMg事件。然而,如果該調(diào)用是由gMg解釋器通過檢查全局gMg鎖定而啟動(dòng)的(參見圖6),那么,gMg則具有阻止對(duì)調(diào)用進(jìn)行攔截的保護(hù)機(jī)制。僅有主機(jī)應(yīng)用程序啟動(dòng)的調(diào)用變?yōu)間Mg方法事件。gMg攔截例程對(duì)在被監(jiān)控的函數(shù)的輸入中檢測(cè)到的原始參數(shù)進(jìn)行捕獲,并將其傳遞至函數(shù)的原始代碼。其結(jié)果是,gMg攔截例程從堆棧中獲取實(shí)際參數(shù)。從方法返回之后,參數(shù)則主要從寄存器或包含在寄存器中的間接指針獲得。盡管之前在方法監(jiān)控部分的討論集中于對(duì)存儲(chǔ)對(duì)象預(yù)創(chuàng)建后創(chuàng)建以定位和監(jiān)控方法調(diào)用,但是,在gMg監(jiān)控系統(tǒng)中同等重要的是對(duì)方法返回的監(jiān)控。除了捕獲調(diào)用之外,對(duì)于捕獲方法結(jié)果并將其傳遞至gMg系統(tǒng)用于進(jìn)一步處理而言,捕獲方法返回值的技術(shù)也是有用的。對(duì)方法返回的監(jiān)控產(chǎn)生方法調(diào)用的結(jié)果,該結(jié)果對(duì)于gMg腳本在多種環(huán)境中的操作都是有用的。函數(shù)返回?cái)r截的原則可針對(duì)組件封裝中多種不同類型的目標(biāo),本文討論兩種捕獲函數(shù)返回的方法。第一種是堆棧復(fù)制方法,其包括復(fù)制堆棧。第二種是堆棧分配方法,其動(dòng)態(tài)地對(duì)形實(shí)轉(zhuǎn)換程序進(jìn)行分配和解分配,以保留調(diào)用和返回上下文。對(duì)于監(jiān)控方法返回,第一種"堆棧復(fù)制"技術(shù)是基于對(duì)堆棧的一部分進(jìn)行復(fù)制(使用調(diào)用程序的堆棧幀),并使用該復(fù)制影響目標(biāo)函數(shù)的通往gMg調(diào)用和返回?cái)r截例程的程序流或來自該例程的程序流。堆棧復(fù)制方法攔截堆棧,而不修改原始堆棧。通過復(fù)制堆棧的一部分并攔截函數(shù)返回的執(zhí)行點(diǎn),程序執(zhí)行轉(zhuǎn)而移動(dòng)至gMg攔截例程,該例程斗企測(cè)堆棧移動(dòng)并在堆棧的gMg代碼版本內(nèi)執(zhí)行堆棧操作。假定gMg系統(tǒng)是透明的,并且不需要對(duì)應(yīng)用程序的源代碼進(jìn)行修改,還假定組件是私有的,那么,則推測(cè)沒有可用于目標(biāo)監(jiān)控程序的文件,并且不會(huì)知道有多少參數(shù)正在傳遞至函數(shù)。因此,當(dāng)對(duì)捕獲的堆棧部分(其足夠大從而能夠捕獲N個(gè)參數(shù))進(jìn)行復(fù)制時(shí),該堆棧部分包含所需的函數(shù)參數(shù)以及可能與監(jiān)控進(jìn)程不相關(guān)的某些額外的數(shù)據(jù)。堆棧復(fù)制技術(shù)包含指向gMg攔截代碼的返回地址,該地址識(shí)別多少堆棧指針移動(dòng)了。例如,如果gMg代碼增加了二十個(gè)字(作為預(yù)設(shè)配置),那么,在返回gMg代碼之后,則將堆棧指針加二十,將堆棧指針定位于堆棧中適當(dāng)?shù)奈恢?。?duì)堆棧上全部的函數(shù)參數(shù)進(jìn)行復(fù)制,并且函數(shù)返回具有返回地址的調(diào)用。最后,當(dāng)完成了對(duì)方法的調(diào)用之后,在返回原始調(diào)用程序之前,將堆棧上的參數(shù)的副本移除。本實(shí)施例中的方法通常在每次返回時(shí)復(fù)制參數(shù)中的二十個(gè)字。在參數(shù)被從解除程序中傳遞和調(diào)用的位置,UninterceptcallEDX()解開函數(shù),釋放任何使用的存儲(chǔ),并且如果需要的話,將任何保存的存儲(chǔ)重新存儲(chǔ)至原始方法的狀態(tài),并且,當(dāng)gMg對(duì)象的參考計(jì)數(shù)變?yōu)榱銜r(shí),該函數(shù)毀壞對(duì)象并釋放攔截。在建立攔截例程時(shí),還必須考慮計(jì)時(shí)問題。參照?qǐng)D22,其中示出了堆棧復(fù)制技術(shù)監(jiān)控返回。調(diào)用程序2202調(diào)用正在被監(jiān)控的方法。到達(dá)之后,堆棧2210則可包含方法的參數(shù)2215,以及調(diào)用程序的返回地址2220,程序流在完成方法調(diào)用之后在該:t也址上繼續(xù)。然而,當(dāng)方法被監(jiān)控時(shí),從gMg監(jiān)控設(shè)置階段開始(參照?qǐng)D18),被監(jiān)控的函數(shù)調(diào)用的入口地址就已被定位,并且在攔截的調(diào)用階段,用跳轉(zhuǎn)指令2230對(duì)入口進(jìn)行修改。在覆蓋原始代碼之前,已被覆蓋的函數(shù)操作碼被保持,并且對(duì)于攔截的對(duì)原始函數(shù)代碼調(diào)用2245的調(diào)用是有用的。因此,當(dāng)應(yīng)用程序調(diào)用被監(jiān)控的函數(shù)2225時(shí),程序流則輸入函數(shù)的代碼地址。由于修改了入口,因此,執(zhí)行g(shù)Mg跳轉(zhuǎn)指令2230,將程序流切換至gMg攔截設(shè)置例程2240。首先,攔截設(shè)置例程制造堆棧一部分的副本2250。gMg系統(tǒng)對(duì)被監(jiān)控函數(shù)調(diào)用中的參數(shù)的最大數(shù)量做出假設(shè),確定待捕獲的堆棧字節(jié)數(shù)?;谶@種假設(shè),gMg使用配置的大小限制,根據(jù)函數(shù)的輸入捕獲堆棧的一部分。該堆棧部分包含函數(shù)參數(shù)值2255、原始返回地址2260以及一些附加數(shù)據(jù)。在返回設(shè)置階段的另一個(gè)步驟是在堆棧副本中修改返回地址2260,其結(jié)果是產(chǎn)生指向返回捕獲執(zhí)行2280的指針,返回捕獲l5M于在程序流返回調(diào)用程序2205之前進(jìn)行。此時(shí),完成了返回捕獲的i殳置,并且對(duì)方法返回75值的捕獲已就緒并如下進(jìn)行。為了執(zhí)行對(duì)監(jiān)控函數(shù)的調(diào)用,在跳轉(zhuǎn)至方法代碼2235的延續(xù)點(diǎn)之前,獲取并執(zhí)行已由跳轉(zhuǎn)指令2230在gMg攔截例程設(shè)置期間覆蓋的操作碼。監(jiān)控函數(shù)的剩余代碼現(xiàn)在執(zhí)行(由攔截例程的跳轉(zhuǎn)指令覆蓋的)初始輸入操作碼以及必要的堆棧操作,以傳遞來自原始調(diào)用程序2205的參數(shù)。堆棧操作在堆棧的攔截例程副本2255上執(zhí)行,而不是在應(yīng)用程序的原始堆棧2215上執(zhí)行。完成堆棧操作之后,程序流到達(dá)方法的結(jié)尾處,并執(zhí)行位于gMg攔截例程的堆棧副本2260中的返回指令。該指令將執(zhí)行流移至攔截例程的返回捕獲代碼2280。此時(shí),從寄存器捕獲返回值,或使用從堆棧副本2250中查找到并的指針捕獲返回值,并將返回值2265存儲(chǔ)到調(diào)用程序可訪問的存儲(chǔ)器中。在gMg腳本級(jí),如果腳本涉及函數(shù)調(diào)用攔截的當(dāng)前事件對(duì)象,那么,則可向該腳本分配腳本變量,然后該變量則可被引用。假定分配的變量是條件的一部分(用于調(diào)用或返回4企測(cè)),如果接收到方法調(diào)用(或返回)事件,那么,通過跳轉(zhuǎn)至包含調(diào)用程序2205的地址的原始堆棧,腳本邏輯則將腳本執(zhí)行路由至原始調(diào)用程序2275。返回代碼的執(zhí)行使堆棧以正常方式出棧,即,通過由在攔截進(jìn)程開始時(shí)復(fù)制的量調(diào)整堆棧指針寄存器實(shí)現(xiàn),而程序流在主機(jī)應(yīng)用程序中繼續(xù)執(zhí)行。作為一種選擇,堆棧分配方法提供了用于捕獲返回值的另一種方法。與堆棧復(fù)制方法不同,在堆棧分配方法中,不對(duì)調(diào)用程序的堆棧進(jìn)行復(fù)制。而是對(duì)小的形實(shí)轉(zhuǎn)換程序進(jìn)行動(dòng)態(tài)分配,以對(duì)調(diào)用上下文及其各自的返回保持跟蹤。為了跟蹤函數(shù)返回值,形實(shí)轉(zhuǎn)換程序包含堆棧上修改過的返回地址,該地址指向檢查返回值的另一個(gè)形實(shí)轉(zhuǎn)換程序。與支持調(diào)用監(jiān)控的形實(shí)轉(zhuǎn)換程序不同,返回監(jiān)控使用被動(dòng)態(tài)管理的形實(shí)轉(zhuǎn)換程序。也就是說,在每次調(diào)用和返回后,這些形實(shí)轉(zhuǎn)換程序都被分配或解除分配。在堆棧分配方法中,具有多個(gè)階段首先是從調(diào)用程序到被監(jiān)控函數(shù)的輸入,接著在調(diào)用被監(jiān)控函數(shù)時(shí)設(shè)置返回?cái)r截例程。然后,調(diào)用原始被監(jiān)控函數(shù),接著返回并捕獲返回值,最后情況并返回到調(diào)用程序。如圖23所示的堆棧分配返回監(jiān)控方法動(dòng)態(tài)地分配形實(shí)轉(zhuǎn)換程序內(nèi)存,其中形實(shí)轉(zhuǎn)換程序用于代碼重定向和保留調(diào)用或返回的上下文,以保持主機(jī)應(yīng)用程序的連續(xù)性。當(dāng)函數(shù)被攔截之后,將被覆蓋的原始代碼保存到形實(shí)轉(zhuǎn)換程序空間中,其之后是恢復(fù)執(zhí)行被監(jiān)控函數(shù)的跳轉(zhuǎn)指令。設(shè)置了多個(gè)形實(shí)轉(zhuǎn)換程序,一個(gè)用于進(jìn)行攔截,另一個(gè)用于在輸入攔截的啟動(dòng)部分之后恢復(fù)執(zhí)行,在一個(gè)用于處理返回。由于任何給定方法的共有特征,需要攔截上下文使用個(gè)體數(shù)據(jù)(即,調(diào)用形實(shí)轉(zhuǎn)換程序2330、2327、2354、2357、2342、2351)處理主才幾應(yīng)用程序調(diào)用和返回的合適路由,上述個(gè)體數(shù)據(jù)描述不同調(diào)用實(shí)例的細(xì)節(jié)。例如,如果給定均調(diào)用方法Q的兩個(gè)主才幾應(yīng)用程序函數(shù)X和Y,gMg攔截例程P則將跟蹤兩個(gè)不同的返回地址,一個(gè)用于函數(shù)X,—個(gè)用于函數(shù)Y。對(duì)不同上下文保持跟蹤以確保保持不同主機(jī)應(yīng)用程序函數(shù)的程序流和連續(xù)性是gMg形實(shí)轉(zhuǎn)換程序的重要任務(wù)。調(diào)用程序2303調(diào)用被監(jiān)控的函數(shù)2315,并遇到已在被監(jiān)控方法的入口被覆蓋的跳轉(zhuǎn)指令2318。該跳轉(zhuǎn)指令到達(dá)開始返回?cái)r截例程的設(shè)置進(jìn)程,以處理成功執(zhí)行攔截所需的動(dòng)態(tài)信息的代碼。在堆棧2306中修改返回地址2312,該堆棧還包括指向形實(shí)轉(zhuǎn)換程序的參數(shù)2309,該形實(shí)轉(zhuǎn)換程序提供到gMg共享形實(shí)轉(zhuǎn)換解分配(deallocation)和返回捕獲例程2366的跳轉(zhuǎn)連接,返回捕獲例程2366連4妄于方法調(diào)用的上下文的返回部分2348,其中該上下文跟蹤不同的調(diào)用實(shí)例。這種動(dòng)態(tài)分配的形實(shí)轉(zhuǎn)換程序包含原始返回地址2348。返回?cái)r截例程設(shè)置在調(diào)用期間的另一個(gè)動(dòng)作是分配另一個(gè)形實(shí)轉(zhuǎn)換程序2330,該形實(shí)轉(zhuǎn)換程序提供用于當(dāng)前調(diào)用實(shí)例的上下文信息,并且也是返回階段設(shè)置的一部分(每個(gè)實(shí)例中都對(duì)返回重定向)。然后處理到達(dá)共享的分配例程2336,該例程對(duì)形實(shí)轉(zhuǎn)換程序2342進(jìn)行分配,形實(shí)轉(zhuǎn)換程序2342存儲(chǔ)在用于當(dāng)前實(shí)例的調(diào)用程序原始返回地址中,并設(shè)置到返回捕獲進(jìn)程2360的鏈接。通過調(diào)用形實(shí)轉(zhuǎn)換程序2354,在2339中執(zhí)行被監(jiān)控方法的處理例程2333調(diào)用,形實(shí)轉(zhuǎn)換程序2354已將被跳轉(zhuǎn)指令覆蓋的操作碼存儲(chǔ)于在方法2318的入口點(diǎn)。方法的執(zhí)行在延續(xù)點(diǎn)2321恢復(fù)并繼續(xù),直到處理完成后到達(dá)返回指令2324。由于原始返回地址在返回?cái)r截設(shè)置階段已被修改2312,因此程序執(zhí)行現(xiàn)在到達(dá)gMg例程2345,該例程包含到返回捕獲代碼的鏈接而不是返回調(diào)用程序2303。程序流現(xiàn)在到達(dá)捕獲進(jìn)程2366的結(jié)尾,在該結(jié)尾處,對(duì)形實(shí)轉(zhuǎn)換程序進(jìn)行解分配2363,捕獲返回值2360,并且將gMg事件發(fā)給gMg解釋器。在gMg腳本級(jí),如果腳本涉及函數(shù)調(diào)用攔截的當(dāng)前事件對(duì)象,則可為該腳本分配腳本變量,然后這些變量就可被引用了。假定分配的變量是條件的一部分(用于調(diào)用或返回檢測(cè)),如杲接收到了方法調(diào)用(或返回)事件,腳本邏輯則將腳本執(zhí)行路由至適當(dāng)?shù)膭?dòng)作。通過捕獲的輸出,程序流遵循調(diào)用程序2348的原始返回地址,并且間接跳轉(zhuǎn)將返回處理至調(diào)用程序2303。在堆棧分配方法中,gMg形實(shí)轉(zhuǎn)換程序的作用類似于按線程的堆棧,其對(duì)堆棧次序中的形實(shí)轉(zhuǎn)換程序進(jìn)行分配和解分配。gMg形實(shí)轉(zhuǎn)換程序需要相互兼容(compliment),這是因?yàn)樾畔⒈仨毰c返回地址是成對(duì)的。預(yù)分配一塊內(nèi)存,用于高效操作的增加的內(nèi)存分配,且其屬性同時(shí)為可重寫和可執(zhí)行的??傊琯Mg方法監(jiān)控提供了對(duì)從操作系統(tǒng)到應(yīng)用程序的多種組件的訪問,并提供了對(duì)公開且歸檔的功能性(用于其它非gMg工具)或?qū)ξ垂_且未歸檔的功能的訪問。方法監(jiān)控實(shí)現(xiàn)為用于gMg系統(tǒng)的附加的傳感器,其和GUI傳感器一起與gMg解釋器通信,以通過獨(dú)特的GUI上下文和用于描述主機(jī)應(yīng)用程序行為的附加信息提供集成、擴(kuò)展、或關(guān)聯(lián)。盡管本文描述了COM和輸出函數(shù),但是,在gMg方法監(jiān)控中應(yīng)用的原理還適用于許多其它組件技術(shù),并且可容易地適用于gMg的抽象模型。在這一階段,全部gMg監(jiān)控源都生成為能產(chǎn)生不同數(shù)據(jù)類型的復(fù)合物的gMg事件的形式,特別地,全部都生成在GUI上下文中。低層級(jí)事件,即,在gMg源點(diǎn)處檢測(cè)到的事件,則可由狀態(tài)機(jī)在最可用和最高效位置處進(jìn)行的處理的不同階段進(jìn)行處理。原則上,只要知道了某個(gè)事件,就應(yīng)該馬上考慮該事件,用于給定要求的狀態(tài)處理。為此,在gMg系統(tǒng)內(nèi),狀態(tài)才幾執(zhí)行可用于本地的和遠(yuǎn)程的處理。圖24示出了gMg狀態(tài)機(jī)層次。給定本地的和遠(yuǎn)程的狀態(tài)機(jī)機(jī)制,78gMg系統(tǒng)能建立輕量(lightweight)分布的狀態(tài)機(jī)層次,以提供最大的靈活性和對(duì)網(wǎng)絡(luò)間實(shí)時(shí)響應(yīng)的及時(shí)傳送。被監(jiān)控的目標(biāo)主機(jī)應(yīng)用程序2418、2421。2424表現(xiàn)為具有侵入其中以檢測(cè)和收集事件的gMg傳感器。一旦檢測(cè)到事件,則將事件作為gMg消息發(fā)送給其各自的解釋器2412、2413、2414,每個(gè)解釋器都正在運(yùn)行腳本(例如2409)。例如,腳本可定義小且快的"本地"狀態(tài)機(jī)2403,該狀態(tài)機(jī)將低級(jí)觸發(fā)事件(用gMg傳感器檢測(cè)到的)翻譯為邏輯事件。對(duì)這些邏輯事件進(jìn)行過處理之后,則可將其封裝為由遠(yuǎn)程(這里為第二級(jí)處理)狀態(tài)機(jī)接收的一個(gè)或多個(gè)跟蹤消息2415,這種封裝通常是在gMg收集服務(wù)器2406上完成的。這些邏輯事件反過來則可進(jìn)一步由其它的一組或多組狀態(tài)機(jī)處理,以基于連續(xù)多組狀態(tài)產(chǎn)生多層邏輯事件,該多層邏輯事件可作為檢測(cè)響應(yīng)2427向前傳遞。該過程進(jìn)一步由層次2430中的狀態(tài)機(jī)2432示出。單一的狀態(tài)機(jī)2442(特寫的)具有一系列輸入觸發(fā)事件2445、2448、2451和輸出2454。該示出可饋送至其它的狀態(tài)機(jī)中,其它狀態(tài)才幾在本地2409或遠(yuǎn)程2406位于相同的腳本中。狀態(tài)機(jī)層次樹2430表示了一系列狀態(tài)機(jī)(即,2430、2433、2436、2439),這些狀態(tài)才幾可為本地狀態(tài)機(jī)和遠(yuǎn)程狀態(tài)機(jī)的任意組合,并具有與輸入兼容的輸出,以基于gMg事件形成靈活的狀態(tài)檢測(cè)機(jī)制。鏈接分布式的狀態(tài)機(jī)的能力使得能在集中式服務(wù)器上對(duì)事件進(jìn)行快速檢測(cè)和路由,這是因?yàn)榇蟛糠譅顟B(tài)處理都可根據(jù)用戶或某些本地主機(jī)應(yīng)用程序動(dòng)作而得到的4全測(cè)在本地立即地執(zhí)行。根據(jù)需要,可在客戶機(jī)上(即,本地)運(yùn)行狀態(tài)機(jī),以顯著減少大的用戶基數(shù)中對(duì)服務(wù)器資源的需求。保持事件之間的狀態(tài)的命令有利于用于實(shí)時(shí)警報(bào)和其它時(shí)間敏感操作的優(yōu)化處理,和減少網(wǎng)絡(luò)業(yè)務(wù)。為此,gMg腳本語言具有序列(Sequence)命令,其在客戶計(jì)算^L或虛擬客戶空間上(例如在終端月l務(wù)中)處理狀態(tài)。gMgSequence命令將目標(biāo)主機(jī)應(yīng)用程序的不同狀態(tài)檢測(cè)為事件,這些事件是用包含在Sequence命令語法中的邏輯表達(dá)語句描述的。下列代碼樣本示出了對(duì)由單一的動(dòng)作導(dǎo)致的一組狀態(tài)進(jìn)行跟蹤的Sequence命令的使用,也就是跟蹤命令的使用。代碼樣本init{functionfilesavemenuitem=…;functionsavedialogmydocuments=…;functionsavedialogsavebutton=…;functionsavedialogfilename=…;varfilename=nostringj};if(sequence(wlbutdown&&filesavemenuitem,〃(1)wlbutdown&&savedialogmydocuments:filename=_〃statementcontinuestonextlinefindsibling(savedialogfilename).title,〃(2)wlbutdown&&savedialogsavebutton"〃(3)track(saveend,topwindow,'FileSaveToMyDocumentsCompleted',file=filename);在代碼實(shí)施例中,在不同的打開對(duì)話框菜單項(xiàng)上按下"leftbuttondown(左按鈕向下)"。狀態(tài)命令通過SaveEnd事件和SavedMyDocumentsCompleted事件的觸發(fā),在"filemenuopen(文件菜單打開),,項(xiàng)中查找一系列左按鈕向下事件(1),然后查找"(打開文件保存)"對(duì)話框(2),最后查找"保存執(zhí)行的命令"(3)。該實(shí)施例中出現(xiàn)的"if,語句包含一系列條件,每個(gè)條件表示檢測(cè)為一系列事件的GUI對(duì)象。解釋器接收每個(gè)事件,并對(duì)事件之間的狀態(tài)保持跟蹤,其中序列按照由其命令確定的某種順序?qū)顟B(tài)聚合。在完成全部條件之后,條件變?yōu)檎妫瑘?zhí)行就落入了序列命令的主體中并執(zhí)行其內(nèi)容。通常,這些內(nèi)容可為單一的跟蹤消息,該消息反映由序列命令或其它動(dòng)作滿足的狀態(tài)和條件。序列命令的其它特征將允許更復(fù)雜的才喿作,例如OR's或80Compound操作,這些操作是有序序列或任意順序的序列。對(duì)于All—Of序列而言,當(dāng)全部事件A、B和C都發(fā)生時(shí),用于事件A、B和C的序列群條件變?yōu)檎?。?duì)于Any—Of序列而言,只要事件A、B或C中的任意事件發(fā)生一次,群序列條件則變?yōu)檎妗T谛蛄袑?,操作允許用邏輯布爾操作符將序列命令結(jié)合?;?OR)、與(And)、非(NOT)等可以任何組合使用。序列命令還可進(jìn)行嵌套,也就是,一個(gè)序列命令可包含另一個(gè)序列命令,如以下代碼段所示If(Sequence(S1a,Sequence(S2a,S2b,S2c),SIb》{Action...SendTrackMsg(Q)在此實(shí)施例中,第二序列命令包含在第一序列命令的基本條款內(nèi)。在處理時(shí),解釋器遇到第一序列1,并設(shè)置用于其條件的狀態(tài)跟蹤。其條件之一是另一個(gè)序列2命令,該命令反過來設(shè)置其自己的分開的狀態(tài)跟蹤。序列2命令等待事件,直到其完成了其定義的、可使其變?yōu)檎娴倪壿嬓蛄?。?dāng)對(duì)序列l(wèi)再次估計(jì)時(shí),其表達(dá)式完善其邏輯,并且處理繼續(xù)進(jìn)行。通常,整個(gè)操作在計(jì)算環(huán)境允許的可接受的資源級(jí)(內(nèi)存、CPU等)內(nèi)遞歸N次。此外,gMg腳本作為輸入的代碼生成器,例如Java代碼生成器,可用于在如gMg腳本的各種配置下的客戶組件上、或在gMg跟蹤和監(jiān)控服務(wù)器狀態(tài)機(jī)組件上生成并使用狀態(tài)機(jī)。這種本地狀態(tài)機(jī)機(jī)制和靈活配置的全部益處在于,服務(wù)器資源需求和網(wǎng)絡(luò)業(yè)務(wù)都明顯減少。再參照?qǐng)D4,其示出了4吏用的組件的扭克觀。如圖所示,gMg應(yīng)用程序生成由gMg收集服務(wù)器和跟蹤數(shù)據(jù)庫收集和接收的跟蹤消息或gMg事件。在這個(gè)階段,基于設(shè)計(jì)用于進(jìn)行靈活性和高效處理的遠(yuǎn)程狀態(tài)機(jī)進(jìn)行g(shù)Mg分析處理。進(jìn)入處理機(jī)制后,將事件保存至數(shù)據(jù)庫,然后由內(nèi)存內(nèi)的狀態(tài)機(jī)(實(shí)時(shí)的)立即對(duì)其進(jìn)行處理,或基于調(diào)度(接近于實(shí)時(shí)或延時(shí)分批)狀態(tài)機(jī)事件將其分批用于之后執(zhí)行。此外,在狀態(tài)機(jī)分析中,還具有大量的檢測(cè)GUI對(duì)象集的多實(shí)例的機(jī)制,這些對(duì)象集來自分離的gMg腳本或?yàn)閬碜詥我荒_本的GUI對(duì)象集。狀態(tài)機(jī)的初始配置定義在使用鐵路圖(railroaddiagram)范例的XML文件中。鐵路圖以筒明的形式描述并行的進(jìn)程和條件,并且通常是本領(lǐng)域公知的。在第一次從文件中加載XML時(shí)調(diào)用啟動(dòng)例程,并且創(chuàng)建初始狀態(tài)機(jī)設(shè)置。分析例程檢查每個(gè)元素、屬性、子元素等。XML文件用限定狀態(tài)機(jī)內(nèi)容和轉(zhuǎn)變的塊描述服務(wù)器狀態(tài)機(jī)方案的屬性。所述塊體現(xiàn)了容器的概念,所述容器為XML內(nèi)幫助將多個(gè)元素結(jié)合用于邏輯關(guān)系的結(jié)構(gòu)。容器為例如OR的布爾結(jié)構(gòu),其中OR是用于轉(zhuǎn)變的容器。容器對(duì)于其全部子類是唯一的。塊內(nèi)的編程語句描述事件進(jìn)程處理或邏輯動(dòng)作,邏輯動(dòng)作例如鏈接、阻塞、轉(zhuǎn)至或轉(zhuǎn)變。轉(zhuǎn)變是由包括布爾表達(dá)式或截止時(shí)間構(gòu)成的條件保護(hù)。通常,通過對(duì)任何給定跟蹤消息或事件當(dāng)前正在給定狀態(tài)機(jī)內(nèi)的何處被處理保持跟蹤,而在狀態(tài)機(jī)內(nèi)定義狀態(tài)。給定狀態(tài)之后,下一個(gè)轉(zhuǎn)變目的地則依賴于定義在跟蹤消息記錄的字段中的后面的事件。接收到的事件具有變?yōu)闋顟B(tài)的處理定位。如果事件與轉(zhuǎn)變標(biāo)準(zhǔn)相匹配,則到達(dá)該狀態(tài)定位,并且該到達(dá)定位變?yōu)樾碌臓顟B(tài)。因此,狀態(tài)變?yōu)檗D(zhuǎn)變執(zhí)行的網(wǎng)絡(luò)結(jié)果。當(dāng)前狀態(tài)依賴于先前遇到的狀態(tài)事件,并且如果轉(zhuǎn)變標(biāo)準(zhǔn)與任何給定的當(dāng)前事件相匹配的話,當(dāng)前狀態(tài)則發(fā)生改變。在用于其狀態(tài)機(jī)的gMg語法中,轉(zhuǎn)變標(biāo)準(zhǔn)通過鏈接和轉(zhuǎn)向語句鏈接到一起。轉(zhuǎn)向執(zhí)行狀態(tài)改變,而鏈接則不會(huì)。鏈接類似于附加分支,而轉(zhuǎn)向則改變狀態(tài)。鏈接的作用類似于并列的分裂路徑(或并列的如果語句),用于對(duì)進(jìn)入系統(tǒng)的輸入事件進(jìn)行估計(jì)和路由。鏈接創(chuàng)建用于下一個(gè)轉(zhuǎn)變的可能的路徑或遍歷,但其將不會(huì)引起任何的狀態(tài)變化??蓪?biāo)簽作為轉(zhuǎn)向語句(狀態(tài))的目的地,或作為鏈接語句(無狀態(tài))的目的地。另一個(gè)重要命令是與出現(xiàn)在塊的末尾處的監(jiān)聽程序類似的任何時(shí)候(Anytime)語句,每當(dāng)該語句的條件與輸入事件匹配、且當(dāng)前狀態(tài)在塊內(nèi)時(shí),執(zhí)行該語句。Anytime語句可與用于全部轉(zhuǎn)變的OR相比擬(例如,假定塊的結(jié)尾處具有Anytime語句),當(dāng)狀態(tài)存在于塊中的任意位置時(shí),處理則檢測(cè)在轉(zhuǎn)變之外執(zhí)行的全部Anytime語句。在需要完成某個(gè)動(dòng)作而不用管給定塊中的精確狀態(tài)的情況下,則使用Anytime語句。Anytime的作用就像是監(jiān)聽程序。如果處理到達(dá)塊,并且接收到事件,那么,則對(duì)該事件感興趣,但是根據(jù)條件和標(biāo)準(zhǔn),狀態(tài)不必受到Anytime語句的執(zhí)行的影響。在給定的狀態(tài)中,當(dāng)接收到另一個(gè)事件時(shí),給定塊中的全部Anytime語句以及全部父類塊都被檢查。然后對(duì)與事件匹配的全部Anytime進(jìn)行調(diào)用,并對(duì)全部接下來的潛在轉(zhuǎn)變進(jìn)行檢查。執(zhí)行匹配的第一個(gè)Anytime。對(duì)于每個(gè)新的事件,都可能執(zhí)行狀態(tài)轉(zhuǎn)變并可能執(zhí)行多個(gè)Anytime塊。對(duì)于塊列表中的每個(gè)條件,都對(duì)Anytime命令進(jìn)行一次評(píng)估,并且對(duì)于每次匹配都將執(zhí)行一次合成操作。例如,如果將對(duì)多個(gè)頁面的響應(yīng)時(shí)間進(jìn)行監(jiān)控和測(cè)量,那么,Anytime語句則允許用更少的程序語句對(duì)測(cè)量進(jìn)行編程。將目標(biāo)頁面列在塊語句中,并增加Anytime語句。然后,通過定義的事件將Anytime語句應(yīng)用于其對(duì)全部目標(biāo)頁面進(jìn)行測(cè)量的進(jìn)程,并且不管用戶遍歷頁面的順序而將其枚舉在列表中。如果用頁面定義了序列,也就是,主題=頁面1、主題=頁面2、主題=頁面3等,并且這些頁面表現(xiàn)了一系列轉(zhuǎn)變,那么,不管用戶在哪個(gè)頁面上,Anytime語句都導(dǎo)致對(duì)每個(gè)頁面的加載時(shí)間進(jìn)4亍測(cè)量。使用Anytime的應(yīng)用的另一個(gè)實(shí)施例是對(duì)給定進(jìn)程進(jìn)行計(jì)數(shù)。對(duì)于塊內(nèi)的每個(gè)事件,執(zhí)行一次Anytime,并且狀態(tài)機(jī)每次對(duì)一個(gè)事件進(jìn)行評(píng)估。Anytime單獨(dú)地與塊相關(guān)聯(lián),并且位于給定的塊中。檢測(cè)多個(gè)腳本的存在需要代理和腳本標(biāo)識(shí)符的組合。代理會(huì)話id必須是唯一的,并且在該代理會(huì)話id內(nèi)還具有腳本會(huì)話,腳本會(huì)話也由腳本會(huì)話id唯一地識(shí)別。這些標(biāo)識(shí)符使得能進(jìn)行實(shí)例檢測(cè)。在狀態(tài)機(jī)內(nèi),例如在才企測(cè)登記或錯(cuò)誤時(shí),代理會(huì)話id用于對(duì)狀態(tài)機(jī)進(jìn)行組織,這些狀態(tài)機(jī)也是可識(shí)別的并且是唯一的。通常,創(chuàng)建的全局狀態(tài)機(jī)并不具有全局可見性,但是如果需要的話也可能具有全局可見性。通常不具有遍布全部用戶的狀態(tài),而是相反地,每個(gè)用戶或進(jìn)程都需要其自身的狀態(tài),該狀態(tài)由狀態(tài)機(jī)實(shí)例進(jìn)行跟蹤。除了具有清除的標(biāo)識(shí)符之外,允許對(duì)事件進(jìn)行有效處理的另一個(gè)重要的處理結(jié)構(gòu)機(jī)制是從跟蹤消息發(fā)起的作用域定義,該跟蹤消息是由gMg數(shù)據(jù)源發(fā)生器發(fā)送的。作用域識(shí)別并進(jìn)一步支持GUI對(duì)象集、事件或發(fā)生在gMg數(shù)據(jù)源(客戶)上的其它進(jìn)程的多實(shí)例檢測(cè)。將來自不同會(huì)話的事件收集到隊(duì)列中?;谧侄沃?,為事件對(duì)象分配作用域。通常,作用域也是會(huì)話,但是作為一種選擇,還可通過使用例如主題(Topic)字段的某些其它的跟蹤消息字段定義作用域。在每個(gè)作用域內(nèi),具有狀態(tài)機(jī)的一個(gè)或多個(gè)實(shí)例。例如,如果任務(wù)是;險(xiǎn)測(cè)錯(cuò)誤,那么則可創(chuàng)建一個(gè)用于該會(huì)話的狀態(tài)機(jī)以確定消息,而無需多個(gè)狀態(tài)機(jī)。為了避免狀態(tài)機(jī)的擴(kuò)散化(以及對(duì)服務(wù)器資源的更高要求),如果新的事件與初始轉(zhuǎn)變匹配的話,那么,在作用域內(nèi)已存在狀態(tài)機(jī)的情況下,則不需要?jiǎng)?chuàng)建新的狀態(tài)機(jī)。新的事件可被傳遞,以用于對(duì)現(xiàn)有狀態(tài)才幾進(jìn)4亍處理。例如,如果頁面出現(xiàn)在應(yīng)用程序中,那么,頁面事件則用于對(duì)轉(zhuǎn)變進(jìn)行初始化,該轉(zhuǎn)變僅發(fā)生在頁面第一次被創(chuàng)建和顯示時(shí)。僅在此時(shí),才創(chuàng)建新的狀態(tài)機(jī)。創(chuàng)建的狀態(tài)機(jī)是唯一的,這里的唯一意味著單一的作用域內(nèi)的單一實(shí)例?;谟|發(fā)其創(chuàng)建的事件的作用域,將狀態(tài)機(jī)實(shí)例分配給該作用域。作用域通常由會(huì)話id識(shí)別,其中作用域由Ll到L5的跟蹤消息層級(jí)定義限定。具有會(huì)話和腳本層作用域。如果包括了腳本層作用域,則具有才企測(cè)腳本id的狀態(tài)機(jī)。該腳本id相對(duì)于代理會(huì)話id而言是唯一的,并且由服務(wù)器通知客戶有關(guān)代理id的創(chuàng)建,并且對(duì)于每個(gè)客戶機(jī)上的每個(gè)代理都重復(fù)上述過程。以下兩種實(shí)施示出了作用域特征的應(yīng)用。在第一實(shí)施方式中,到應(yīng)用程序的登錄過程僅需要簡單的初始轉(zhuǎn)變。對(duì)于安全登錄過程,用戶輸入id信息,然后提出其進(jìn)入。在最初出現(xiàn)登錄屏幕之后(通常在會(huì)話的生存期中出現(xiàn)一次),生成事件。服務(wù)器接收事件,且初始轉(zhuǎn)變上的狀態(tài)引擎創(chuàng)建新的狀態(tài)機(jī)。在另一個(gè)實(shí)施方式中,在gMg監(jiān)控中具有兩個(gè)線程(一個(gè)線程對(duì)應(yīng)于一個(gè)窗口)的窗口應(yīng)用程序?qū)?duì)兩個(gè)84窗口中的每個(gè)窗口中的處理進(jìn)行跟蹤。在這種情況下,在會(huì)話中或在狀態(tài)機(jī)中識(shí)別用戶。在用于相同用戶的相同會(huì)話中還可具有多個(gè)作用域。服務(wù)器分析將利用兩個(gè)作用域,每一個(gè)作用域用于一個(gè)窗口,單數(shù)將仍然與相同的用戶相關(guān)聯(lián)。此外,在狀態(tài)機(jī)集合內(nèi),可具有用于每個(gè)窗口的不同的狀態(tài)機(jī)。參照?qǐng)D25,在包含轉(zhuǎn)變2505的一組狀態(tài)機(jī)定義內(nèi),給定連續(xù)事件2550,這一組狀態(tài)機(jī)定義2565內(nèi)涉及事件(2510到2520)的每個(gè)靜態(tài)條件由EvalStatic2555處理,EvalStatic2555將剩余一組條件2570保留在狀態(tài)機(jī)實(shí)例的上下文中,剩余一組條件2570涉及必須進(jìn)行估計(jì)的狀態(tài)機(jī)實(shí)例變量2525到2545。通過用于每個(gè)狀態(tài)機(jī)實(shí)例的函數(shù)Evallnstance2560對(duì)這些實(shí)例條件進(jìn)行4企查,并執(zhí)行第一匹配轉(zhuǎn)變。這對(duì)于現(xiàn)有的或新創(chuàng)建的狀態(tài)機(jī)都會(huì)發(fā)生。初始轉(zhuǎn)變不是局部的,除非在其創(chuàng)建新的實(shí)例時(shí)。但是,初始轉(zhuǎn)變對(duì)事件的處理類似于任何其它轉(zhuǎn)變。如果匹配的轉(zhuǎn)變可從當(dāng)前狀態(tài)接受,那么,則具有到開放路徑的鏈接。如果轉(zhuǎn)變條件為真,那么,在事件的實(shí)例層則還可具有條件。例如,如果跟蹤消息到達(dá),且其狀態(tài)字段等于5,那么則將該值存儲(chǔ)在實(shí)例中,但是此時(shí)該值不能被驗(yàn)證,因?yàn)閷?shí)例還不能被訪問。只有在處理到達(dá)到實(shí)例的通路時(shí),這些值才能被估計(jì),并檢查狀態(tài)是否與接收到的事件匹配。這是與靜態(tài)條件相反的實(shí)例條件的實(shí)施例。如果條件可接受并且轉(zhuǎn)變條件為真,那么,對(duì)靜態(tài)(假)的評(píng)估則導(dǎo)致對(duì)實(shí)例條件的評(píng)估。服務(wù)器狀態(tài)機(jī)編譯器在靜態(tài)和實(shí)例條件之間進(jìn)行區(qū)分,并調(diào)用適當(dāng)?shù)奶幚砝?。如果這些轉(zhuǎn)變事件條件為真,那么,則選擇并執(zhí)行與該轉(zhuǎn)變相關(guān)聯(lián)的代碼動(dòng)作。然后,轉(zhuǎn)變處理則轉(zhuǎn)至后轉(zhuǎn)變階段,或者,如果具有轉(zhuǎn)向指令的話,則將在轉(zhuǎn)向目的地進(jìn)行狀態(tài)處理。參照?qǐng)D26,大多數(shù)的處理都在估計(jì)進(jìn)程、以及對(duì)成千的非常高速的接收的事件2603的路由和調(diào)度中。在這種大的集合中,為了避免狀態(tài)的模糊,將全部事件串行化2609,然后將其輸入到一組狀態(tài)機(jī)2621中。狀態(tài)引擎2627用定義的狀態(tài)機(jī)(例如2624)對(duì)接收到的事件進(jìn)85狀態(tài)機(jī)是狀態(tài)檢測(cè)機(jī)制的定義,而全部定義的狀態(tài)機(jī)將處理每個(gè)輸入事件。如果事件條件(靜態(tài)的)被匹配2612,那么,狀態(tài)機(jī)引擎則相對(duì)于作用域檢查事件2633,并且僅處理匹配作用域2639內(nèi)的實(shí)例中的事件。某些實(shí)例的狀態(tài)的條件不能在更高狀態(tài)機(jī)定義級(jí)確定。如果狀態(tài)機(jī)對(duì)接收到的事件感興趣,那么,事件則必須根據(jù)每個(gè)實(shí)例的狀態(tài)被狀態(tài)機(jī)的實(shí)例所捕獲。給定全部轉(zhuǎn)變的集合,總體目標(biāo)是首先測(cè)試靜態(tài)條件2615,然后測(cè)試全部實(shí)例條件2618。檢查靜態(tài)條件是更高級(jí)的操作,其首先實(shí)現(xiàn)以提高效率。狀態(tài)機(jī)由作用域分組,并且,對(duì)于給定的事件,使用事件作用域作為鍵值在映射中對(duì)狀態(tài)機(jī)實(shí)例進(jìn)行查找。在靜態(tài)結(jié)構(gòu)的集合中,對(duì)轉(zhuǎn)變以及與輸入事件2612匹配的全部Anytime進(jìn)行檢索。靜態(tài)估計(jì)可作為快速測(cè)試來排除與事件不匹配的轉(zhuǎn)變。不對(duì)每個(gè)實(shí)例重復(fù)一次事件處理,處理可在頂層(即,狀態(tài)機(jī)定義層2615)完成,并且不由條件中的當(dāng)前輸入事件發(fā)起的轉(zhuǎn)變將不在執(zhí)行轉(zhuǎn)變列表中出現(xiàn)。然而,如果事件與轉(zhuǎn)變或Anytime語句匹配,那么,則將每類匹配添加至其各自的匹配轉(zhuǎn)變或Anytime列表2612中。如果某些滿足了某些條件,下一個(gè)步驟則創(chuàng)建狀態(tài)機(jī)實(shí)例。如果轉(zhuǎn)變列表里包含了初始條件(即,初始轉(zhuǎn)變被匹配),并且狀態(tài)機(jī)不是唯一的,則需創(chuàng)建某個(gè)范圍內(nèi)所需的盡可能多的實(shí)例,否則,如果該范圍內(nèi)沒有創(chuàng)建的實(shí)例的話,則需創(chuàng)建新的實(shí)例2636。換句話說,不管匹配了什么條件,(狀態(tài)機(jī)制不唯一,或者如果該范圍內(nèi)沒有實(shí)例),都必須在該范圍內(nèi)創(chuàng)建實(shí)例。如果條件為真,就創(chuàng)建新的狀態(tài)^L實(shí)例。實(shí)體方法(UtilityMethod)也由狀態(tài)、超時(shí)等維持。如果轉(zhuǎn)變匹酉己2642,則驗(yàn)證該轉(zhuǎn)變有效2645(即,函數(shù)IsAnytimeValid驗(yàn)證了Anytime在當(dāng)前狀態(tài)下是有效的)。函數(shù)(轉(zhuǎn)變)執(zhí)行發(fā)生在轉(zhuǎn)變內(nèi),并且在有效轉(zhuǎn)變內(nèi)被調(diào)用2648。進(jìn)行;險(xiǎn)查,以確定是否已執(zhí)行了轉(zhuǎn)變2651。如前所述,可在頂層(狀態(tài)機(jī)定義)驗(yàn)證公共gMg實(shí)例,但是,如果條件涉及已存在的狀態(tài)機(jī)實(shí)例,那么,每個(gè)狀態(tài)機(jī)實(shí)例都可以具有用于這些實(shí)例的不同值,因此,每個(gè)狀態(tài)機(jī)都必須在精確的實(shí)例中被檢查。在轉(zhuǎn)變處理完成之后,可能會(huì)有另一個(gè)實(shí)例,也可能沒有另一個(gè)實(shí)例。如果驅(qū)動(dòng)數(shù)據(jù)源的進(jìn)程被中斷,或者如果狀態(tài)機(jī)到了達(dá)其最后一個(gè)轉(zhuǎn)變,則發(fā)生這種情況。如果沒有轉(zhuǎn)變符合當(dāng)前狀態(tài)的話,過一段時(shí)間之后,轉(zhuǎn)變則超時(shí),以防止gMg系統(tǒng)死鎖。如果執(zhí)行了任何的轉(zhuǎn)變,那么則檢測(cè)超時(shí)2654。超時(shí)必須被寄存在超時(shí)緩沖器中,該緩沖器之后可能被觸發(fā)。在每個(gè)狀態(tài)下,超時(shí)記錄可接受的最短的超時(shí)位置。例如,如果具有兩個(gè)超時(shí)(例如,5分鐘和10分鐘),則記錄較短的一個(gè)超時(shí)。由于5分鐘的超時(shí)將首先到時(shí),因此將IO分鐘的超時(shí)丟棄,然后首先執(zhí)行隨后的狀態(tài)改變。任何情況下,狀態(tài)機(jī)中都僅有一個(gè)可能的超時(shí),該超時(shí)將為最短的超時(shí)。因此,如果執(zhí)行了任何的轉(zhuǎn)變,超時(shí)則必須更新,新的狀態(tài)被傳送,查找新狀態(tài)中全部可能的超時(shí),并且登記新的超時(shí)請(qǐng)求。當(dāng)事件到達(dá)時(shí),檢測(cè)超時(shí)。具有超時(shí)請(qǐng)求的緩沖器,該緩沖器中包含登記的超時(shí)請(qǐng)求。當(dāng)事件到達(dá)時(shí),基于事件時(shí)戳,在緩沖器中檢查任何的超時(shí),調(diào)用登記方法2654,并更新關(guān)于狀態(tài)機(jī)的信息。例如,如果系統(tǒng)處于給定的狀態(tài),并且如果存在30分鐘的超時(shí),那么,在30分鐘結(jié)束之前,如果轉(zhuǎn)到了另一個(gè)狀態(tài),則將進(jìn)入另一組超時(shí)。然而,如果不存在超時(shí),則將超時(shí)登記刪除。如果系統(tǒng)在等待事件,但是不確定時(shí)間將何時(shí)到達(dá),那么,可創(chuàng)建某個(gè)時(shí)間間隔(例如,一分鐘)的并行超時(shí)。然后,如果事件在一分鐘內(nèi)到達(dá)了,則繼續(xù)進(jìn)行狀態(tài)處理。然而,如果事件未到達(dá)以防止處理被阻塞,那么,通過一分鐘超時(shí)的登記,系統(tǒng)則可繼續(xù)。處理轉(zhuǎn)變之后,當(dāng)前的超時(shí)登記將被移除2654。僅有新的超時(shí)被登記(如果其可接受的話),也就是說,具有來自當(dāng)前檢查位置的適當(dāng)?shù)霓D(zhuǎn)變路徑。另一方面,如果在一分鐘之后未在當(dāng)前位置接收到事件,則檢查超時(shí)緩沖器,使用超時(shí),并執(zhí)行轉(zhuǎn)變且轉(zhuǎn)至下一個(gè)狀態(tài)。從該下一個(gè)狀態(tài),完成對(duì)新的狀態(tài)轉(zhuǎn)變的搜索,并且將新的狀態(tài)轉(zhuǎn)變登記。優(yōu)選地,在對(duì)事件進(jìn)行處理之后對(duì)超時(shí)進(jìn)行處理。超時(shí)是在常規(guī)處理之后進(jìn)行,這是因?yàn)檗D(zhuǎn)變的執(zhí)行可能會(huì)去除超時(shí)。當(dāng)條件是具有代碼行動(dòng)的超時(shí)時(shí),將超時(shí)登記至緩沖器中,并且將其視為轉(zhuǎn)變。超時(shí)是不具有事件的具體轉(zhuǎn)變,因?yàn)槠鋵?shí)際由不存在事件而觸發(fā),其中轉(zhuǎn)變經(jīng)過時(shí)間間隔(其間不具有轉(zhuǎn)變)之后被觸發(fā)的。代碼動(dòng)作通常具有用于外部事件的參數(shù),但是,在超時(shí)內(nèi),是不具有這樣的參數(shù)的。具有在狀態(tài)引擎層使用的一個(gè)超時(shí)緩沖器2630。緩沖器輸入項(xiàng)對(duì)應(yīng)于分鐘,并且對(duì)于每個(gè)輸入項(xiàng),都具有調(diào)度以在該分鐘超時(shí)的一系列轉(zhuǎn)變。處理完成后,將當(dāng)前事件的時(shí)間用于將相應(yīng)的分鐘鎖定在超時(shí)緩沖器中。直到該分鐘并包括該分鐘的、位于輸入項(xiàng)中的全部轉(zhuǎn)變都可被暫停,其中超時(shí)的發(fā)生將刪除狀態(tài)機(jī)。在全部未決的超時(shí)上不具有循環(huán),并且,對(duì)用于全部狀態(tài)機(jī)的轉(zhuǎn)變進(jìn)行調(diào)用的處理是非??焖俚?。實(shí)現(xiàn)轉(zhuǎn)變之后,引擎調(diào)用IffindStateQ,用于當(dāng)前處理的狀態(tài)機(jī)。如果該狀態(tài)機(jī)處于最后的狀態(tài)時(shí),方案則終止。在關(guān)閉時(shí),具有多個(gè)可能的監(jiān)控對(duì)象的gMg監(jiān)控系統(tǒng)創(chuàng)建數(shù)據(jù)源,所述對(duì)象是由該監(jiān)控系統(tǒng)的用于公共或私有的組建方法接口提供的,所述數(shù)據(jù)源可在豐富的GUI用戶上下文中被分析,以反映支持企業(yè)應(yīng)用程序的底層系統(tǒng)的性能簡檔。gMg系統(tǒng)能夠支持具有GUI對(duì)象的泛型或具體檢測(cè)的多實(shí)例應(yīng)用程序GUI,這種能力提供了操作環(huán)境內(nèi)內(nèi)部動(dòng)態(tài)應(yīng)用程序進(jìn)程內(nèi)的最大靈活性和適應(yīng)性。此外,本地和遠(yuǎn)程分布的狀態(tài)機(jī)提供了對(duì)多種應(yīng)用內(nèi)的多種事件的及時(shí)分析,所述事件例如檢測(cè)慢響應(yīng)次數(shù)、錯(cuò)誤條件、商業(yè)處理分析等。參照?qǐng)D27,流程圖示出了用于分析方法事件的進(jìn)程2700。在步驟2710,獨(dú)立監(jiān)控程序436(包括代理414、引擎416以及方案426)是可操作的,以對(duì)不同的樹結(jié)構(gòu)形式的對(duì)象進(jìn)行建模,所述樹結(jié)構(gòu)包括主機(jī)應(yīng)用程序的分層GUI對(duì)象樹660(用于識(shí)別GUI對(duì)象)、代碼才莫塊樹圖17(用于識(shí)別代碼模塊和方法監(jiān)控器,COM實(shí)例)以及進(jìn)程/線程樹(用于識(shí)別主機(jī)應(yīng)用程序的進(jìn)程和線程)。在步驟2715,得到環(huán)境譜的指示(即,列在對(duì)象、GUI對(duì)象、消息、方法調(diào)用以及方法返回中的目標(biāo)應(yīng)用程序的條件),用于應(yīng)用程序窗口。在步驟2720,對(duì)可出現(xiàn)在兩層(或更多層)用于及時(shí)傳輸有意義的事件(例如,第一層本地用戶的桌面2403和第二層遠(yuǎn)程服務(wù)器2406)的狀態(tài)機(jī)事件進(jìn)行處理。在步驟2725,對(duì)一個(gè)或多個(gè)狀態(tài)機(jī)生成事件進(jìn)行關(guān)聯(lián),所述事件是由gMg系統(tǒng)的傳感器或狀態(tài)才幾處理響應(yīng)于主才幾應(yīng)用程序的動(dòng)態(tài)環(huán)境語指示(例如,用戶、應(yīng)用程序、OS以及方法事件)而創(chuàng)建的。在步驟2730,基于關(guān)聯(lián)狀態(tài)機(jī)的結(jié)果,推導(dǎo)出用戶經(jīng)驗(yàn)的指示。在步驟2735,根據(jù)狀態(tài)機(jī)事件,將與環(huán)境語指示同義的邏輯事件數(shù)據(jù)聚集在服務(wù)器557上。在步驟2740,識(shí)別字節(jié)操作碼模式1920,并將其用于定位和檢測(cè)組件函數(shù)的方法入口點(diǎn)。在步驟2745,識(shí)別字節(jié)操作碼模式中的接口函數(shù),該接口函數(shù)提供到事件和屬性的接口。在步驟2750,確定接口函數(shù)的地址。使用的技術(shù)依賴于被攔截的函數(shù)的類型(例如,是輸出函數(shù)1620還是COM類型庫(COMTypeLibrary)1624),并依賴于監(jiān)控進(jìn)程是在對(duì)象創(chuàng)建之前(1627)還是之后(1630)啟動(dòng)。操作碼模式允許執(zhí)行調(diào)用1642和返回1645攔截以識(shí)別對(duì)象,包括方法調(diào)用、方法返回和GUI對(duì)象。在步驟2755,進(jìn)程2700利用攔截例程(圖18)1848鏈接至接口函數(shù),以跟蹤函數(shù)調(diào)用。圖28示出了用于對(duì)主機(jī)應(yīng)用程序功能進(jìn)行監(jiān)控的進(jìn)程2800的流程圖。在步驟2810,從目標(biāo)方法的一組被捕獲的字節(jié)模式(即,方法簽名1930)中識(shí)別表示主機(jī)應(yīng)用程序內(nèi)的方法函數(shù)的字節(jié)操作碼模式。在步驟2815,進(jìn)程2800將運(yùn)行期函數(shù)字節(jié)操作模式1910與方法簽名列表進(jìn)行比較,以確定方法的位置1905。在步驟2820,利用跳轉(zhuǎn)例程指令2039建立目標(biāo)方法函數(shù)、調(diào)用攔截例程2012以及信息結(jié)構(gòu)實(shí)例2045之間的鏈接。在步驟2825,進(jìn)程2800可選地使用兩個(gè)堆棧操縱技術(shù)對(duì)調(diào)用方法函數(shù)的返回進(jìn)行監(jiān)控,兩個(gè)堆棧操縱技術(shù)為返回捕獲堆棧復(fù)制1648和返回堆棧分配1651。結(jié)果是捕獲可用于檢索關(guān)于應(yīng)用程序的內(nèi)部進(jìn)程的附加信息的返回值。參照?qǐng)D29A和29B,示出了進(jìn)程2900的流程圖,該進(jìn)程對(duì)來自計(jì)算機(jī)目標(biāo)應(yīng)用程序表示層的事件進(jìn)行監(jiān)控。在步驟2904,在目標(biāo)應(yīng)用程序的本地客戶計(jì)算機(jī)436上提供"方案"426形式的腳本。腳本426能在目標(biāo)應(yīng)用程序內(nèi)運(yùn)行。在步驟2906,對(duì)來自目標(biāo)應(yīng)用程序545的多實(shí)例的對(duì)象509的運(yùn)行期實(shí)例進(jìn)行掃描。掃描對(duì)象的結(jié)果是得到一組實(shí)時(shí)事件515,這些事件從用戶、應(yīng)用程序、OS事件以及來自目標(biāo)應(yīng)用程序的方法調(diào)用和方法返回的GUI對(duì)象和方法屬性的特定值獲得。在步驟2908,分配內(nèi)部GUI對(duì)象樹832以組織數(shù)據(jù)結(jié)構(gòu),這些結(jié)構(gòu)然后在步驟2910被調(diào)整,以反映真實(shí)應(yīng)用程序的GUI的實(shí)時(shí)動(dòng)態(tài)改變。調(diào)整后的"多類"事件流反映真實(shí)應(yīng)用程序1115、1103的實(shí)際狀態(tài)。GUI結(jié)構(gòu)反映一類事件,這類事件提供供全部其它類型的數(shù)據(jù)交錯(cuò)和引用的上下文。在步驟2912,通過利用能檢測(cè)相關(guān)對(duì)象(指代碼樣本)類別的腳本表示,從目標(biāo)應(yīng)用程序中檢測(cè)與預(yù)定的對(duì)象結(jié)構(gòu)匹配的對(duì)象實(shí)例。圖15示出了可為泛型的1510、用于4企測(cè)相關(guān)GUI對(duì)象的全部類別的gMg腳本表示(其也可為具體的1505,用于檢測(cè)單一的GUI對(duì)象)。檢測(cè)表示可4企測(cè)該概念譜中任何位置的GUI對(duì)象,以反映在應(yīng)用程序運(yùn)行期結(jié)構(gòu)中發(fā)現(xiàn)的許多變體。在步驟2914,在從任何目標(biāo)應(yīng)用程序?qū)嵗袡z測(cè)到的對(duì)象的內(nèi)容中,捕獲檢測(cè)到的對(duì)象的至少一部分環(huán)境語。在步驟2916,使用腳本邏輯序列表示(邏輯狀態(tài)機(jī))或狀態(tài)機(jī)(遠(yuǎn)程狀態(tài)機(jī))處理,根據(jù)來自gMg傳感器428、429、440的事件得到邏輯事件521,所述事件是從環(huán)境譜(即,方法、0S、用戶以及應(yīng)用程序事件)中接收到的。在步驟2918,對(duì)于處理的內(nèi)容進(jìn)行重新匯編(即,在服務(wù)器446上收集數(shù)據(jù)),以反映由gMg傳感器檢測(cè)到并由GUI對(duì)象樹反映的多實(shí)例結(jié)構(gòu)。gMg系統(tǒng)的分層狀態(tài)機(jī)處理2430和2442檢測(cè)重新事件序列,所述事件序列創(chuàng)建如用戶感受到的上下文的應(yīng)用程序狀態(tài)。在步驟2920,將重新匯編的結(jié)構(gòu)關(guān)聯(lián)為通過范圍2639檢測(cè)的數(shù)據(jù)集,范圍2639被定義用于唯一的狀態(tài)機(jī),該狀態(tài)機(jī)將應(yīng)用程序?qū)嵗虶UI對(duì)象集實(shí)例分離到用戶會(huì)話中,以反映應(yīng)用程序的先前狀態(tài)。在步驟2922,在多個(gè)腳本945、948、951中共享目標(biāo)引用程序的反映(即,多個(gè)腳本使用相同的GUI對(duì)象樹660),多個(gè)腳本中的每個(gè)都與目標(biāo)應(yīng)用程序中的各實(shí)例901、902、903相關(guān)聯(lián)。中間處理使用接收到的跟蹤消息形式的捕獲的事件(436和446之間),該跟蹤消息被處理用于實(shí)時(shí)顯示和檢測(cè)或被收集到數(shù)據(jù)源中用于進(jìn)一步分析。在步驟2924,附加數(shù)據(jù)源允許對(duì)跟蹤數(shù)據(jù)集進(jìn)行復(fù)雜的歷史趨勢(shì)分析,該數(shù)據(jù)源使用通常理解的同義定義,該定義與具有目的地的源同步,以重新創(chuàng)建用戶經(jīng)—驗(yàn)條件并提供對(duì)該條件的觀察。參照?qǐng)D29B,進(jìn)程2900在步驟2932繼續(xù),其中,對(duì)使用gMg上下文(圖12)的分層組織實(shí)體進(jìn)行說明,該實(shí)體表示目標(biāo)應(yīng)用程序的一部分并且包含上下文信息(例如,上下文層級(jí)1205、1210、1215)。在步驟2934,對(duì)捕獲的、受到分層組織實(shí)體支持的環(huán)境譜(例如,對(duì)象樹1015及其對(duì)象變量特征(例如1035)或?qū)ο笞兞考?039)進(jìn)行分析。在步驟2936,進(jìn)程2900利用圖14中的鉤子感知與用戶的目標(biāo)應(yīng)用程序交互,或感知與出現(xiàn)在進(jìn)程1406或線程1409、1412、1418、1421中的目標(biāo)應(yīng)用程序生成事件的交互。在步驟2938,利用邏輯腳本表示變量(指先前描述的題為"SpecificandGenericBindingCodeSample"的代碼樣本以及對(duì)象變量1005),基于響應(yīng)于感知步驟的結(jié)果而進(jìn)行的腳本執(zhí)^f亍,生成事件(例如,利用如WhenObjects1151的機(jī)制生成gMg事件)。在步驟2940,將生成的事件中的一個(gè)或多個(gè)傳遞至解釋器745。在步驟2942,對(duì)這種選擇性生成的事件進(jìn)行分析。選擇使用gMg系統(tǒng)的例如腳本中邏輯表示的各種機(jī)制描述檢測(cè)條件、變量和對(duì)象變量、WhenObjects以及GUI對(duì)象樹結(jié)構(gòu)內(nèi)的條件。在步驟2946,將分析與關(guān)于外部源的參數(shù)相關(guān)聯(lián),尤其是與來自服務(wù)器或環(huán)境基礎(chǔ)設(shè)施的數(shù)據(jù)相關(guān)聯(lián)。在步驟2948,將腳本與目標(biāo)應(yīng)用程序內(nèi)的窗口的單一進(jìn)程1315相關(guān)聯(lián)。在步驟2950,檢測(cè)與線程id相關(guān)聯(lián)的唯一消息。在步驟2952,由活動(dòng)的鉤子例程1433到1442攔截消息。在步驟2954,用腳本表示和操作(指代碼樣本"Manylnstances")對(duì)消息內(nèi)容進(jìn)行評(píng)估,以獲得事件和屬性,從而獲得目標(biāo)應(yīng)用程序上的信息。在步驟2956,進(jìn)程2900生成報(bào)告454、警報(bào)450、關(guān)聯(lián)452、以及動(dòng)作/響應(yīng)456,上述各項(xiàng)中都包含分析步驟和關(guān)聯(lián)步驟的結(jié)果。在步驟2958,以由枱r測(cè)到的事件喚醒的預(yù)定間隔(例如由OS時(shí)鐘或由其它某些條件驅(qū)動(dòng))重復(fù)以下步驟對(duì)不斷地用反映應(yīng)用程序GUI的結(jié)構(gòu)填充gMgGUI對(duì)象樹660的應(yīng)用程序進(jìn)行掃描、動(dòng)態(tài)地分配、調(diào)整、4企測(cè)(例如,有圖11中的WhenObject機(jī)制、圖14中的鉤子執(zhí)行的間歇輪詢操作)和捕獲。91由于已對(duì)本發(fā)明進(jìn)行了詳細(xì)描述,因此,對(duì)于本領(lǐng)域技術(shù)人員而言,各種改進(jìn)、變化或等同都將顯而易見。因此,應(yīng)該理解,詳細(xì)的說明是示例性地提供的,而非限制性的。在詳細(xì)構(gòu)造和組件的組合和配置中,可采用大量的變化,而不偏離本發(fā)明的精神和范圍。本發(fā)明僅由權(quán)利要求及其等同限定。權(quán)利要求1.一種用于對(duì)來自表示層的事件和目標(biāo)應(yīng)用的軟件方法進(jìn)行監(jiān)控的方法,包括以下步驟獨(dú)立于對(duì)所述目標(biāo)應(yīng)用的源代碼的重編譯,提供能夠操作以在所述目標(biāo)應(yīng)用內(nèi)的層運(yùn)行的腳本,其中所述目標(biāo)應(yīng)用具有結(jié)構(gòu);掃描對(duì)象的運(yùn)行期實(shí)例,所述對(duì)象包括所述目標(biāo)應(yīng)用的方法調(diào)用、方法返回以及GUI對(duì)象;實(shí)時(shí)地為所述對(duì)象實(shí)例分配結(jié)構(gòu);調(diào)整分配的結(jié)構(gòu),以創(chuàng)建所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映;檢測(cè)與預(yù)定對(duì)象結(jié)構(gòu)相匹配的一個(gè)或多個(gè)對(duì)象;以及捕獲檢測(cè)到的對(duì)象的環(huán)境譜的至少一部分。2.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟將捕獲到的所述檢測(cè)到的對(duì)象的環(huán)境i普處理至邏輯事件中;將所述邏輯事件重新匯編,以反映不同上下文內(nèi)的多實(shí)例結(jié)構(gòu),其中所述不同上下文是所述目標(biāo)應(yīng)用的先前狀態(tài);以及將所重新匯編的多實(shí)例結(jié)構(gòu)相互關(guān)聯(lián),以分析所述目標(biāo)應(yīng)用的所述先前狀態(tài)。3.如權(quán)利要求l所述的方法,其中所述捕獲的環(huán)境譜包括與所述檢測(cè)到的對(duì)象相關(guān)的各類信息,所述信息提供了與所述目標(biāo)應(yīng)用環(huán)境相關(guān)的知識(shí)。4.如權(quán)利要求l所述的方法,其中所述掃描步驟進(jìn)一步包括以下步驟基于至少一個(gè)預(yù)定的監(jiān)控標(biāo)準(zhǔn),選擇對(duì)象實(shí)例。5.如權(quán)利要求l所述的方法,其中所述提供步驟在客戶計(jì)算機(jī)上提供所述腳本。6.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟在多個(gè)腳本中共享所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映,其中所述多個(gè)腳本中的每一個(gè)都與所述目標(biāo)應(yīng)用中其各自的實(shí)例相關(guān)聯(lián),其中所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映為收集的跟蹤數(shù)據(jù)提供GUI上下文。7.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟使用能夠檢測(cè)多種相關(guān)對(duì)象的腳本表示,檢測(cè)所述對(duì)象的泛型實(shí)例;以及對(duì)所檢測(cè)到的泛型對(duì)象實(shí)例的內(nèi)容和屬性進(jìn)行處理,以確定上下文中目標(biāo)應(yīng)用事件的發(fā)生。8.如權(quán)利要求7所述的方法,進(jìn)一步包括以下步驟通過使用跟蹤消息層和預(yù)先定義的語義和約定,建立用戶上下文。9.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟聲明分層組織實(shí)體,所述實(shí)體表示所述目標(biāo)應(yīng)用的一部分并包含來自至少一部分所述捕獲的環(huán)境i普的上下文信息;以及分析由所述分層組織實(shí)體支持的所捕獲的環(huán)境語。10.如權(quán)利要求9所述的方法,包括以下附加的步驟評(píng)估上下文層的值,以在執(zhí)行所述目標(biāo)應(yīng)用期間對(duì)多個(gè)對(duì)象實(shí)例進(jìn)行區(qū)分。11.如權(quán)利要求2所述的方法,其中具有所述目標(biāo)應(yīng)用的多個(gè)實(shí)例,進(jìn)行掃描的所述步驟對(duì)每個(gè)目標(biāo)應(yīng)用實(shí)例進(jìn)行掃描,進(jìn)行檢測(cè)的所述步驟對(duì)與所述目標(biāo)應(yīng)用的多個(gè)實(shí)例相關(guān)的對(duì)象實(shí)例進(jìn)行#r測(cè)。12.如權(quán)利要求11所述的方法,其中所述捕獲步驟從任意的目標(biāo)應(yīng)用實(shí)例中捕獲所檢測(cè)到的對(duì)象的內(nèi)容。13.如權(quán)利要求4所述的方法,其中所述客戶計(jì)算機(jī)上的所述腳本位于所述目標(biāo)應(yīng)用本地。14.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟;險(xiǎn)測(cè)與用戶交互的目標(biāo)應(yīng)用和目標(biāo)應(yīng)用生成事件中的至少之一;響應(yīng)于所述檢測(cè)步驟的結(jié)果,基于所述腳本的執(zhí)行選擇性地生成將所生成的事件中的一個(gè)或多個(gè)傳遞至解釋器;分析選擇性地生成的所述事件;以及通過到外部源的函數(shù)映射,對(duì)所述分析進(jìn)行關(guān)聯(lián)。15.如權(quán)利要求14所述的方法,進(jìn)一步包括以下步驟生成包含所述分析步驟和所述關(guān)聯(lián)步驟的以下各項(xiàng)中的至少之一才艮告、警報(bào)、關(guān)聯(lián)以及響應(yīng)。16.如權(quán)利要求1所述的方法,其中所述掃描、分配、調(diào)整、檢測(cè)和捕獲的步驟以預(yù)定的間隔重復(fù),以創(chuàng)建對(duì)所述目標(biāo)應(yīng)用的更新反映。17.如權(quán)利要求1所述的方法,其中所述掃描、分配、調(diào)整、檢測(cè)和捕獲的步驟由4企測(cè)到的事件喚醒,以創(chuàng)建對(duì)所述目標(biāo)應(yīng)用的更新反映。18.如權(quán)利要求l所述的方法,進(jìn)一步包括以下步驟將所述腳本與所述目標(biāo)應(yīng)用中的窗口的單一進(jìn)程相關(guān)聯(lián);檢測(cè)與線程標(biāo)識(shí)符相關(guān)聯(lián)的消息;通過所述腳本內(nèi)活動(dòng)的鉤子例程攔截所述消息;評(píng)估所述消息的內(nèi)容;以及從所述消息中得到事件和屬性,以獲得關(guān)于所述目標(biāo)應(yīng)用的信息。19.一種用于分析方法事件的方法,包括以下步驟提供獨(dú)立的監(jiān)控程序,所述監(jiān)控程序能夠操作地對(duì)應(yīng)用窗口的對(duì)象進(jìn)行建模,并能基于預(yù)定的監(jiān)控標(biāo)準(zhǔn)識(shí)別待被監(jiān)控的對(duì)象;得到用于所述應(yīng)用窗口的環(huán)境譜的指示;處理發(fā)生在服務(wù)器和客戶/本地化機(jī)器中至少之一上的狀態(tài)機(jī)事件;將所述狀態(tài)機(jī)事件與所得到的環(huán)境語指示相關(guān)聯(lián);基于所述相關(guān)步驟的結(jié)果,推導(dǎo)出用戶經(jīng)驗(yàn)的指示;以及將推導(dǎo)出的指示報(bào)告給系統(tǒng)用戶。20.如權(quán)利要求19所述的方法,其中所述推導(dǎo)步驟基于由服務(wù)器方接收到的指示符。21.如權(quán)利要求20所述的方法,其中所述關(guān)聯(lián)步驟進(jìn)一步包括從所述狀態(tài)機(jī)事件中收集與所述環(huán)境語指示協(xié)作的邏輯事件數(shù)據(jù)。22.如權(quán)利要求19所述的方法,其中所述獨(dú)立監(jiān)控程序包括能夠操作以實(shí)現(xiàn)以下步驟的指令識(shí)別字節(jié)操作碼模式;在所識(shí)別出的字節(jié)操作碼模式中檢測(cè)至少一個(gè)接口函數(shù),所述接口函數(shù)為應(yīng)用進(jìn)程的事件和屬性、所述應(yīng)用窗口或窗口GUI對(duì)象提供接口;確定所檢測(cè)到的接口函數(shù)的地址;以及通過利用調(diào)用攔截例程,鏈接到所檢測(cè)到的接口函數(shù),其中,對(duì)所檢測(cè)到的接口函數(shù)的調(diào)用是被跟蹤的。23.如權(quán)利要求22所述的方法,其中所述鏈接步驟使用返回?cái)r截函數(shù),其中,返回被跟蹤。24.如權(quán)利要求22所述的方法,其中所述獨(dú)立監(jiān)控程序進(jìn)一步包括能夠操作以執(zhí)行以下步驟的指令以不同于處理具體函數(shù)攔截的方式處理泛型函數(shù)攔截,其中所述泛型函數(shù)攔截不需要預(yù)先知道所檢測(cè)到的接口函數(shù)的參數(shù)和格式。25.如權(quán)利要求22所述的方法,其中所述獨(dú)立監(jiān)控程序進(jìn)一步包括能夠操作以實(shí)現(xiàn)以下步驟的指令以不同于處理具體函數(shù)攔截的方式處理泛型函數(shù)攔截,其中所述具體攔截函數(shù)包含對(duì)所檢測(cè)到的接口函數(shù)的公共參數(shù)和格式的指示,所述具體函數(shù)攔截能夠?qū)⑺鶛z測(cè)到的函數(shù)參數(shù)直接用于腳本中。26.如權(quán)利要求22所述的方法,進(jìn)一步包括以下步驟通過利用實(shí)例信息寄存器,傳遞用于方法調(diào)用的實(shí)例信息;其中,主機(jī)應(yīng)用程序中的堆棧未被修改,且所述實(shí)例信息寄存器包含指向調(diào)用函數(shù)的實(shí)例信息的指針,以保存方法調(diào)用上下文。27.—種用于對(duì)計(jì)算機(jī)目標(biāo)應(yīng)用程序的表示層中的事件進(jìn)行監(jiān)控的系統(tǒng),所述系統(tǒng)具有預(yù)定的結(jié)構(gòu),所述系統(tǒng)包括在通信網(wǎng)絡(luò)中相互連接的服務(wù)器和客戶計(jì)算機(jī);在所述服務(wù)器上執(zhí)行的監(jiān)控程序,所述監(jiān)控程序包括能夠在所述表示層以下的層上運(yùn)行的腳本;所述監(jiān)控程序能夠操作以實(shí)現(xiàn)以下步驟掃描所述目標(biāo)應(yīng)用的對(duì)象的運(yùn)行期實(shí)例;實(shí)時(shí)地為所述對(duì)象實(shí)例分配結(jié)構(gòu);調(diào)整分配的結(jié)構(gòu),以創(chuàng)建所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映;;險(xiǎn)測(cè)與預(yù)定對(duì)象結(jié)構(gòu)相匹配的一個(gè)或多個(gè)對(duì)象;以及至少捕獲檢測(cè)到的對(duì)象的內(nèi)容。28.如權(quán)利要求27所述的系統(tǒng),其中所述腳本提供在所述目標(biāo)應(yīng)用的本地計(jì)算機(jī)上。29.如權(quán)利要求28所述的系統(tǒng),其中所述客戶計(jì)算機(jī)為以下各項(xiàng)之一個(gè)人計(jì)算機(jī)、工作站、個(gè)人數(shù)字助理以及能執(zhí)行計(jì)算機(jī)操作指令的平臺(tái)。30.—種監(jiān)控主機(jī)應(yīng)用程序的功能的方法,包括以下步驟識(shí)別表示所述主機(jī)應(yīng)用程序內(nèi)的方法函數(shù)的字節(jié)操作碼模式;確定用于至少一個(gè)方法函數(shù)的地址;通過所述地址,將所述方法函數(shù)鏈接于調(diào)用攔截例程,并鏈接于信息結(jié)構(gòu)實(shí)例;以及用堆棧操作對(duì)調(diào)用所述方法函數(shù)的返回進(jìn)行監(jiān)控。31.如權(quán)利要求30所述的方法,其中所述鏈接步驟包括使用跳轉(zhuǎn)例程指令。全文摘要提出了一種用于對(duì)來自計(jì)算機(jī)目標(biāo)應(yīng)用程序表示層的事件進(jìn)行監(jiān)控的系統(tǒng)和方法。所述方法包括獨(dú)立于對(duì)所述目標(biāo)應(yīng)用的源代碼的重編譯,提供在所述目標(biāo)應(yīng)用內(nèi)的層運(yùn)行的腳本。該腳本掃描目標(biāo)應(yīng)用程序的對(duì)象的運(yùn)行期實(shí)例,并實(shí)時(shí)地為所述對(duì)象實(shí)例分配結(jié)構(gòu)。對(duì)分配的結(jié)構(gòu)進(jìn)行調(diào)整,以創(chuàng)建所述目標(biāo)應(yīng)用結(jié)構(gòu)的反映。該反映與檢測(cè)到的與預(yù)定對(duì)象結(jié)構(gòu)相匹配的對(duì)象實(shí)例共同用于捕獲檢測(cè)到的對(duì)象的環(huán)境譜的至少一部分。此外,所述系統(tǒng)可對(duì)發(fā)生在服務(wù)器和客戶/本地化機(jī)器中至少之一上的狀態(tài)機(jī)事件進(jìn)行處理;將狀態(tài)機(jī)事件與環(huán)境譜相關(guān)聯(lián),并基于相關(guān)聯(lián)的狀態(tài)機(jī)事件演繹出用戶經(jīng)驗(yàn)。文檔編號(hào)G06F3/00GK101553769SQ200680046515公開日2009年10月7日申請(qǐng)日期2006年10月10日優(yōu)先權(quán)日2005年10月11日發(fā)明者茲比格涅夫·科佩特奈克,大衛(wèi)·雷納,菲利普·盧伊申請(qǐng)人:努雅公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1