一種組件協議挖掘方法、裝置及系統的制作方法
【技術領域】
[0001] 本發明涉及程序挖掘技術領域,尤其涉及一種組件協議挖掘方法、裝置及系統。
【背景技術】
[0002] 軟件組件的接口函數之間通常存在著時序約束。使用軟件組件時需要遵守的時序 約束構成了該組件的一個協議,即組件協議。這種協議規定了接口函數之間調用的先后順 序。如下所示,分別展示了類java.util.Stack和java.util.Iteration的一個時序約束:
[0003] (1)調用Stack類的peekO函數查看棧頂元素之前,應該先調用pushO函數向棧 中插入一個元素;
[0004] (2)調用Iteration類的next()函數獲取下一個元素之前應該先調用hasNext() 函數查看下一個元素是否存在。
[0005] 這種約束信息可以用于程序說明、程序測試和程序驗證等領域。例如:程序違 反上述時序約束(1)時,會導致EmptyStackException異常;違反時序約束(2)會導致 NoSuchElementException異常。
[0006] 程序約束挖掘是自動的獲得組件協議的有效方法。其通常包括靜態挖掘方法和動 態挖掘方法。其中,動態挖掘方法不需要以程序源代碼作為輸入且可以避免靜態挖掘方法 中存在的不可達路徑、復雜數據結構和指針別名等問題,適用范圍更加廣泛。當前,動態挖 掘方法主要有兩階段步驟:第一階段采用插粧技術對目標應用程序進行插粧,然后通過運 行目標應用程序收集表征程序執行軌跡的函數調用信息,并將函數調用信息存儲在軌跡文 件中;第二階段將軌跡文件作為輸入,采用序列化數據挖掘方法提取組件協議。
[0007] 然而采用上述動態挖掘方法,在與一個組件相關的函數調用信息數量過少時,易 導致過擬合問題,即獲得的組件協議缺乏準確性和完備性,而要獲得足夠的函數調用信息, 需要耗費大量的人力來運行程序和收集函數調用信息;且采用中間文件作為函數調用信息 的存儲方式,需要導出文件后,再統一進行組件挖掘,限制了組件協議的挖掘效率。
[0008] 可見,現有的組件協議挖掘方法存在人力耗費大和挖掘效率低的技術問題。
【發明內容】
[0009] 本發明提供一種組件協議挖掘方法、裝置及系統,用以解決現有技術中的組件協 議挖掘方法存在的人力耗費大和挖掘效率低的技術問題。
[0010] 第一方面,提供一種組件協議挖掘方法,所述方法應用于服務器中,所述服務器與 N個客戶端連接,N為大于1的整數,所述方法包括:
[0011] 發送開始插粧指令至所述N個客戶端,所述開始插粧指令中攜帶有需要挖掘的類 的M個函數的函數標識,M為大于1的整數;
[0012] 接收所述N個客戶端發送的所述M個函數的函數調用信息;所述函數調用信息是 所述N個客戶端基于所述開始插粧指令收集的信息;
[0013] 根據所述函數調用信息更新所述服務器中存儲的所述類的組件協議。
[0014] 可選的,所述根據所述函數調用信息更新所述服務器中存儲的所述類的組件協議 之后,還包括:
[0015] 當符合預設條件時,發送停止插粧指令至所述N個客戶端,所述停止插粧指令中 攜帶有所述函數標識,以使所述N個客戶端基于所述停止插粧指令停止收集所述M個函數 的函數調用信息。
[0016] 可選的,所述預設條件具體為:
[0017] 所述組件協議中包括的函數數量大于等于第一閾值;所述第一閾值大于等于所述 類的公有函數的數量,和/或
[0018] 連續發生第一事件的次數大于等于第二閾值;所述第一事件為更新所述組件協 議,且所述組件協議沒有變化。
[0019] 第二方面,提供一種組件協議挖掘方法,所述方法應用于客戶端中,所述客戶端與 服務器連接,所述方法包括:
[0020] 接收所述服務器發送的開始插粧指令,所述開始插粧指令中攜帶有需要挖掘的類 的M個函數的函數標識,M為大于1的整數;
[0021] 從所述M個函數中確定出L個函數;M彡L彡1 ;
[0022] 在所述客戶端上運行目標應用程序時,對所述目標應用程序的所述L個函數進行 插粧,以收集所述L個函數的函數調用信息;
[0023] 發送所述函數調用信息至所述服務器,以使所述服務器根據所述函數調用信息更 新所述服務器中存儲的所述類的組件協議。
[0024] 可選的,所述從所述M個函數中確定出L個函數,具體為:
[0025] 獲取所述目標應用程序的實時性要求參數;所述實時性要求參數的數值與所述目 標應用程序要求的響應速度呈正比;
[0026] 根據所述實時性要求參數從所述M個函數中確定出L個函數,以使L與所述實時 性要求參數的數值呈反比。
[0027] 可選的,所述發送所述函數調用信息至所述服務器之后,還包括:
[0028] 接收所述服務器發送的停止插粧指令,所述停止插粧指令中攜帶有所述函數標 識;
[0029] 基于所述停止插粧指令停止收集所述L個函數的函數調用信息。
[0030] 第三方面,提供一種組件協議挖掘系統,所述系統包括服務器和與所述服務器連 接的N個客戶端,N為大于1的整數;
[0031] 其中,所述服務器用于發送開始插粧指令至所述N個客戶端,所述開始插粧指令 中攜帶有需要挖掘的類的M個函數的函數標識,M為大于1的整數;
[0032] 所述N個客戶端用于接收所述開始插粧指令;以及從所述M個函數中確定出L個 函數;M多L多1 ;以及在所述客戶端上運行目標應用程序時,對所述目標應用程序的所述 L個函數進行插粧,以收集所述L個函數的函數調用信息;以及發送所述函數調用信息至所 述服務器;
[0033] 所述服務器還用于,接收所述N個客戶端發送的所述函數調用信息;并根據所述 函數調用信息更新所述服務器中存儲的所述類的組件協議。
[0034] 第四方面,提供一種組件協議挖掘裝置,具體為服務器,所述服務器與N個客戶端 連接,N為大于1的整數,所述裝置包括:
[0035] 第一發送單元,用于發送開始插粧指令至所述N個客戶端,所述開始插粧指令中 攜帶有需要挖掘的類的M個函數的函數標識,M為大于1的整數;
[0036] 第一接收單元,用于接收所述N個客戶端發送的所述M個函數的函數調用信息;所 述函數調用信息是所述N個客戶端基于所述開始插粧指令收集的信息;
[0037] 更新單元,用于根據所述函數調用信息更新所述服務器中存儲的所述類的組件協 議。
[0038] 第五方面,提供一種組件協議挖掘裝置,具體為客戶端,所述客戶端與服務器連 接,所述裝置包括:
[0039] 第二接收單元,用于接收所述服務器發送的開始插粧指令,所述開始插粧指令中 攜帶有需要挖掘的類的M個函數的函數標識,M為大于1的整數;
[0040] 確定單元,用于從所述M個函數中確定出L個函數;M彡L彡1 ;
[0041] 插粧單元,用于在所述客戶端上運行目標應用程序時,對所述目標應用程序的所 述L個函數進行插粧,以收集所述L個函數的函數調用信息;
[0042] 第二發送單元,用于發送所述函數調用信息至所述服務器,以使所述服務器根據 所述函數調用信息更新所述服務器中存儲的所述類的組件協議。
[0043] 本申請實施例中提供的一個或多個技術方案,至少具有如下技術效果或優點:
[0044] 1、本申請實施例提供的組件協議挖掘方法、裝置及系統,通過組網結構,服務器能 同時從多個客戶端獲取大量的函數調用信息,從而獲取更豐富和完善的程序執行軌跡,不 需要耗費大量的人力就提高了組件挖掘的準確性和完備性,降低了數據獲取成本。
[0045] 2、本申請實施例提供的組件協議挖掘方法、裝置及系統,無需進行中間文件的存 儲,具有較小的存儲空間開銷,由服務器在每次接收到一個函數調用信息后,就對已有的組 件協議進行實時更新,即組件協議的挖掘與函數調用信息的獲取并發進行,提高了組件協 議挖掘的效率。
[0046] 3、本申請實施例提供的組件協議挖掘方法、裝置及系統,從多個客戶端獲取函數 調用信息,即不用對一個客戶端的一個程序進行大量插粧來獲取足夠的函數調用信息,采 用根據應用程序的實時性要求設置插粧數量,避免過度插粧對應用程序實時性造成較大影 響。
[0047] 4、本申請實施例提供的組件協議挖掘方法、裝置及系統,在符合預設條件時,停止 進行函數調用信息的收集,有效緩解了服務器端和客戶端的計算壓力。
【附圖說明】
[0048] 為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例描述 中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的