本公開內(nèi)容的實(shí)施例一般性地涉及與計(jì)算設(shè)備有關(guān)的技術(shù)領(lǐng)域,并且更特別地涉及一種用于計(jì)算設(shè)備的方法和裝置。
背景技術(shù):
在計(jì)算設(shè)備的操作過程中,當(dāng)異常事件或意外情況發(fā)生時(shí),用戶或者系統(tǒng)可以進(jìn)行故障轉(zhuǎn)儲(chǔ)(crashdump)以保存有用的上下文信息。在故障轉(zhuǎn)儲(chǔ)中,用于故障轉(zhuǎn)儲(chǔ)的堆棧是故障轉(zhuǎn)儲(chǔ)的最重要的信息或簽名之一,并且指示了計(jì)算系統(tǒng)/進(jìn)程發(fā)生故障的直接原因。針對(duì)故障轉(zhuǎn)儲(chǔ)堆棧進(jìn)行堆棧幀的回溯可以給出導(dǎo)致了故障轉(zhuǎn)儲(chǔ)發(fā)生的唯一的調(diào)用代碼路徑的明確序列。
對(duì)于處在繁重測(cè)試之下的系統(tǒng)而言,可能會(huì)生成許多具有類似堆棧的故障轉(zhuǎn)儲(chǔ),并且可能經(jīng)常會(huì)需要確定新的故障轉(zhuǎn)儲(chǔ)是否與正在被分析或者已經(jīng)被分析過的其他故障轉(zhuǎn)儲(chǔ)有關(guān),從而能夠通過參考對(duì)其他故障轉(zhuǎn)儲(chǔ)的分析來避免重復(fù)的工作。
但是,這樣的確定通常并不是容易的事情,因?yàn)榧词故窃谟糜诠收限D(zhuǎn)儲(chǔ)的堆棧具有相似的代碼路徑時(shí),也幾乎不可能找到完全匹配的故障轉(zhuǎn)儲(chǔ)。這是因?yàn)楣收限D(zhuǎn)儲(chǔ)堆棧中總是存在許多差異或噪聲。對(duì)于一些其他的外部社區(qū)而言,情況也是這樣。例如,當(dāng)使用流行的具有強(qiáng)大搜索引擎(例如,谷歌、百度等)的網(wǎng)頁瀏覽器來搜索共同的完整linux/windows開源應(yīng)用或內(nèi)核故障轉(zhuǎn)儲(chǔ)堆棧時(shí),通常不能找到任何有用的結(jié)果。
在現(xiàn)有的解決方案中,因?yàn)槊總€(gè)個(gè)體的故障轉(zhuǎn)儲(chǔ)堆棧的完整文本通常包含許多噪聲信息,所以為了確定兩個(gè)故障轉(zhuǎn)儲(chǔ)之間的相似度,可能需要利用經(jīng)典的分類算法(例如,貝葉斯分類算法)來構(gòu)建專門 定制的全文搜索引擎。
然而,這種方法的缺點(diǎn)是它引入了許多噪聲(由于來自堆棧文本的變化部分),并且還丟失了堆棧中的調(diào)用次序信息。即使后者能夠通過考慮堆棧文本中的詞語的排序或次序來修改,但是如果故障轉(zhuǎn)儲(chǔ)的數(shù)目非常大,則計(jì)算成本也會(huì)相應(yīng)地增大。因?yàn)樾枰獙⒔o定的堆棧文本與所有的已有堆棧文件進(jìn)行比較。
此外,這種方法還引入了非常大的復(fù)雜度并且使其難以在資源有限的計(jì)算機(jī)工作站上實(shí)施和快速運(yùn)行。另外,按這種方法得出的相似度不能給出對(duì)與故障有關(guān)的問題的簡(jiǎn)單理解,因?yàn)樗鼉H算入了個(gè)體的詞語并且丟失了完整的上下文信息。
技術(shù)實(shí)現(xiàn)要素:
鑒于現(xiàn)有技術(shù)中存在的上述問題,本公開內(nèi)容的實(shí)施例的目的之一在于提供一種用于計(jì)算設(shè)備的方法和裝置,以解決現(xiàn)有技術(shù)中的上述以及其他的問題。
根據(jù)本公開內(nèi)容的第一方面,提供了一種用于計(jì)算設(shè)備的方法。該計(jì)算設(shè)備可以在每次發(fā)生故障時(shí)生成用于故障轉(zhuǎn)儲(chǔ)的堆棧,每個(gè)堆棧從底部到頂部可以包括多個(gè)堆棧幀,每個(gè)堆棧幀可以包括與故障有關(guān)的函數(shù)信息。該方法可以包括:從堆棧中的每個(gè)堆棧幀中提取相應(yīng)的函數(shù)名稱信息;基于每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀,以獲得堆棧的簡(jiǎn)化堆棧;以及基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度。
根據(jù)本公開的一些實(shí)施例,基于每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀可以包括:僅利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。
根據(jù)本公開的一些實(shí)施例,基于每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀可以包括:利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息和相應(yīng)的模塊名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。
根據(jù)本公開的一些實(shí)施例,該方法可以進(jìn)一步包括:從每個(gè)堆棧 幀中提取相應(yīng)的模塊名稱信息,或者通過查找每個(gè)堆棧幀中的函數(shù)地址信息來確定相應(yīng)的模塊名稱信息。
根據(jù)本公開的一些實(shí)施例,該方法可以進(jìn)一步包括:在相應(yīng)的簡(jiǎn)化堆棧幀中,在相應(yīng)的函數(shù)名稱信息與相應(yīng)的模塊名稱信息之間設(shè)置分隔符。
根據(jù)本公開的一些實(shí)施例,基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度包括:從簡(jiǎn)化堆棧底部的簡(jiǎn)化堆棧幀開始向頂部方向逐個(gè)地移除簡(jiǎn)化堆棧幀直到僅剩余頂部的簡(jiǎn)化堆棧幀,每移除一個(gè)簡(jiǎn)化堆棧幀生成一個(gè)子堆棧;以及基于故障的簡(jiǎn)化堆棧及其子堆棧之間的相似度來確定故障之間的相似度。
根據(jù)本公開的一些實(shí)施例,該方法進(jìn)一步包括:基于故障之間所共有的簡(jiǎn)化堆棧或者具有最多簡(jiǎn)化堆棧幀的子堆棧來確定故障之間的相似度。
根據(jù)本公開的一些實(shí)施例,該方法可以進(jìn)一步包括:針對(duì)多次故障中的每次故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧;以及形成多次故障的所有簡(jiǎn)化堆棧和所有子堆棧與多次故障之間的對(duì)應(yīng)關(guān)系表格。
根據(jù)本公開的一些實(shí)施例,基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度可以包括:針對(duì)新故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧;以及在對(duì)應(yīng)關(guān)系表格中查找新故障的簡(jiǎn)化堆棧及其子堆棧,以確定與新故障具有相同簡(jiǎn)化堆?;蜃佣褩5墓收?。
根據(jù)本公開的一些實(shí)施例,該方法可以進(jìn)一步包括:將新故障的不在對(duì)應(yīng)關(guān)系表格中的簡(jiǎn)化堆棧和子堆棧添加到對(duì)應(yīng)關(guān)系表格中。
根據(jù)本公開的一些實(shí)施例,該方法可以進(jìn)一步包括:使用哈希算法來形成對(duì)應(yīng)關(guān)系表格。
根據(jù)本公開內(nèi)容的第二方面,提供了一種用于計(jì)算設(shè)備的裝置。該計(jì)算設(shè)備可以在每次發(fā)生故障時(shí)生成用于故障轉(zhuǎn)儲(chǔ)的堆棧,每個(gè)堆棧從底部到頂部可以包括多個(gè)堆棧幀,每個(gè)堆棧幀可以包括與故障有關(guān)的函數(shù)信息。該裝置可以包括:提取單元,被配置為從堆棧中的每個(gè)堆棧幀中提取相應(yīng)的函數(shù)名稱信息;簡(jiǎn)化單元,被配置為基于每個(gè) 堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀,以獲得堆棧的簡(jiǎn)化堆棧;以及相似度確定單元,被配置為基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度。
根據(jù)本公開內(nèi)容的第三方面,提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),具有存儲(chǔ)在其上的計(jì)算機(jī)可讀程序指令,該計(jì)算機(jī)可讀程序指令用于執(zhí)行根據(jù)第一方面的方法。
根據(jù)本公開內(nèi)容的第四方面,提供了一種計(jì)算機(jī)系統(tǒng),包括根據(jù)第二方面的裝置。
本公開內(nèi)容的實(shí)施例提供了一種具有低復(fù)雜度的快速方式來確定給定的故障轉(zhuǎn)儲(chǔ)堆棧是否與另一故障轉(zhuǎn)儲(chǔ)堆棧具有較高的相似度,并且如果存在這樣的故障轉(zhuǎn)儲(chǔ)堆棧,則可以得出最佳的故障轉(zhuǎn)儲(chǔ)列表,而排除故障轉(zhuǎn)儲(chǔ)堆棧中的差異或者噪聲的影響。
本公開內(nèi)容的實(shí)施例提出的方法是高效的并且其確定結(jié)果能夠更為準(zhǔn)確地給出對(duì)故障轉(zhuǎn)儲(chǔ)的之間的相似度。利用所提出的方法和裝置,能夠高效地找出相似的故障轉(zhuǎn)儲(chǔ)堆棧而無需針對(duì)要搜索的堆棧文本構(gòu)建定制的全文搜索引擎,并且通過按照故障轉(zhuǎn)儲(chǔ)堆棧中的原有堆棧幀的時(shí)間順序而逐個(gè)地刪除堆棧幀來形成多個(gè)子堆棧,從而所形成的子堆棧不會(huì)丟失原有堆棧幀中的關(guān)鍵時(shí)序信息。此外,故障之間的相似度能夠容易地被量化以篩選用于其他分析。
附圖說明
通過參考附圖閱讀下文的詳細(xì)描述,本公開內(nèi)容的實(shí)施例的上述以及其他目的、特征和優(yōu)點(diǎn)將變得容易理解。在附圖中,以示例性而非限制性的方式示出了本公開內(nèi)容的若干實(shí)施例,其中:
圖1示意性地示出了一種典型的由原始堆棧幀組成的用于故障轉(zhuǎn)儲(chǔ)的堆棧。
圖2示意性地示出了根據(jù)本公開內(nèi)容的實(shí)施例的方法的流程圖。
圖3示意性地示出了根據(jù)本公開內(nèi)容的實(shí)施例的裝置的框圖。
圖4示意性地示出了可以用來實(shí)現(xiàn)本公開內(nèi)容的實(shí)施例的示例性 計(jì)算機(jī)系統(tǒng)/服務(wù)器的框圖。
具體實(shí)施方式
下面將參考附圖中所示出的若干示例性實(shí)施例來描述本公開內(nèi)容的原理和精神。應(yīng)當(dāng)理解,描述這些具體的實(shí)施例僅是為了使本領(lǐng)域的技術(shù)人員能夠更好地理解并實(shí)現(xiàn)本公開,而并非以任何方式限制本公開內(nèi)容的范圍。
圖1示意性地示出了一種典型的由原始堆棧幀組成的故障轉(zhuǎn)儲(chǔ)堆棧100。如上文所提到的,在發(fā)生故障轉(zhuǎn)儲(chǔ)時(shí),用于故障轉(zhuǎn)儲(chǔ)的堆棧是故障轉(zhuǎn)儲(chǔ)的最重要的信息或簽名之一,并且指示了計(jì)算系統(tǒng)/進(jìn)程發(fā)生故障的直接原因。針對(duì)故障轉(zhuǎn)儲(chǔ)堆棧進(jìn)行堆棧幀的回溯可以給出導(dǎo)致了故障轉(zhuǎn)儲(chǔ)發(fā)生的唯一的調(diào)用代碼路徑的明確序列。
如圖1中所示出的,示例性的故障轉(zhuǎn)儲(chǔ)堆棧100從底部到頂部可以包括編號(hào)#31至#0的原始堆棧幀,每個(gè)原始堆棧幀中可以包括與故障有關(guān)的函數(shù)信息。例如,編號(hào)為#0的堆棧幀包括與故障有關(guān)的函數(shù)raise的相關(guān)信息。為了清楚的原因,圖1中僅示例性地示出了原始堆棧幀#0至#5以及#28至#31,并且省略了編號(hào)為#6至#27的原始堆棧幀。本領(lǐng)域的技術(shù)人員可以理解,編號(hào)為#6至#27的原始堆棧幀可以與所示出的原始堆棧幀具有相類似的結(jié)構(gòu)和內(nèi)容。
原始的故障轉(zhuǎn)儲(chǔ)堆棧100可以給出與故障堆棧代碼路徑有關(guān)的完全細(xì)節(jié)信息,但是通過它難以發(fā)現(xiàn)許多故障轉(zhuǎn)儲(chǔ)的堆棧之間的相似度,因?yàn)槎褩;厮莸拿總€(gè)堆棧幀中包含的大部分內(nèi)容在每次對(duì)程序/進(jìn)程進(jìn)行編譯、加載和分析時(shí)總是會(huì)發(fā)生變化。例如,故障轉(zhuǎn)儲(chǔ)堆棧100中包括帶下劃線的部分,這些部分與堆棧幀的地址相關(guān)并且在每次進(jìn)行模塊加載時(shí)可能會(huì)變化,代碼行和目錄信息在每個(gè)實(shí)時(shí)系統(tǒng)或者排錯(cuò)系統(tǒng)上下文中都可能會(huì)變化。
在進(jìn)行與計(jì)算設(shè)備的有關(guān)操作中,可能經(jīng)常會(huì)需要確定新的故障轉(zhuǎn)儲(chǔ)是否與正在被分析或者已經(jīng)被分析過的其他故障轉(zhuǎn)儲(chǔ)之間具有較高的相似度,從而能夠通過參考對(duì)其他故障轉(zhuǎn)儲(chǔ)的分析來避免重復(fù) 的工作。這就需要一種高效而簡(jiǎn)單的方式以在可能生成許多故障轉(zhuǎn)儲(chǔ)(例如,百萬級(jí))的大產(chǎn)出系統(tǒng)中找出相似的故障轉(zhuǎn)儲(chǔ)堆棧,并且找出相似度最高的故障轉(zhuǎn)儲(chǔ)堆棧同時(shí)結(jié)果能夠容易地被理解。
從算法的視角來看,這是一種純文本的相似度計(jì)算問題。通常,搜索引擎或者類似工具能夠被用來首先根據(jù)文本中的詞語來對(duì)堆棧文本進(jìn)行索引,并且然后在搜索給定的堆棧文本的過程中計(jì)算給定的堆棧文本的詞語矢量與所有其他故障轉(zhuǎn)儲(chǔ)堆棧的詞語矢量之間的余弦相似度。如前文所論述的,現(xiàn)有技術(shù)中的方法存在各種缺陷。
本公開內(nèi)容的各種實(shí)施例提供了一種具有低復(fù)雜度的快速方式來確定給定的故障轉(zhuǎn)儲(chǔ)堆棧是否與另一故障轉(zhuǎn)儲(chǔ)堆棧具有較高的相似度,并且如果存在這樣的故障轉(zhuǎn)儲(chǔ)堆棧,則可以得出最佳的故障轉(zhuǎn)儲(chǔ)列表,而排除故障轉(zhuǎn)儲(chǔ)堆棧中的差異或者噪聲的影響。
本公開內(nèi)容的各個(gè)實(shí)施例提出的方法是高效的并且其確定結(jié)果能夠體現(xiàn)出對(duì)故障轉(zhuǎn)儲(chǔ)的良好見解。利用所提出的方法,能夠高效地找出相似的故障轉(zhuǎn)儲(chǔ)堆棧而無需針對(duì)要搜索的堆棧文本構(gòu)建定制的全文搜索引擎。
圖2示意性地示出了根據(jù)本公開內(nèi)容的實(shí)施例的方法200的流程圖。在一些實(shí)施例中,方法200可以用于計(jì)算設(shè)備,該計(jì)算設(shè)備在每次發(fā)生故障時(shí)可以生成用于故障轉(zhuǎn)儲(chǔ)的堆棧,每個(gè)堆棧從底部到頂部可以包括多個(gè)堆棧幀,每個(gè)堆棧幀可以包括與故障有關(guān)的函數(shù)信息。在一些實(shí)施例中,方法200的執(zhí)行主體可以是與計(jì)算設(shè)備有關(guān)的實(shí)體。在一些特定的實(shí)施例中,方法200的執(zhí)行主體可以是稍后結(jié)合附圖3所描述的裝置300。
如圖2中所示出的,方法200在開始之后可以進(jìn)入步驟201。在步驟201中,方法200的執(zhí)行主體可以從堆棧中的每個(gè)堆棧幀中提取相應(yīng)的函數(shù)名稱信息。
在特定的實(shí)施例中,可以選擇引起故障轉(zhuǎn)儲(chǔ)的原始堆棧幀并且將堆棧幀進(jìn)行如下的處理。首先,從每個(gè)原始堆棧幀中去除總是發(fā)生變化且不太重要的信息,而僅保留每個(gè)原始堆棧幀的函數(shù)名稱信息。例 如,這些可去除的信息可以包括:原始堆棧中的數(shù)字,諸如函數(shù)地址,它們?cè)诿看文K加載時(shí)將會(huì)改變,以及利用不同上下文的運(yùn)行時(shí)間傳遞的參數(shù),以及編譯時(shí)間期間的源代碼目錄和行信息,等等。
在一些具體的示例性實(shí)施例中,針對(duì)附圖1中所示出的堆棧100,可以從編號(hào)為#0-#5的堆棧幀中分別提取出相應(yīng)的函數(shù)名稱信息:raise、abort、csx_rt_proc_do_abort、csx_rt_assert_int_take_user_space_panic_action、csx_rt_assert_request_panic_with_info、emcpalbugcheck。進(jìn)一步地,可以從編號(hào)為#28-#31的堆棧幀中分別提取出相應(yīng)的函數(shù)名稱信息:csx_rt_cpi_thread_command、csx_rt_sked_thread_wrapper、start_thread、clone。
接著,方法200可以進(jìn)入步驟202。在步驟202中,方法200的執(zhí)行主體可以基于每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀,以獲得堆棧的簡(jiǎn)化堆棧。
在一些實(shí)施例中,可以僅利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。本領(lǐng)域的技術(shù)人員可以理解,在故障轉(zhuǎn)儲(chǔ)堆棧的堆棧幀中,與故障有關(guān)的函數(shù)名稱信息可以較好地體現(xiàn)兩次故障之間的關(guān)聯(lián)性。因此,在方法200的一種簡(jiǎn)單的實(shí)施方式中,可以僅使用每個(gè)堆棧幀中所包含的函數(shù)名稱信息來形成每個(gè)堆棧幀的簡(jiǎn)化堆棧幀,保留故障轉(zhuǎn)儲(chǔ)堆棧中的各個(gè)堆棧幀的原有時(shí)序,使用各個(gè)堆棧幀的相應(yīng)簡(jiǎn)化堆棧幀得出故障堆棧的簡(jiǎn)化堆棧。
在另一些實(shí)施例中,也可以利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息和相應(yīng)的模塊名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。然后,通過保留故障轉(zhuǎn)儲(chǔ)堆棧中的各個(gè)堆棧幀的原有時(shí)序,使用各個(gè)堆棧幀的相應(yīng)簡(jiǎn)化堆棧幀得出故障堆棧的簡(jiǎn)化堆棧。在這些實(shí)施例中,簡(jiǎn)化堆棧幀中除了包括函數(shù)名稱信息之外,還可以包括相應(yīng)的模塊名稱信息。這經(jīng)常是有用的,因?yàn)橄嗤暮瘮?shù)可能靜態(tài)地聯(lián)系到不同的模塊,并且區(qū)分是哪個(gè)模塊在堆棧中存在問題可能是有利的。
可以使用不同的方式來獲得與故障函數(shù)相關(guān)聯(lián)的模塊名稱信息。在一些實(shí)施例中,如果堆棧幀中包括了相關(guān)的模塊名稱信息,則方法 200可以包括:從每個(gè)堆棧幀中提取相應(yīng)的模塊名稱信息。
如果模塊名稱信息不能從堆棧幀中得到,這通常是對(duì)于校驗(yàn)/排錯(cuò)版本構(gòu)建的情況。在一些實(shí)施例中,可以通過查找每個(gè)堆棧幀中的函數(shù)地址信息來確定相應(yīng)的模塊名稱信息。具體而言,能夠通過在用于該模塊的故障轉(zhuǎn)儲(chǔ)地址中查找函數(shù)地址,然后從一些其他來源的中推導(dǎo)出該函數(shù)地址屬于哪個(gè)模塊。
在一個(gè)具體的示例性實(shí)施例中,對(duì)于圖1中所示出的堆棧幀#2,可以看出其函數(shù)地址為0x00007f6f74ac04d7并且其函數(shù)名稱信息為csx_rt_proc_do_abort?;谶@些信息,通過對(duì)所有的故障轉(zhuǎn)儲(chǔ)地址空間進(jìn)行故障轉(zhuǎn)儲(chǔ),能夠確定該函數(shù)地址0x00007f6f74ac04d7落在范圍0x00007f6f74a13cc0-0x00007f6f74b5bab8中。通過查詢可知,該范圍是csx_urt.so的.text區(qū)域。這一過程可以用代碼表示如下。
(gdb)infofiles
symbolsfrom“/disks/usd_dumps15/ars/0564000-0564999/564217/10-11-2013/emc/csx/ubin64/csx_ic_std.x”.
localcoredumpfile:
‘/tmp/abcdt/a/564217-spa_fnm00131203264_2013-10-11_17_14_08_8666/safe_dump_spa_fnm00131203264_2013-10-11_17_14_08_8666_safe’,filetypeelf64-x86-64.
0x0000000000400000-0x0000000000404000isload1
0x0000000000603000-0x0000000000604000isload2
…
0x00007f6f74a111a8-0x00007f6f74a13cb8is.pltin/tmp/abcdt/a/564217-spa_fnm00131203264_2013-10-11_17_14_08_8666/emc/csx/ulib64/csx_urt.so
0x00007f6f74a13cc0-0x00007f6f74b5bab8is.textin/tmp/abcdt/a/564217-spa_fnm00131203264_2013-10-11_17_14_08_8666/emc/csx/ulib64/csx_urt.so
0x00007f6f74b5bac0-0x00007f6f74b5bdf1iscsx_gx_rtin/tmp/abcdt/a/564217-spa_fnm00131203264_2013-10-11_17_14_08_8666/emc/csx/ulib64/csx_urt.so
…
在這個(gè)示例性實(shí)施例中,經(jīng)過上面的查詢過程,能夠得出與故障相關(guān)的函數(shù)的模塊名稱是csx_urt.so,該模塊名稱信息可以與函數(shù)名稱信息csx_rt_proc_do_abort一起來形成相應(yīng)的簡(jiǎn)化堆棧幀。
為了更好地區(qū)分出函數(shù)名稱信息和模塊名稱信息,在一些實(shí)施例中,在相應(yīng)的簡(jiǎn)化堆棧幀中,在相應(yīng)的函數(shù)名稱信息與相應(yīng)的模塊名稱信息之間可以設(shè)置分隔符。例如,在一種具體的實(shí)現(xiàn)中,可以使用符號(hào)“!”來作為分隔符。本領(lǐng)域的技術(shù)人員可以理解,其他任何不會(huì)引起混淆的符號(hào)都可以被使用作為相應(yīng)的函數(shù)名稱信息與相應(yīng)的模塊名稱信息之間的分隔符。
在使用“!”作為分隔符的實(shí)施例中,通過利用函數(shù)名稱信息和模塊名稱信息,圖1中所示出的編號(hào)為#2的堆棧幀能夠被簡(jiǎn)化成為如下的形式:csx_urt.so!csx_rt_proc_do_abort。本領(lǐng)域的技術(shù)人員可以理解,該具體形式僅為一種示例,本領(lǐng)域的技術(shù)人員可以通過調(diào)整信息的前后順序、使用不同的分隔符、或者添加其他的可變或者固定信息來形成各種不同的簡(jiǎn)化堆棧幀。
在一個(gè)實(shí)施例中,針對(duì)圖1中所示出的堆棧進(jìn)行方法200的步驟201和202之后,可以得出下面所示出的簡(jiǎn)化版本的新堆棧文本。它清楚地示出了故障轉(zhuǎn)儲(chǔ)的堆棧中所涉及到的函數(shù)和模塊。另外,從實(shí)踐的角度來看,方法200的步驟201-202能夠通過一些自動(dòng)化工具/腳本來進(jìn)行。
libc.so.6!raise
libc.so.6!abort
csx_urt.so!csx_rt_proc_do_abort
csx_urt.so!csx_rt_assert_int_take_user_space_panic_action
csx_urt.so!csx_rt_assert_request_panic_with_info
emcpal.sys!emcpalbugcheck
……
csx_urt.so!csx_rt_cpi_thread_command
csx_urt.so!csx_rt_sked_thread_wrapper
libpthread.so.0!start_thread
libc.so.6!clone
接著,方法200可以進(jìn)入步驟203。在步驟203中,方法200的執(zhí)行主體可以基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度。
本領(lǐng)域的技術(shù)人員可以理解,故障之間的相似度可以通過故障的轉(zhuǎn)儲(chǔ)堆棧之間的相似度來體現(xiàn),而故障轉(zhuǎn)儲(chǔ)的堆棧包括多個(gè)堆棧幀。這些堆棧幀經(jīng)過簡(jiǎn)化之后,已經(jīng)去除了總是變化的噪聲信息,而保留了更為關(guān)鍵的函數(shù)名稱信息和/或模塊名稱信息。因此,在一些實(shí)施例中,可以通過直接比較兩個(gè)故障的簡(jiǎn)化堆棧之間的相似簡(jiǎn)化堆棧幀的數(shù)目,來確定故障之間的相似度。
此外,本領(lǐng)域的技術(shù)人員可以意識(shí)到,故障轉(zhuǎn)儲(chǔ)的堆棧中的堆棧幀具有時(shí)間上的先后順序,因此在確定故障之間的相似度時(shí)將堆棧幀之間的先后關(guān)系納入考慮能夠更好地體現(xiàn)兩次故障之間的相似度。
因此,在一些實(shí)施例中,可以從簡(jiǎn)化堆棧底部的簡(jiǎn)化堆棧幀開始向頂部方向逐個(gè)地移除簡(jiǎn)化堆棧幀直到僅剩余頂部的簡(jiǎn)化堆棧幀,每移除一個(gè)簡(jiǎn)化堆棧幀生成一個(gè)子堆棧;并且基于故障的簡(jiǎn)化堆棧及其子堆棧之間的相似度來確定故障之間的相似度。
這樣做的益處在于,這些子堆??梢员3侄褩V械拇涡蛐畔?,因?yàn)檎{(diào)用次序是導(dǎo)致轉(zhuǎn)儲(chǔ)的代碼路徑的關(guān)鍵分支。如果有問題的代碼的某個(gè)部分能夠被來自相同/不同模塊的不同上層代碼調(diào)用,則從問題代碼之后,它們將很可能導(dǎo)致具有完全相同的子堆棧的相似堆棧。例如,上面所示出的經(jīng)簡(jiǎn)化的堆棧能夠具有以下的子堆棧。
子堆棧-0(substack-0):<即為簡(jiǎn)化堆棧本身>
libc.so.6!raise
libc.so.6!abort
csx_urt.so!csx_rt_proc_do_abort
csx_urt.so!csx_rt_assert_int_take_user_space_panic_action
csx_urt.so!csx_rt_assert_request_panic_with_info
emcpal.sys!emcpalbugcheck
……
csx_urt.so!csx_rt_cpi_thread_command
csx_urt.so!csx_rt_sked_thread_wrapper
libpthread.so.0!start_thread
libc.so.6!clone
子堆棧-1(substack-1):
libc.so.6!raise
libc.so.6!abort
csx_urt.so!csx_rt_proc_do_abort
csx_urt.so!csx_rt_assert_int_take_user_space_panic_action
csx_urt.so!csx_rt_assert_request_panic_with_info
emcpal.sys!emcpalbugcheck
……
csx_urt.so!csx_rt_cpi_thread_command
csx_urt.so!csx_rt_sked_thread_wrapper
libpthread.so.0!start_thread
子堆棧-2(substack-2):
libc.so.6!raise
libc.so.6!abort
csx_urt.so!csx_rt_proc_do_abort
csx_urt.so!csx_rt_assert_int_take_user_space_panic_action
csx_urt.so!csx_rt_assert_request_panic_with_info
emcpal.sys!emcpalbugcheck
……
csx_urt.so!csx_rt_cpi_thread_command
csx_urt.so!csx_rt_sked_thread_wrapper
…
…
子堆棧-29(substack-29):
libc.so.6!raise
libc.so.6!abort
csx_urt.so!csx_rt_proc_do_abort
子堆棧-30(substack-30):
libc.so.6!raise
libc.so.6!abort
子堆棧-31(substack-31):
libc.so.6!raise
在一些特定的實(shí)施例中,兩個(gè)故障之間的相似度可以由它們的故障轉(zhuǎn)儲(chǔ)堆棧共有的具有最多堆棧幀的子堆棧中的堆棧幀數(shù)目來確定。在另一種情況中,有可能兩個(gè)故障之間具有完全相同的簡(jiǎn)化堆棧幀。因此,可以基于故障之間所共有的簡(jiǎn)化堆棧或者具有最多簡(jiǎn)化堆棧幀的子堆棧來確定故障之間的相似度。
在一些實(shí)施例中,可以針對(duì)多次故障中的每次故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧,并且形成多次故障的所有簡(jiǎn)化堆棧和所有子堆棧與多次故障之間的對(duì)應(yīng)關(guān)系表格。
本領(lǐng)域的技術(shù)人員可以理解,在形成了這樣的對(duì)應(yīng)關(guān)系表格之 后,就可以方便地通過查詢?cè)摫砀駚泶_定子堆棧與故障(即故障轉(zhuǎn)儲(chǔ))之間的對(duì)應(yīng)關(guān)系,從而可以快速地確定任意兩個(gè)故障之間具有多少相同或相似的子堆棧,并且可以確定任意兩個(gè)故障所共有的具有最多堆棧幀的子堆棧,從而確定相似度。在一些特定的實(shí)施例中,可以使用哈希算法來形成該對(duì)應(yīng)關(guān)系表格,以便于針對(duì)數(shù)量龐大的故障轉(zhuǎn)儲(chǔ)快速地形成該對(duì)應(yīng)關(guān)系表格。
因此,在一些實(shí)施例中,可以針對(duì)新故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧,并且在對(duì)應(yīng)關(guān)系表格中查找新故障的簡(jiǎn)化堆棧及其子堆棧,以確定與新故障具有相同簡(jiǎn)化堆棧或子堆棧的故障。
此外,可以將新故障的不在對(duì)應(yīng)關(guān)系表格中的簡(jiǎn)化堆棧和子堆棧添加到對(duì)應(yīng)關(guān)系表格中。因此,該對(duì)應(yīng)關(guān)系表格可以隨著故障數(shù)目的增長(zhǎng)而不斷被擴(kuò)充,從而后來發(fā)生的故障找到先前發(fā)生的相似故障的可能性將會(huì)增加。
在一種具體的實(shí)施方式中,可以首先將簡(jiǎn)化堆棧分解為子堆棧,并且可以利用列表或數(shù)組的哈希對(duì)所準(zhǔn)備的堆棧及其子堆棧進(jìn)行哈希。此外,可以將故障轉(zhuǎn)儲(chǔ)的標(biāo)記附加到具有相同堆棧或子堆棧的哈希列表或數(shù)組。故障轉(zhuǎn)儲(chǔ)標(biāo)記可以是具有某個(gè)時(shí)間戳的故障轉(zhuǎn)儲(chǔ)名稱或者用以唯一識(shí)別故障轉(zhuǎn)儲(chǔ)的序列號(hào)信息。
然后,可以對(duì)所有故障轉(zhuǎn)儲(chǔ)的子堆棧進(jìn)行哈希以將所有的故障轉(zhuǎn)儲(chǔ)基于它們的故障轉(zhuǎn)儲(chǔ)標(biāo)記歸組為哈希表格。這僅需要在系統(tǒng)首次啟動(dòng)時(shí)進(jìn)行一次,在此之后僅需要將新產(chǎn)生的故障轉(zhuǎn)儲(chǔ)添加到哈希表格中。該過程可以通過perl語言表示如下。
%stack_hash;
$stack_hash{$each_sub_stack}=[dump_1,dump_2,…]
通過循環(huán)經(jīng)過所有的轉(zhuǎn)儲(chǔ),對(duì)于具有子堆棧0到子堆棧n的特定轉(zhuǎn)儲(chǔ)而言的示例性哈希列表能夠被描述如下。
如該表格所示出的,子堆棧中的堆棧數(shù)目越少,越多的各種轉(zhuǎn)儲(chǔ)將會(huì)與之相聯(lián)系。因此,如果不能找到完全相同的堆棧,則可以找到部分相同(即,具有相同的子堆棧)的堆棧,其相比于完全堆棧而言具有共有相同的部分代碼路徑的較少數(shù)目的堆棧。
此外,從工程上的角度來考慮,該查詢過程可以停止在可能認(rèn)為已經(jīng)足夠的某些點(diǎn)處。例如,可以停止在大多數(shù)時(shí)間共享相同的代碼路徑的某個(gè)已知的函數(shù)處。
一旦生成了新的轉(zhuǎn)儲(chǔ),可以首先在哈希表格中查找其簡(jiǎn)化的堆棧,以查看是否任何其他的(多個(gè))轉(zhuǎn)儲(chǔ)共有完全相同的簡(jiǎn)化堆棧。如果沒有,則可以從簡(jiǎn)化堆棧的頂部開始查找它的子堆棧。如此,最佳匹配堆棧能夠由具有相匹配的具有最多數(shù)目堆棧子幀的子堆棧來定義,并且還能夠以這種方式選出排序靠前的相似故障轉(zhuǎn)儲(chǔ)。
通過將子堆棧視為具有次序上下文的不可分的塊,可以對(duì)所選擇的相似堆棧的相似度具有更好的體現(xiàn)。此外,通過所附加的模塊名稱信息,可以識(shí)別所牽涉的模塊并且可以為自動(dòng)分診定義分診規(guī)則。
隨著子堆棧具有更多數(shù)目的匹配堆棧幀,則它們具有更多相同的代碼路徑,即共享轉(zhuǎn)儲(chǔ)堆棧之間的更多相似性。因此,匹配的代碼路徑的比率可以用來量化該相似性。此外,這些哈希列表結(jié)果能夠容易地被保存并且重新加載到存儲(chǔ)器中以用于快速查找,以便確定是否任何新生成的轉(zhuǎn)儲(chǔ)具有準(zhǔn)確相同或者相似的堆棧。
圖3示意性地示出了根據(jù)本公開內(nèi)容的實(shí)施例的裝置300的框圖。在一些實(shí)施例中,裝置300可以用于計(jì)算設(shè)備,該計(jì)算設(shè)備在每次發(fā)生故障時(shí)可以生成用于故障轉(zhuǎn)儲(chǔ)的堆棧,每個(gè)堆棧從底部到頂部可以包括多個(gè)堆棧幀,每個(gè)堆棧幀可以包括與故障有關(guān)的函數(shù)信息。在圖3中,使用虛線框來表示可選的單元。
本領(lǐng)域的技術(shù)人員可以理解,圖3中僅示出了裝置300中的與本公開的實(shí)施例緊密相關(guān)的單元或組件,在具體的實(shí)踐中,裝置300可 以包括使其能夠正常操作的其他功能單元或組件。此外,本領(lǐng)域的技術(shù)人員還可以理解,裝置300的各個(gè)單元之間可以存在必要的連接。
如圖3中所示出的,裝置300可以包括提取單元301、簡(jiǎn)化單元302和相似度確定單元303。在一些實(shí)施例中,提取單元301可以被配置為從所述堆棧中的每個(gè)堆棧幀中提取相應(yīng)的函數(shù)名稱信息;簡(jiǎn)化單元302可以被配置為基于每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀,以獲得堆棧的簡(jiǎn)化堆棧;以及相似度確定單元303可以被配置為基于故障的簡(jiǎn)化堆棧之間的相似度來確定故障之間的相似度。
在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為僅利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為利用每個(gè)堆棧幀的相應(yīng)的函數(shù)名稱信息和相應(yīng)的模塊名稱信息來形成相應(yīng)的簡(jiǎn)化堆棧幀。
在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為從每個(gè)堆棧幀中提取相應(yīng)的模塊名稱信息,或者通過查找每個(gè)堆棧幀中的函數(shù)地址信息來確定相應(yīng)的模塊名稱信息。在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為,在相應(yīng)的簡(jiǎn)化堆棧幀中,在所述相應(yīng)的函數(shù)名稱信息與所述相應(yīng)的模塊名稱信息之間設(shè)置分隔符。
在一些實(shí)施例中,裝置300可以進(jìn)一步包括子堆棧生成單元304。子堆棧生成單元304可以被配置為從簡(jiǎn)化堆棧底部的簡(jiǎn)化堆棧幀開始向頂部方向逐個(gè)地移除簡(jiǎn)化堆棧幀直到僅剩余頂部的簡(jiǎn)化堆棧幀,每移除一個(gè)簡(jiǎn)化堆棧幀生成一個(gè)子堆棧。在這些實(shí)施例中,相似度確定單元303可以進(jìn)一步被配置為基于故障的簡(jiǎn)化堆棧及其子堆棧之間的相似度來確定故障之間的相似度。
在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為基于故障之間所共有的簡(jiǎn)化堆棧或者具有最多簡(jiǎn)化堆棧幀的子堆棧來確定故障之間的相似度。
在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為針對(duì)多次故障中的每次故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧。在這些實(shí)施例 中,裝置300可以進(jìn)一步包括對(duì)應(yīng)關(guān)系表格形成單元305。對(duì)應(yīng)關(guān)系表格形成單元305可以被配置為形成多次故障的所有簡(jiǎn)化堆棧和所有子堆棧與多次故障之間的對(duì)應(yīng)關(guān)系表格。
在一些實(shí)施例中,簡(jiǎn)化單元302可以進(jìn)一步被配置為針對(duì)新故障來獲得相應(yīng)的簡(jiǎn)化堆棧及其子堆棧。在這些實(shí)施例中,相似度確定單元303可以進(jìn)一步被配置為在對(duì)應(yīng)關(guān)系表格中查找新故障的簡(jiǎn)化堆棧及其子堆棧,以確定與新故障具有相同簡(jiǎn)化堆棧或子堆棧的故障。
在一些實(shí)施例中,裝置300可以進(jìn)一步包括添加單元306。添加單元306可以被配置為將新故障的不在對(duì)應(yīng)關(guān)系表格中的簡(jiǎn)化堆棧和子堆棧添加到對(duì)應(yīng)關(guān)系表格中。
在一些實(shí)施例中,對(duì)應(yīng)關(guān)系表格形成單元305可以進(jìn)一步被配置為使用哈希算法來形成對(duì)應(yīng)關(guān)系表格。
此外,本領(lǐng)域的技術(shù)人員可以理解,由于本公開的實(shí)施例的方法實(shí)際上利用了故障轉(zhuǎn)儲(chǔ)堆棧包括代碼路徑的嚴(yán)格的依次序列,所以本公開內(nèi)容的實(shí)施例所提出的方法也能夠擴(kuò)展到其他具有嚴(yán)格依次順序的系列事件中,以快速地找到一連串事件是否類似于另一連串事件。廣義地進(jìn)行理解,本公開內(nèi)容的實(shí)施例中的每個(gè)堆棧幀即可以被視為是一個(gè)事件。
圖4示意性地示出了可以用來實(shí)現(xiàn)本公開內(nèi)容的實(shí)施例的示例性計(jì)算機(jī)系統(tǒng)/服務(wù)器412的框圖。應(yīng)當(dāng)注意,圖4中所示出的計(jì)算機(jī)系統(tǒng)/服務(wù)器412僅是一種示例,不對(duì)本公開內(nèi)容的實(shí)施方式的功能和使用范圍進(jìn)行任何限制。
如圖4中所示出的,計(jì)算機(jī)系統(tǒng)/服務(wù)器412以通用計(jì)算設(shè)備的形式表現(xiàn)。計(jì)算機(jī)系統(tǒng)/服務(wù)器412的組件可以包括但不限于:一個(gè)或者多個(gè)處理器或者處理單元416,系統(tǒng)存儲(chǔ)器428,連接不同系統(tǒng)組件(包括系統(tǒng)存儲(chǔ)器428和處理單元416)的總線418。
總線418表示幾類總線結(jié)構(gòu)中的一種或多種,包括存儲(chǔ)器總線或者存儲(chǔ)器控制器,外圍總線,圖形加速端口,處理器或者使用多種總線結(jié)構(gòu)中的任意總線結(jié)構(gòu)的局域總線。舉例來說,這些體系結(jié)構(gòu)包括 但不限于工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(isa)總線,微通道體系結(jié)構(gòu)(mac)總線,增強(qiáng)型isa總線、視頻電子標(biāo)準(zhǔn)協(xié)會(huì)(vesa)局域總線以及外圍組件互連(pci)總線。
計(jì)算機(jī)系統(tǒng)/服務(wù)器412典型地包括多種計(jì)算機(jī)系統(tǒng)可讀介質(zhì)。這些介質(zhì)可以是任何能夠被計(jì)算機(jī)系統(tǒng)/服務(wù)器412訪問的可用介質(zhì),包括易失性和非易失性介質(zhì),可移除的和不可移除的介質(zhì)。
系統(tǒng)存儲(chǔ)器428可以包括易失性存儲(chǔ)器形式的計(jì)算機(jī)系統(tǒng)可讀介質(zhì),例如,存儲(chǔ)器430和/或緩存器432。計(jì)算機(jī)系統(tǒng)/服務(wù)器412可以進(jìn)一步包括其他可移除/不可移除的、易失性/非易失性計(jì)算機(jī)系統(tǒng)存儲(chǔ)介質(zhì)。盡管圖4中未示出,但是可以提供用于對(duì)可移除非易失性磁盤(例如“軟盤”)讀寫的磁盤,以及對(duì)可移除非易失性光盤(例如cd-rom、dvd-rom或者其他光介質(zhì))讀寫的光盤。在這些情況下,每個(gè)磁盤可以通過一個(gè)或者多個(gè)數(shù)據(jù)介質(zhì)接口與總線418相連。存儲(chǔ)器428可以包括至少一個(gè)程序產(chǎn)品,該程序產(chǎn)品具有一組(例如至少一個(gè))程序模塊,這些程序模塊被配置以執(zhí)行本公開內(nèi)容的各實(shí)施方式的功能。
具有至少一個(gè)程序模塊442的程序/實(shí)用工具440,可以存儲(chǔ)在例如存儲(chǔ)器428中,這樣的程序模塊442包括但不限于:操作系統(tǒng)、一個(gè)或者多個(gè)應(yīng)用程序、其他程序模塊以及程序數(shù)據(jù),這些示例中的每一個(gè)或某種組合中可能包括網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)。程序模塊442通常執(zhí)行本公開內(nèi)容所描述的實(shí)施方式中的功能和/或方法。
根據(jù)需要,計(jì)算機(jī)系統(tǒng)/服務(wù)器412也可以與一個(gè)或多個(gè)外部設(shè)備(例如顯示設(shè)備424、存儲(chǔ)設(shè)備414等)通信,還可與一個(gè)或者多個(gè)使得用戶能與該計(jì)算機(jī)系統(tǒng)/服務(wù)器412交互的設(shè)備通信,和/或與使得該計(jì)算機(jī)系統(tǒng)/服務(wù)器412能與一個(gè)或多個(gè)其他計(jì)算設(shè)備進(jìn)行通信的任何設(shè)備(例如網(wǎng)卡,調(diào)制解調(diào)器等等)通信。這種通信可以通過輸入/輸出(i/o)接口422進(jìn)行。并且,計(jì)算機(jī)系統(tǒng)/服務(wù)器412還可以通過網(wǎng)絡(luò)適配器420與一個(gè)或者多個(gè)網(wǎng)絡(luò)(例如局域網(wǎng)(lan),廣域網(wǎng)(wan)和/或公共網(wǎng)絡(luò),例如因特網(wǎng))通信。如圖所示,網(wǎng) 絡(luò)適配器420通過總線418與計(jì)算機(jī)系統(tǒng)/服務(wù)器412的其他模塊通信。應(yīng)當(dāng)明白,盡管圖中未示出,可以結(jié)合計(jì)算機(jī)系統(tǒng)/服務(wù)器412使用其他硬件和/或軟件模塊,包括但不限于:微代碼、設(shè)備磁盤、冗余處理單元、外部磁盤驅(qū)動(dòng)陣列、raid系統(tǒng)、磁帶磁盤以及數(shù)據(jù)備份存儲(chǔ)系統(tǒng)等。
在對(duì)本公開內(nèi)容的實(shí)施例的描述中,術(shù)語“包括”及其類似用語應(yīng)當(dāng)理解為開放性包含,即“包括但不限于”。術(shù)語“基于”應(yīng)當(dāng)理解為“至少部分地基于”。術(shù)語“一個(gè)實(shí)施例”或“該實(shí)施例”應(yīng)當(dāng)理解為“至少一個(gè)實(shí)施例”。
應(yīng)當(dāng)注意,本公開內(nèi)容的實(shí)施例可以通過硬件、軟件或者軟件和硬件的結(jié)合來實(shí)現(xiàn)。硬件部分可以利用專用邏輯來實(shí)現(xiàn);軟件部分可以存儲(chǔ)在存儲(chǔ)器中,由適當(dāng)?shù)闹噶顖?zhí)行系統(tǒng),例如微處理器或者專用設(shè)計(jì)硬件來執(zhí)行。本領(lǐng)域的技術(shù)人員可以理解上述的設(shè)備和方法可以使用計(jì)算機(jī)可執(zhí)行指令和/或包含在處理器控制代碼中來實(shí)現(xiàn),例如在可編程的存儲(chǔ)器或者諸如光學(xué)或電子信號(hào)載體的數(shù)據(jù)載體上提供了這樣的代碼。
此外,盡管在附圖中以特定順序描述了本公開內(nèi)容的方法的操作,但是這并非要求或者暗示必須按照該特定順序來執(zhí)行這些操作,或是必須執(zhí)行全部所示的操作才能實(shí)現(xiàn)期望的結(jié)果。相反,流程圖中描繪的步驟可以改變執(zhí)行順序。附加地或備選地,可以省略某些步驟,將多個(gè)步驟組合為一個(gè)步驟執(zhí)行,和/或?qū)⒁粋€(gè)步驟分解為多個(gè)步驟執(zhí)行。還應(yīng)當(dāng)注意,根據(jù)本公開內(nèi)容的兩個(gè)或更多裝置的特征和功能可以在一個(gè)裝置中具體化。反之,上文描述的一個(gè)裝置的特征和功能可以進(jìn)一步劃分為由多個(gè)裝置來具體化。
雖然已經(jīng)參考若干具體實(shí)施例描述了本公開內(nèi)容,但是應(yīng)當(dāng)理解,本公開內(nèi)容不限于所公開的具體實(shí)施例。本公開內(nèi)容旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等效布置。