本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種覆蓋率檢測(cè)方法、裝置和設(shè)備。
背景技術(shù):
代碼覆蓋率測(cè)試,是軟件測(cè)試過(guò)程中最重要的測(cè)試方法和測(cè)試效果衡量標(biāo)準(zhǔn)之一,覆蓋率指的是源代碼執(zhí)行過(guò)程中被測(cè)試所覆蓋到代碼的比例和程度,通常用百分比表示。
對(duì)不同的編程語(yǔ)言來(lái)說(shuō),都有相應(yīng)的檢測(cè)代碼覆蓋率的方法。目前較主流的游戲服務(wù)器架構(gòu)之一,是基于C++底層和Python上層構(gòu)建實(shí)現(xiàn)。目前針對(duì)Python代碼覆蓋率的檢測(cè),最常用的是基于python類庫(kù)coverage的技術(shù)方案。具體的是利用Python的sys模塊中提供settrace函數(shù),跟蹤代碼的執(zhí)行情況,將覆蓋率數(shù)據(jù)存儲(chǔ)到Collector中的Stack中。每當(dāng)開始采集時(shí),Collector不斷執(zhí)行入棧操作,停止采集時(shí),通過(guò)出棧操作即可獲取已采集的覆蓋率信息。
然而,在游戲服務(wù)器的代碼覆蓋率檢測(cè)過(guò)程中,經(jīng)常會(huì)對(duì)代碼進(jìn)行更新修改等,因此如果已經(jīng)調(diào)用settrace函數(shù)采集過(guò)該文件代碼的覆蓋率數(shù)據(jù),代碼的更新會(huì)造成最終得到的覆蓋率信息不準(zhǔn)確。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種覆蓋率檢測(cè)方法、裝置和設(shè)備,用于解決在游戲服務(wù)器的代碼覆蓋率檢測(cè)過(guò)程中,經(jīng)常會(huì)對(duì)代碼進(jìn)行更新修改等,因此如果已經(jīng)調(diào)用settrace函數(shù)采集過(guò)該文件代碼的覆蓋率數(shù)據(jù),代碼的更新會(huì)造成最終得到的覆蓋率信息不準(zhǔn)確的問(wèn)題。
本發(fā)明第一方面提供一種覆蓋率檢測(cè)方法,包括:
接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件;
解析獲取所述源代碼文件的總代碼行數(shù);
根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
可選的,所述方法還包括:
顯示所述文件當(dāng)前的所述覆蓋率。
可選的,所述執(zhí)行數(shù)據(jù)包括所述服務(wù)器執(zhí)行的所述文件被執(zhí)行的代碼行號(hào),所述根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率,包括:
根據(jù)所述被執(zhí)行的代碼行號(hào),獲取所述文件中已執(zhí)行代碼的行數(shù);
根據(jù)所述已執(zhí)行代碼的行數(shù)Le和所述總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到所述文件當(dāng)前的覆蓋率R。
可選的,所述解析獲取所述源代碼文件的總代碼行數(shù),包括:
對(duì)所述源代碼文件進(jìn)行解析處理,剔除所述源代碼文件中的空白行和注釋行,得到所述源代碼文件的所述總代碼行數(shù)。
本發(fā)明第二方面提供一種覆蓋率檢測(cè)方法,包括:
在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作;
若是,則獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件;
將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
可選的,所述將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端之前,所述方法還包括:
將存儲(chǔ)的所述文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù)和源代碼文件更新為重新獲取的所述執(zhí)行數(shù)據(jù)和源代碼文件進(jìn)行存儲(chǔ);所述執(zhí)行數(shù)據(jù)包括所述文件的文件名稱和所述文件被執(zhí)行的代碼行號(hào)。
可選的,所述檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作之前,所述方法還包括:
啟動(dòng)采集線程,調(diào)用數(shù)據(jù)收集函數(shù)獲取所述文件的執(zhí)行數(shù)據(jù),并啟動(dòng)熱更新操作監(jiān)控線程。
可選的,所述熱更新操作包括以下至少一種操作:
對(duì)所述文件的程序代碼進(jìn)行修改;
對(duì)所述文件的程序代碼進(jìn)行移動(dòng);
對(duì)所述文件的程序代碼進(jìn)行刪除。
本發(fā)明第三方面提供一種覆蓋率檢測(cè)裝置,包括:
接收模塊,用于接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件;
處理模塊,用于解析獲取所述源代碼文件的總代碼行數(shù);
所述處理模塊還用于根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
可選的,所述裝置還包括:
顯示模塊,用于顯示所述文件當(dāng)前的所述覆蓋率。
可選的,所述執(zhí)行數(shù)據(jù)包括所述服務(wù)器執(zhí)行的所述文件被執(zhí)行的代碼行號(hào),所述處理模塊具體用于:
根據(jù)所述被執(zhí)行的代碼行號(hào),獲取所述文件中已執(zhí)行代碼的行數(shù);
根據(jù)所述已執(zhí)行代碼的行數(shù)Le和所述總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到所述文件當(dāng)前的覆蓋率R。
可選的,所述處理模塊具體用于:
對(duì)所述源代碼文件進(jìn)行解析處理,剔除所述源代碼文件中的空白行和注釋行,得到所述源代碼文件的所述總代碼行數(shù)。
本發(fā)明第四方面提供一種覆蓋率檢測(cè)裝置,包括:
處理模塊,用于在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作;
若是,則所述處理模塊還用于獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件;
發(fā)送模塊,用于將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
可選的,所述處理模塊還用于:
將存儲(chǔ)的所述文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù)和源代碼文件更新為重新獲取的所述執(zhí)行數(shù)據(jù)和源代碼文件進(jìn)行存儲(chǔ);所述執(zhí)行數(shù)據(jù)包括所述文件的文件名稱和所述文件被執(zhí)行的代碼行號(hào)。
可選的,所述處理模塊還用于:
啟動(dòng)采集線程,調(diào)用數(shù)據(jù)收集函數(shù)獲取所述文件的執(zhí)行數(shù)據(jù),并啟動(dòng)熱更新操作監(jiān)控線程。
可選的,所述處理模塊執(zhí)行的熱更新操作包括以下至少一種操作:
對(duì)所述文件的程序代碼進(jìn)行修改;
對(duì)所述文件的程序代碼進(jìn)行移動(dòng);
對(duì)所述文件的程序代碼進(jìn)行刪除。
本發(fā)明第五方面提供一種服務(wù)器,包括:用于存儲(chǔ)程序指令的存儲(chǔ)器、用于控制程序指令執(zhí)行的處理器以及接收器;
所述接收器用于接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件;
所述處理器用于:
解析獲取所述源代碼文件的總代碼行數(shù);
根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
本發(fā)明第六方面提供一種服務(wù)器,包括:用于存儲(chǔ)程序指令的存儲(chǔ)器、用于控制程序指令執(zhí)行的處理器以及發(fā)送器;
所述處理器用于:
在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作;
若是,則獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件;
所述發(fā)送器用于將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
本發(fā)明實(shí)施例提供的一種覆蓋率檢測(cè)方法、裝置和設(shè)備,通過(guò)文件運(yùn)行端的服務(wù)器實(shí)時(shí)檢測(cè),確定文件被執(zhí)行熱更新操作后,重新獲取更新后的文件的執(zhí)行數(shù)據(jù)以及更新后的源代碼文件,并將重新獲取到的執(zhí)行數(shù)據(jù)和源代碼文件發(fā)送給覆蓋率服務(wù)器,覆蓋率服務(wù)器根據(jù)源代碼文件解析獲取總代碼行數(shù),結(jié)合更新后的執(zhí)行數(shù)據(jù)得到該執(zhí)行熱更新后的文件的覆蓋率,解決了現(xiàn)有方案得到的覆蓋率信息不準(zhǔn)確的問(wèn)題,能夠?qū)崟r(shí)得到熱更新后文件的準(zhǔn)確的覆蓋率信息。
附圖說(shuō)明
為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其它的附圖。
圖1為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例一的流程圖;
圖2為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例二的流程圖;
圖3為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例三的流程圖;
圖4為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法在游戲服務(wù)器和覆蓋率服務(wù)器側(cè)執(zhí)行功能示意圖;
圖5為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例一的結(jié)構(gòu)示意圖;
圖6為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例二的結(jié)構(gòu)示意圖;
圖7為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例三的結(jié)構(gòu)示意圖;
圖8為本發(fā)明實(shí)施例提供的服務(wù)器實(shí)施例一的結(jié)構(gòu)示意圖;
圖9為本發(fā)明實(shí)施例提供的服務(wù)器實(shí)施例二的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例一的流程圖,如圖1所示,該方案的執(zhí)行主體為用于檢測(cè)覆蓋率的服務(wù)器,或者檢測(cè)覆蓋率的其他設(shè)備,該覆蓋率檢測(cè)方法的具體實(shí)現(xiàn)步驟為:
步驟S101,接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件。
在本實(shí)施例中,這里發(fā)送程序執(zhí)行數(shù)據(jù)的服務(wù)器為執(zhí)行該文件的程序的服務(wù)器,例如:運(yùn)行游戲程序的服務(wù)器。測(cè)試人員可以在文件執(zhí)行的過(guò)程中對(duì)文件進(jìn)行熱更新操作,因此文件執(zhí)行端的服務(wù)器需要在獲取了執(zhí)行數(shù)據(jù)之后檢測(cè)是否對(duì)文件進(jìn)行熱更新,如果是則需要重新獲取執(zhí)行數(shù)據(jù),并且要獲取熱更新后的源代碼文件,向覆蓋率服務(wù)器發(fā)送程序熱更新數(shù)據(jù),其中包括重新獲取的包括熱更新后的文件被執(zhí)行的行號(hào)和文件名稱的執(zhí)行數(shù)據(jù),以及新的源代碼文件。
步驟S102,解析獲取所述源代碼文件的總代碼行數(shù)。
本方案中,檢測(cè)覆蓋率的服務(wù)器或者其他的設(shè)備對(duì)接收到的源代碼文件進(jìn)行解析處理,得到文件對(duì)應(yīng)的源代碼的行數(shù),這里的行數(shù)不包括空格和注釋行,即得到程序的總代碼行數(shù)。
步驟S103,根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
在本步驟中,該執(zhí)行數(shù)據(jù)至少包括能夠確定程序已經(jīng)執(zhí)行行數(shù)的參數(shù),例如:被執(zhí)行的代碼行號(hào),或者已經(jīng)執(zhí)行的行數(shù)等。
檢測(cè)覆蓋率的服務(wù)器根據(jù)該源代碼文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù)進(jìn)行處理得到當(dāng)前已經(jīng)執(zhí)行代碼的行數(shù),然后根據(jù)已執(zhí)行代碼的行數(shù)和總代碼行數(shù),計(jì)算得到覆蓋率。
該過(guò)程是實(shí)時(shí)進(jìn)行的,檢測(cè)覆蓋率的裝置(或服務(wù)器)實(shí)時(shí)接收程序執(zhí)行端的服務(wù)器發(fā)送來(lái)的文件的執(zhí)行數(shù)據(jù),按照上述方式進(jìn)行處理,可以得到被執(zhí)行了熱更新的文件的準(zhǔn)確的覆蓋率。
本實(shí)施例提供的覆蓋率檢測(cè)方法,服務(wù)器向覆蓋率檢測(cè)端的服務(wù)器發(fā)送包括熱更新后文件的執(zhí)行數(shù)據(jù)以及熱更新后的源代碼文件的程序熱更新數(shù)據(jù),然后覆蓋率檢測(cè)端的服務(wù)器對(duì)接收到的源代碼文件進(jìn)行解析獲取總代碼行數(shù),然后結(jié)合執(zhí)行數(shù)據(jù)和總代碼行數(shù)計(jì)算獲取該文件當(dāng)前的覆蓋率,解決了現(xiàn)有方案得到的覆蓋率信息不準(zhǔn)確的問(wèn)題,能夠?qū)崟r(shí)得到熱更新后文件的準(zhǔn)確的覆蓋率信息。
圖2為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例二的流程圖,如圖2所示,在上述實(shí)施例的基礎(chǔ)上,提供該覆蓋率檢測(cè)的的具體實(shí)現(xiàn)方式:
步驟S201,接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件。
具體實(shí)現(xiàn)方式與實(shí)施例類似,在此不再贅述。
步驟S202,對(duì)所述源代碼文件進(jìn)行解析處理,剔除所述源代碼文件中的空白行和注釋行,得到所述源代碼文件的所述總代碼行數(shù)。
在本步驟中,覆蓋率檢測(cè)端的設(shè)備(例如:覆蓋率服務(wù)器)接收到的程序執(zhí)行數(shù)據(jù)中只有對(duì)某個(gè)文件的執(zhí)行的相關(guān)數(shù)據(jù)以及源代碼文件,并沒有該源代碼文件的總代碼行數(shù),因此該覆蓋率檢測(cè)端的設(shè)備需要對(duì)接收到的該源代碼文件進(jìn)行解析,將其中注釋行和空白行等無(wú)關(guān)程序?qū)嵸|(zhì)的非代碼行進(jìn)行剔除,并統(tǒng)計(jì)得到該源代碼文件的總代碼行數(shù)。
步驟S203,根據(jù)執(zhí)行數(shù)據(jù)中包括的被執(zhí)行的代碼行號(hào),獲取所述文件中已執(zhí)行代碼的行數(shù)。
步驟S204,根據(jù)所述已執(zhí)行代碼的行數(shù)Le和所述總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到所述文件當(dāng)前的覆蓋率R。
上述步驟的具體實(shí)現(xiàn)中,可以根據(jù)被執(zhí)行的代碼行號(hào),獲取文件中已執(zhí)行代碼的行數(shù),根據(jù)已執(zhí)行代碼的行數(shù)Le和總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到文件當(dāng)前的覆蓋率R。
具體的,根據(jù)前述步驟,覆蓋率檢測(cè)端的設(shè)備已經(jīng)接收到了文件被執(zhí)行的代碼行號(hào),則將執(zhí)行過(guò)的代碼行數(shù)作為已經(jīng)執(zhí)行代碼的行數(shù)之和,例如:獲取到的被執(zhí)行的代碼行號(hào)為50,則認(rèn)為該文件的代碼已經(jīng)執(zhí)行了50行,或者,數(shù)據(jù)顯示某文件,第1,3-10,55行已經(jīng)發(fā)生了執(zhí)行事件,那么此時(shí)已執(zhí)行代碼行數(shù)的值應(yīng)當(dāng)為1+8+1=10行。根據(jù)該種方式得到文件中已經(jīng)執(zhí)行的代碼行數(shù)。通過(guò)前述步驟覆蓋率檢測(cè)端的設(shè)備完成覆蓋率數(shù)據(jù)采集,得到了已執(zhí)行的代碼行數(shù),以及該源代碼文件中的可執(zhí)行的代碼行總數(shù)。利用上述兩個(gè)步驟獲得的數(shù)據(jù),在此處通過(guò)公式采用R=Le/Lt即可計(jì)算出當(dāng)前文件熱更新后的覆蓋率R。其中,Le表示已執(zhí)行代碼的行數(shù),Lt表示總代碼行數(shù)。
步驟S205,顯示所述文件當(dāng)前的所述覆蓋率。
該步驟S205為可選的步驟,并不是必須要執(zhí)行的,覆蓋率檢測(cè)端的設(shè)備如果接收用戶通過(guò)客戶端或者前端發(fā)送的數(shù)據(jù)請(qǐng)求,或者預(yù)先配置了需要將得到的覆蓋率進(jìn)行顯示,則可以通過(guò)顯示器或者前短客戶端將得到的覆蓋率進(jìn)行顯示。
本實(shí)施例提供的覆蓋率檢測(cè)方法,通過(guò)實(shí)時(shí)接收服務(wù)器發(fā)送的熱更新后的執(zhí)行數(shù)據(jù)和源代碼文件,并對(duì)該執(zhí)行數(shù)據(jù)進(jìn)行分析處理得到已執(zhí)行代碼行數(shù),并對(duì)該源代碼文件進(jìn)行處理得到總代碼行數(shù),計(jì)算得到熱更新后的覆蓋率數(shù)據(jù),解決了現(xiàn)有方案得到的覆蓋率信息不準(zhǔn)確的問(wèn)題,能夠?qū)崟r(shí)得到熱更新后文件的準(zhǔn)確的覆蓋率信息。
圖3為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法實(shí)例三的流程圖;如圖3所示,該方案的執(zhí)行主體為文件運(yùn)行端的服務(wù)器或者其他裝置,該覆蓋率檢測(cè)方法的具體實(shí)現(xiàn)步驟為:
步驟S301,在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作。
在本步驟中,文件運(yùn)行端的服務(wù)器中嵌入實(shí)時(shí)收集執(zhí)行數(shù)據(jù)的客戶端,或者將該實(shí)時(shí)收集執(zhí)行數(shù)據(jù)的客戶端嵌入在文件的程序中,啟動(dòng)采集線程,調(diào)用數(shù)據(jù)收集函數(shù)獲取所述文件的執(zhí)行數(shù)據(jù),并啟動(dòng)熱更新操作監(jiān)控線程。
其含義是:在運(yùn)行該文件的過(guò)程中,啟動(dòng)數(shù)據(jù)采集線程,調(diào)用數(shù)據(jù)收集函數(shù),實(shí)時(shí)獲取該文件的執(zhí)行數(shù)據(jù)。同時(shí)需要啟動(dòng)熱更新操作監(jiān)控線程,在采集到文件的執(zhí)行數(shù)據(jù)之后,或者發(fā)送給覆蓋率服務(wù)端之前,檢測(cè)該文件是否被執(zhí)行熱更新操作。
可選的,在該過(guò)程中,文件運(yùn)行端的服務(wù)器或者其他裝置可以將收集的執(zhí)行數(shù)據(jù)按照文件名稱進(jìn)行存儲(chǔ),當(dāng)發(fā)生了新的代碼執(zhí)行事件之后,可以根據(jù)文件名稱對(duì)該執(zhí)行數(shù)據(jù)進(jìn)行更新。具體的,對(duì)執(zhí)行數(shù)據(jù)進(jìn)行存儲(chǔ)的實(shí)現(xiàn)方式為:根據(jù)所述文件名稱,檢測(cè)本地是否存在與所述文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù);若存在,則在本地不存在所述文件被執(zhí)行的代碼行號(hào)時(shí),將所述文件被執(zhí)行的代碼行號(hào)存儲(chǔ)在所述程序執(zhí)行數(shù)據(jù)中;若不存在,則在本地增加以所述文件名稱為索引的所述文件對(duì)應(yīng)的所述執(zhí)行數(shù)據(jù)。
步驟S302,若是,則獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件。
在本步驟中,如果文件沒有被執(zhí)行熱更新操作,那么則直接將獲取到的執(zhí)行數(shù)據(jù)發(fā)送給覆蓋率服務(wù)器端,進(jìn)行覆蓋率計(jì)算。如果文件被執(zhí)行熱更新操作,文件運(yùn)行服務(wù)器需要重新獲取下執(zhí)行數(shù)據(jù),并且需要獲取該文件被執(zhí)行熱更新后的源代碼文件。
用戶通過(guò)操作可以對(duì)文件進(jìn)行的熱更新操作至少包括以下一種操作:對(duì)所述文件的程序代碼進(jìn)行修改;對(duì)所述文件的程序代碼進(jìn)行移動(dòng);對(duì)所述文件的程序代碼進(jìn)行刪除等。
由于對(duì)文件進(jìn)行修改、移動(dòng)或者刪除會(huì)導(dǎo)致源代碼本身的變化,因此對(duì)于覆蓋率服務(wù)器端來(lái)說(shuō),原來(lái)存儲(chǔ)的文件的源代碼已不是現(xiàn)在運(yùn)行的文件的源代碼,因此需要在獲取執(zhí)行數(shù)據(jù)的同時(shí)獲取新的源代碼文件,并發(fā)送給覆蓋率服務(wù)端的服務(wù)器或者其他設(shè)備。
步驟S303,將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
文件運(yùn)行端的服務(wù)器或者其他裝置將獲取到的包括執(zhí)行數(shù)據(jù)以及新的源代碼文件的程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使覆蓋率檢測(cè)端的服務(wù)端(例如服務(wù)器)實(shí)時(shí)接收?qǐng)?zhí)行端服務(wù)器發(fā)送的程序熱更新數(shù)據(jù),并對(duì)該源代碼文件進(jìn)行解析獲取總代碼行數(shù),然后結(jié)合執(zhí)行數(shù)據(jù)和總代碼行數(shù)計(jì)算獲取該文件當(dāng)前的覆蓋率,不需要額外增加命令,在測(cè)試過(guò)程中也不需要不斷的停止和開始,通過(guò)實(shí)時(shí)接收文件運(yùn)行服務(wù)器發(fā)送的文件的執(zhí)行數(shù)據(jù)和源代碼文件,得到該文件的實(shí)時(shí)覆蓋率。
在上述實(shí)施例一至實(shí)施例三的基礎(chǔ)上,下面以覆蓋率檢測(cè)端為覆蓋率服務(wù)器、文件執(zhí)行端為游戲服務(wù)器為例,對(duì)本發(fā)明覆蓋率檢測(cè)方法進(jìn)行說(shuō)明。
圖4為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)方法在游戲服務(wù)器和覆蓋率服務(wù)器側(cè)執(zhí)行功能示意圖。如圖4所示,在游戲服務(wù)器啟動(dòng)之后,分別啟動(dòng)采集線程和監(jiān)控線程,其中采集線程用于采集文件的執(zhí)行數(shù)據(jù),而監(jiān)控線程則對(duì)進(jìn)行覆蓋率測(cè)試的所有文件的變化(例如修改,刪除等)進(jìn)行監(jiān)控。
發(fā)生文件的代碼熱更新時(shí),通過(guò)記錄發(fā)生熱更的代碼文件名,將其現(xiàn)有的覆蓋率數(shù)據(jù)重置為重新獲取熱更新后的文件的執(zhí)行數(shù)據(jù),并獲取熱更新后的源代碼文件,一并發(fā)送至覆蓋率服務(wù)器進(jìn)行覆蓋率計(jì)算。具體的,
1.1、初始化
初始化過(guò)程分為啟動(dòng)覆蓋率數(shù)據(jù)處理服務(wù)端和嵌入覆蓋率采集客戶端到游戲服務(wù)器腳本中兩個(gè)部分。
覆蓋率服務(wù)端基于Tornado構(gòu)建,主要功能是通過(guò)websocket接收來(lái)自覆蓋率客戶端(也稱為文件執(zhí)行端,例如:游戲服務(wù)器)發(fā)送的數(shù)據(jù)的數(shù)據(jù),并定時(shí)將同一游戲服務(wù)器的數(shù)據(jù)合并和處理。在游戲服務(wù)器啟動(dòng)測(cè)試之前,首先啟動(dòng)覆蓋率服務(wù)端,等待客戶端連接和收集數(shù)據(jù)。
對(duì)于客戶端,在游戲服務(wù)器中啟動(dòng)不同進(jìn)程的腳本中,添加使用線程啟動(dòng)websocket連接的代碼,具體如下:
ws=websocket.WebSocket("ws://websocket_address/")
thread_ws=threading.Thread(target=ws.run)
thread_ws.start()
該線程用于在每個(gè)游戲服務(wù)器進(jìn)程啟動(dòng)websocket并連接到覆蓋率服務(wù)器后,進(jìn)行定時(shí)的數(shù)據(jù)發(fā)送。
1.2、數(shù)據(jù)采集
嵌入游戲服務(wù)器的客戶端,主要通過(guò)添加如下代碼實(shí)現(xiàn)數(shù)據(jù)采集:
即利用python自帶的sys.settrace方法,在游戲服務(wù)器腳本運(yùn)行過(guò)程中,每當(dāng)發(fā)生了代碼執(zhí)行事件(event),就會(huì)調(diào)用trace方法進(jìn)行跟蹤,其中frame表示python運(yùn)行過(guò)程中的棧幀,event表示發(fā)生的事件(例如執(zhí)行了某一行代碼,或者調(diào)用了某個(gè)函數(shù)等)。使用frame.f_code.co_filename獲取被執(zhí)行的文件名稱fliename,使用frame.f_lineno獲取當(dāng)前執(zhí)行的代碼行號(hào),然后調(diào)用collect方法進(jìn)行數(shù)據(jù)收集,該方法主要是使用了字典(python的一種內(nèi)置數(shù)據(jù)結(jié)構(gòu),以鍵-值對(duì)格式存儲(chǔ)數(shù)據(jù))的形式,將數(shù)據(jù)以文件名為鍵,以被執(zhí)行的代碼行號(hào)集合為值的形式存儲(chǔ)。
1.3、文件變化監(jiān)控
在游戲服務(wù)器啟動(dòng)同時(shí)啟動(dòng)監(jiān)控線程,對(duì)進(jìn)行覆蓋率測(cè)試的代碼文件目錄進(jìn)行監(jiān)控。該監(jiān)控線程,主要基于python的擴(kuò)展庫(kù)watchdog實(shí)現(xiàn),該依賴庫(kù),能夠?qū)χ付ㄎ募夸浀臓顟B(tài)進(jìn)行監(jiān)控。
當(dāng)文件目錄發(fā)生變化時(shí),會(huì)觸發(fā)相應(yīng)的事件和操作:
上文為python代碼,當(dāng)文件目錄中發(fā)生了修改(modified),移動(dòng)(moved)和刪除(deleted)時(shí),對(duì)文件進(jìn)行處理(process函數(shù)),而當(dāng)文件創(chuàng)建(created)時(shí),不做任何操作。
處理的方法(process函數(shù)如下):
即當(dāng)發(fā)生了修改(modified)時(shí),通過(guò)event.src_path屬性獲取發(fā)生修改(modified)的文件名稱,然后在當(dāng)前的執(zhí)行數(shù)據(jù)(即覆蓋率數(shù)據(jù))中搜索,如果已采集過(guò)執(zhí)行數(shù)據(jù),則將其數(shù)據(jù)重置為空集(set([]))。
同樣的,當(dāng)發(fā)生了刪除(deleted)或者移動(dòng)(moved)時(shí),若已有覆蓋率數(shù)據(jù),則將其從字典中刪除,然后重新進(jìn)行執(zhí)行數(shù)據(jù)采集。
另外,當(dāng)發(fā)生代碼熱更新時(shí),覆蓋率服務(wù)端從游戲服務(wù)器獲取更新后的源代碼文件,具體實(shí)現(xiàn)過(guò)程為:
當(dāng)發(fā)生熱更時(shí),可以通過(guò)observer導(dǎo)出發(fā)生變化的文件,此時(shí)游戲服務(wù)器上的覆蓋率客戶端,會(huì)進(jìn)行重新解析,然后發(fā)送到覆蓋率服務(wù)端;發(fā)送的數(shù)據(jù)是:
{filename:{'executed':[1,2,3,....],'code':[1,2,3,.....]},其中,executed:[1,2,3,....]為執(zhí)行行,code:[1,2,3,....]為原碼行。
覆蓋率服務(wù)端在收到由observer控制的coverage_reload指令后,就將該指令對(duì)應(yīng)的數(shù)據(jù)中所有文件名對(duì)應(yīng)的源碼行/執(zhí)行行重新替換一遍。
即游戲服務(wù)器同時(shí)獲取熱更新后的文件的執(zhí)行數(shù)據(jù)以及源代碼文件,并發(fā)送給覆蓋率服務(wù)器。
1.4、計(jì)算每個(gè)文件的覆蓋率
當(dāng)熱更完畢后,覆蓋率服務(wù)器也得到了熱更后的覆蓋率數(shù)據(jù),從而避免了文件內(nèi)容或行號(hào)發(fā)生改變導(dǎo)致的覆蓋率數(shù)據(jù)的錯(cuò)誤。
由上述步驟,獲得了每個(gè)文件當(dāng)前所執(zhí)行過(guò)的代碼行號(hào)的集合,已知覆蓋率計(jì)算公式為:
其中,Rate表示覆蓋率,lineexecute表示當(dāng)前文件中已經(jīng)執(zhí)行過(guò)的代碼行數(shù),linetotal表示當(dāng)前文件的可執(zhí)行代碼行總數(shù)。
對(duì)接收到的源代碼文件進(jìn)行解析,解析的過(guò)程是去除空白行和注釋行,從而計(jì)算出真正的可執(zhí)行代碼行的總數(shù)。
通過(guò)游戲服務(wù)器的覆蓋率數(shù)據(jù)采集,使用代碼行號(hào)集合的大小即可獲得lineexecute,也就是已執(zhí)行的代碼行數(shù)。通過(guò)本地源碼的解析,獲得了linetotal,也就是當(dāng)前文件可執(zhí)行的代碼行總數(shù)。利用上述兩個(gè)步驟獲得的數(shù)據(jù),在此處通過(guò)公式即可計(jì)算出游戲服務(wù)器對(duì)應(yīng)熱更新后的文件的覆蓋率。
本方案主要由覆蓋率數(shù)據(jù)處理服務(wù)端和覆蓋率采集客戶端組成。其中覆蓋率數(shù)據(jù)處理服務(wù)端,主要功能是通過(guò)websocket接收和處理來(lái)自客戶端的數(shù)據(jù)??蛻舳饲度氲酱郎y(cè)試的游戲服務(wù)器腳本中,使用python的sys.settrace收集數(shù)據(jù)。本方案完整的采集流程,分為數(shù)據(jù)采集,文件監(jiān)控,數(shù)據(jù)重置三個(gè)部分。首先依次啟動(dòng)文件監(jiān)控線程和數(shù)據(jù)采集線程,將數(shù)據(jù)發(fā)送和存儲(chǔ)到數(shù)據(jù)處理服務(wù)器中。之后在采集過(guò)程中,若發(fā)生代碼熱更操作,則文件監(jiān)控線程將對(duì)應(yīng)文件的覆蓋率數(shù)據(jù)重置為初始狀態(tài)。最后數(shù)據(jù)處理服務(wù)器計(jì)算出游戲服務(wù)器所有文件最終真實(shí)的覆蓋率數(shù)值。解決了利用python的sys.settrace方法進(jìn)行覆蓋率數(shù)據(jù)采集時(shí),在采集過(guò)程中發(fā)生了代碼熱更后,文件內(nèi)容和行號(hào)發(fā)生變化,導(dǎo)致最終采集的覆蓋率數(shù)據(jù)不準(zhǔn)確的問(wèn)題。
圖5為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例一的結(jié)構(gòu)示意圖,如圖5所示,本實(shí)施例提供的覆蓋率檢測(cè)裝置10包括:
接收模塊11,用于接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件;
處理模塊12,用于解析獲取所述源代碼文件的總代碼行數(shù);
所述處理模塊12還用于根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
本實(shí)施例提供的覆蓋率檢測(cè)裝置,用于執(zhí)行前述任一實(shí)施例提供的方法中覆蓋率服務(wù)器端的技術(shù)方案,其實(shí)現(xiàn)原理和技術(shù)效果類似,在此不再贅述。
在本發(fā)明覆蓋率檢測(cè)裝置的實(shí)施例二中,圖6為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例二的結(jié)構(gòu)示意圖,如圖6所示,在上述實(shí)施例一的基礎(chǔ)上,該覆蓋率檢測(cè)裝置10還包括:
顯示模塊13,用于顯示所述文件當(dāng)前的所述覆蓋率。
在上述任一實(shí)施例的基礎(chǔ)上,可選的,所述執(zhí)行數(shù)據(jù)包括所述服務(wù)器執(zhí)行的所述文件被執(zhí)行的代碼行號(hào),所述處理模塊12具體用于:
根據(jù)所述被執(zhí)行的代碼行號(hào),獲取所述文件中已執(zhí)行代碼的行數(shù);
根據(jù)所述已執(zhí)行代碼的行數(shù)Le和所述總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到所述文件當(dāng)前的覆蓋率R。
可選的,所述處理模塊12具體用于:
對(duì)所述源代碼文件進(jìn)行解析處理,剔除所述源代碼文件中的空白行和注釋行,得到所述源代碼文件的所述總代碼行數(shù)。
本實(shí)施例提供的覆蓋率檢測(cè)裝置,用來(lái)執(zhí)行前述任一實(shí)施例提供的方法中覆蓋率檢測(cè)端(上述的覆蓋率服務(wù)器)的技術(shù)方案,其實(shí)現(xiàn)原理和技術(shù)效果類似,在此不再贅述。
圖7為本發(fā)明實(shí)施例提供的覆蓋率檢測(cè)裝置實(shí)施例三的結(jié)構(gòu)示意圖,如圖7所示,該覆蓋率檢測(cè)裝置20包括:
處理模塊21,用于在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作;
若是,則所述處理模塊21還用于獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件;
發(fā)送模塊22,用于將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
可選的,所述處理模塊21還用于:
將存儲(chǔ)的所述文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù)和源代碼文件更新為重新獲取的所述執(zhí)行數(shù)據(jù)和源代碼文件進(jìn)行存儲(chǔ);所述執(zhí)行數(shù)據(jù)包括所述文件的文件名稱和所述文件被執(zhí)行的代碼行號(hào)。
可選的,所述處理模塊21還用于:
啟動(dòng)采集線程,調(diào)用數(shù)據(jù)收集函數(shù)獲取所述文件的執(zhí)行數(shù)據(jù),并啟動(dòng)熱更新操作監(jiān)控線程。
可選的,所述處理模塊21執(zhí)行的熱更新操作包括以下至少一種操作:
對(duì)所述文件的程序代碼進(jìn)行修改;
對(duì)所述文件的程序代碼進(jìn)行移動(dòng);
對(duì)所述文件的程序代碼進(jìn)行刪除。
本實(shí)施例提供的覆蓋率檢測(cè)裝置,用來(lái)執(zhí)行前述任一實(shí)施例提供的方法中程序運(yùn)行側(cè)的技術(shù)方案,其實(shí)現(xiàn)原理和技術(shù)效果類似,在此不再贅述。
圖8為本發(fā)明實(shí)施例提供的服務(wù)器實(shí)施例一的結(jié)構(gòu)示意圖,如圖8所示,該服務(wù)器可以被具體實(shí)現(xiàn)為:存儲(chǔ)有程序指令的存儲(chǔ)器31、接收器32以及用于控制程序指令執(zhí)行的處理器33;
所述接收器32用于接收服務(wù)器發(fā)送的文件的程序熱更新數(shù)據(jù);所述程序熱更新數(shù)據(jù)為所述服務(wù)器在檢測(cè)到對(duì)所述文件執(zhí)行熱更新操作之后調(diào)用數(shù)據(jù)收集函數(shù)重新獲取的執(zhí)行數(shù)據(jù)和所述文件執(zhí)行熱更新操作之后的源代碼文件;
所述處理器33用于:
解析獲取所述源代碼文件的總代碼行數(shù);
根據(jù)所述執(zhí)行數(shù)據(jù)和所述總代碼行數(shù),計(jì)算獲取所述文件當(dāng)前的覆蓋率。
可選的,還可以包括顯示器,用于顯示所述文件當(dāng)前的所述覆蓋率。
可選的,所述程序執(zhí)行數(shù)據(jù)包括所述服務(wù)器執(zhí)行的所述文件被執(zhí)行的代碼行號(hào),所述處理器33具體用于:
根據(jù)所述被執(zhí)行的代碼行號(hào),獲取所述文件中已執(zhí)行代碼的行數(shù);
根據(jù)所述已執(zhí)行代碼的行數(shù)Le和所述總代碼行數(shù)Lt,采用R=Le/Lt計(jì)算得到所述文件當(dāng)前的覆蓋率R。
可選的,所述程序執(zhí)行數(shù)據(jù)包括所述游戲服務(wù)器執(zhí)行的所述文件的文件名稱,則所述處理器33還用于:
對(duì)所述源代碼文件進(jìn)行解析處理,剔除所述源代碼文件中的空白行和注釋行,得到所述源代碼文件的所述總代碼行數(shù)。
本實(shí)施例提供的服務(wù)器為覆蓋檢測(cè)端的服務(wù)器,用來(lái)執(zhí)行前述任一實(shí)施例提供的方法中覆蓋率檢測(cè)端的技術(shù)方案,其實(shí)現(xiàn)原理和技術(shù)效果類似,在此不再贅述。
圖9為本發(fā)明實(shí)施例提供的服務(wù)器實(shí)施例二的結(jié)構(gòu)示意圖,如圖9所示,該服務(wù)器可以被具體實(shí)現(xiàn)為:用于存儲(chǔ)程序指令的存儲(chǔ)器41、用于控制程序指令執(zhí)行的處理器42以及發(fā)送器43;
所述處理器42用于:
在將文件的執(zhí)行數(shù)據(jù)發(fā)送至覆蓋率服務(wù)端之前,檢測(cè)所述文件的程序代碼是否被執(zhí)行熱更新操作;
若是,則獲取所述文件的程序熱更新數(shù)據(jù);其中,所述程序熱更新數(shù)據(jù)為調(diào)用數(shù)據(jù)收集函數(shù)重新獲取所述文件的執(zhí)行數(shù)據(jù)和獲取的所述文件執(zhí)行熱更新操作之后的源代碼文件;
所述發(fā)送器43用于將所述程序熱更新數(shù)據(jù)發(fā)送給覆蓋率服務(wù)端,以使所述覆蓋率服務(wù)端根據(jù)所述程序熱更新數(shù)據(jù)獲取所述文件當(dāng)前的覆蓋率。
可選的,所述處理器42還用于:將存儲(chǔ)的所述文件對(duì)應(yīng)的執(zhí)行數(shù)據(jù)和源代碼文件更新為重新獲取的所述執(zhí)行數(shù)據(jù)和源代碼文件進(jìn)行存儲(chǔ);所述執(zhí)行數(shù)據(jù)包括所述文件的文件名稱和所述文件被執(zhí)行的代碼行號(hào)。
可選的,所述處理器42還用于:
啟動(dòng)采集線程,調(diào)用數(shù)據(jù)收集函數(shù)獲取所述文件的執(zhí)行數(shù)據(jù),并啟動(dòng)熱更新操作監(jiān)控線程。
可選的,所述處理器42執(zhí)行的熱更新操作包括以下至少一種操作:
對(duì)所述文件的程序代碼進(jìn)行修改;
對(duì)所述文件的程序代碼進(jìn)行移動(dòng);
對(duì)所述文件的程序代碼進(jìn)行刪除。
本實(shí)施例提供的服務(wù)器為文件運(yùn)行服務(wù)器,或者稱為程序運(yùn)行服務(wù)器,用來(lái)執(zhí)行前述任一實(shí)施例提供的方法中文件代碼運(yùn)行側(cè)(例如游戲服務(wù)器)的技術(shù)方案,其實(shí)現(xiàn)原理和技術(shù)效果類似,在此不再贅述。
在上述任一服務(wù)器的實(shí)施例中,應(yīng)理解,處理器可以是中央處理單元(英文:Central Processing Unit,簡(jiǎn)稱:CPU),還可以是其他通用處理器、數(shù)字信號(hào)處理器(英文:Digital Signal Processor,簡(jiǎn)稱:DSP)、專用集成電路(英文:Application Specific Integrated Circuit,簡(jiǎn)稱:ASIC)等。通用處理器可以是微處理器或者該處理器也可以是任何常規(guī)的處理器等。結(jié)合本發(fā)明實(shí)施例所公開的方法的步驟可以直接體現(xiàn)為硬件處理器執(zhí)行完成,或者用處理器中的硬件及軟件模塊組合執(zhí)行完成。
本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述各方法實(shí)施例的全部或部分步驟可以通過(guò)程序指令相關(guān)的硬件來(lái)完成。前述的程序可以存儲(chǔ)于一計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。該程序在執(zhí)行時(shí),執(zhí)行包括上述各方法實(shí)施例的步驟;而前述的存儲(chǔ)介質(zhì)包括:只讀存儲(chǔ)器(英文:read-only memory,縮寫:ROM)、RAM、快閃存儲(chǔ)器、硬盤、固態(tài)硬盤、磁帶(英文:magnetic tape)、軟盤(英文:floppy disk)、光盤(英文:optical disc)及其任意組合。
最后應(yīng)說(shuō)明的是:以上各實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述各實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。