欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種棧解析方法和裝置與流程

文檔序號:12550301閱讀:149來源:國知局
一種棧解析方法和裝置與流程

本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,特別是涉及一種棧解析方法和裝置。



背景技術(shù):

在通過計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理的過程中,可以通過執(zhí)行進(jìn)程來實(shí)現(xiàn)該進(jìn)程所對應(yīng)的功能。在計(jì)算機(jī)系統(tǒng)中,一個進(jìn)程可以包括有一個或多個線程,每個線程可以被配置對應(yīng)的棧,該棧可以作為該線程的私有空間,用于存儲該線程的私有資源。根據(jù)一個線程的復(fù)雜程度,在執(zhí)行該線程時,需要順序執(zhí)行若干個函數(shù)以實(shí)現(xiàn)該線程的功能,故這些函數(shù)的私有資源也保存在該線程所對應(yīng)棧的棧幀中,一般情況下,可以將一個棧幀作為一個函數(shù)的私有空間,用于存儲該函數(shù)的私有資源。根據(jù)函數(shù)之間的調(diào)用關(guān)系,函數(shù)對應(yīng)的棧幀在棧中的位置也有不同,以幀地址的高低以及棧幀相鄰關(guān)系區(qū)分,被調(diào)用函數(shù)的棧幀一般位于調(diào)用函數(shù)的棧幀下一層,即被調(diào)用函數(shù)的棧幀地址較低。

若要實(shí)現(xiàn)一個線程的功能,需要通過從該線程對應(yīng)的棧中獲取與該線程相關(guān)的各個函數(shù)之間的調(diào)用關(guān)系,一般情況下,從棧的最內(nèi)層棧幀即地址最低的棧幀開始,獲取該最內(nèi)層棧幀所對應(yīng)的函數(shù)與上一層棧幀所對應(yīng)函數(shù)之間的調(diào)用關(guān)系,依據(jù)棧地址從低向高,一層一層的獲取棧幀中保存的函數(shù)調(diào)用關(guān)系,獲取一個線程中各函數(shù)的調(diào)用關(guān)系的過程可以稱為獲取該線程的調(diào)用棧的過程。線程運(yùn)行過程中獲取調(diào)用棧是重要的調(diào)測手段,若獲取調(diào)用棧的方式能夠有很高的、可靠的性能,可以減少對線程性能的影響,提高其應(yīng)用范圍。

傳統(tǒng)的獲取調(diào)用棧的方法為?;厮菟惴?,在該算法中,需要在棧幀中保存基數(shù)指針(base pointer,BP)寄存器值,一個棧幀中保存的BP寄存器值用于標(biāo)識這個棧幀與上一層棧幀之間的關(guān)聯(lián)關(guān)系,故可以根據(jù)該BP寄存器值推導(dǎo)出這個棧幀的上一層棧幀??梢姡@取調(diào)用棧的過程中,其難點(diǎn)在于如何根據(jù)當(dāng)前棧幀中的內(nèi)容確定出上一層棧幀的位置,而傳統(tǒng)算法需要在棧幀中額外保存BP寄存器值,且需要BP寄存器專用于推棧才能根據(jù)BP寄存器值才能實(shí)現(xiàn),由此浪費(fèi)了CPU寶貴的寄存器資源,影響性能。



技術(shù)實(shí)現(xiàn)要素:

為了解決上述技術(shù)問題,本發(fā)明實(shí)施例提供了一種幀解析方法和裝置,在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

第一方面,本發(fā)明提供了一種棧解析方法,應(yīng)用于一個線程所對應(yīng)的棧,所述棧中具有多個棧幀,所述方法包括:

獲取第一棧幀的最低位地址,所述第一棧幀為所述多個棧幀中的一個棧幀,所述第一棧幀為用于保存第一函數(shù)私有資源的棧幀,所述第一函數(shù)為所述線程使用到的一個函數(shù);

根據(jù)所述第一棧幀的最低位地址,從第一棧幀中獲取第二函數(shù)的指令地址,所述第二函數(shù)用于在所述線程中調(diào)用第一函數(shù),所述第二函數(shù)的指令地址用于指示第二函數(shù)調(diào)用第一函數(shù)的調(diào)用關(guān)系;

根據(jù)固定偏移以及所述第一棧幀的最低位地址所指示的位置,從所述第一棧幀中獲取第一棧幀的長度信息;

根據(jù)所述第一棧幀的最低位地址以及所述第一棧幀的長度信息確定出第二棧幀的最低位地址,所述第二棧幀為用于保存所述第二函數(shù)私有資源的棧幀。

在第一方面的第一種可能的實(shí)現(xiàn)方式中,所述獲取第一棧幀的最低位地址,包括:

從所述第一棧幀對應(yīng)的棧指針SP寄存器中獲取所述第一棧幀的最低位地址。

結(jié)合第一方面或者第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,還包括:

將所述第二棧幀的最低位地址保存到所述第二棧幀對應(yīng)的SP寄存器中。

在第一方面的第三種可能的實(shí)現(xiàn)方式中,所述第一棧幀為處于所述棧最內(nèi)層的棧幀。

在第一方面的第四種可能的實(shí)現(xiàn)方式中,還包括:

執(zhí)行移動指令,所述移動指令用于指示將所述第一棧幀的長度信息壓到所述第一棧幀中;

在所述第一棧幀中與所述第一棧幀最低位地址距離所述固定偏移設(shè)置一個地址空間;

在所述地址空間中存儲所述第一棧幀的長度信息。

第二方面,本發(fā)明提供一種棧解析裝置,應(yīng)用于一個線程所對應(yīng)的棧,所述棧中具有多個棧幀,所述裝置包括獲取單元、指令地址單元、長度信息單元和確定單元:

所述獲取單元,用于獲取第一棧幀的最低位地址,所述第一棧幀為所述多個棧幀中的一個棧幀,所述第一棧幀為用于保存第一函數(shù)私有資源的棧幀,所述第一函數(shù)為所述線程使用到的一個函數(shù);

所述指令地址單元,用于根據(jù)所述第一棧幀的最低位地址,從第一棧幀中獲取第二函數(shù)的指令地址,所述第二函數(shù)用于在所述線程中調(diào)用第一函數(shù),所述第二函數(shù)的指令地址用于指示第二函數(shù)調(diào)用第一函數(shù)的調(diào)用關(guān)系;

所述長度信息單元,用于根據(jù)固定偏移以及所述第一棧幀的最低位地址所指示的位置,從所述第一棧幀中獲取第一棧幀的長度信息;

所述確定單元,用于根據(jù)所述第一棧幀的最低位地址以及所述第一棧幀的長度信息確定出第二棧幀的最低位地址,所述第二棧幀為用于保存所述第二函數(shù)私有資源的棧幀。

在第二方面的第一種可能的實(shí)現(xiàn)方式中,所述獲取單元具體用于從所述第一棧幀對應(yīng)的棧指針SP寄存器中獲取所述第一棧幀的最低位地址。

結(jié)合第二方面或者第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,還包括保存單元:

所述保存單元,用于將所述第二棧幀的最低位地址保存到所述第二棧幀對應(yīng)的SP寄存器中。

在第二方面的第三種可能的實(shí)現(xiàn)方式中,所述第一棧幀為處于所述棧最內(nèi)層的棧幀。

在第二方面的第四種可能的實(shí)現(xiàn)方式中,還包括執(zhí)行單元、設(shè)置單元和存儲單元:

所述執(zhí)行單元,用于執(zhí)行移動指令,所述移動指令用于指示將所述第一棧幀的長度信息壓到所述第一棧幀中;

所述設(shè)置單元,用于在所述第一棧幀中與所述第一棧幀最低位地址距離所述固定偏移設(shè)置一個地址空間;

所述存儲單元,用于在所述地址空間中存儲所述第一棧幀的長度信息。

由上述技術(shù)方案可以看出,通過在棧幀中與最低位地址距離固定偏移的位置存儲該棧幀的長度信息,可以在棧解析過程中,通過獲取一個棧幀例如第一棧幀的最低位地址可以從這個棧幀中得到第二函數(shù)調(diào)用這個棧幀所對應(yīng)的第一函數(shù)的調(diào)用關(guān)系,并可以根據(jù)固定偏移從第一棧幀中得到第一棧幀的長度信息,從而可以依據(jù)第一棧幀的長度信息以及第一棧幀的最低位地址確定出第二棧幀的最低位地址,也就是第二函數(shù)所對應(yīng)棧幀的位置,以此往復(fù)可以依次從各層棧幀中得到各函數(shù)的調(diào)用關(guān)系,可以在獲取調(diào)用棧的過程中,不需要使用到BP寄存器,也不需要在棧幀中保存寄存器值,而所使用的SP寄存器在各個應(yīng)用場景中基本都屬于專用于棧幀的寄存器,SP寄存器不會被優(yōu)化作為其他用處,能正確獲取,從而在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

附圖說明

為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1為一種基于?;厮菟惴ǖ臈5牟季质疽鈭D;

圖2為本發(fā)明實(shí)施例提供的一種棧的布局的示意圖;

圖3為本發(fā)明實(shí)施例提供的一種棧解析的方法的流程圖;

圖4為本發(fā)明實(shí)施例提供的一種棧解析裝置的結(jié)構(gòu)示意圖;

圖5為本發(fā)明實(shí)施例提供的一種計(jì)算機(jī)設(shè)備的硬件結(jié)構(gòu)示意圖。

具體實(shí)施方式

下面結(jié)合附圖,對本發(fā)明的實(shí)施例進(jìn)行描述。

在通過計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理的過程中,可以通過執(zhí)行進(jìn)程來實(shí)現(xiàn)該進(jìn)程所對應(yīng)的功能。在計(jì)算機(jī)系統(tǒng)中,一個進(jìn)程可以包括有一個或多個線程,每個線程可以被配置對應(yīng)的棧。在執(zhí)行一個線程時,需要順序執(zhí)行若干個函數(shù)以實(shí)現(xiàn)該線程的功能,也即要實(shí)現(xiàn)一個線程的功能,需要獲知該若干個函數(shù)之間的調(diào)用關(guān)系,獲取一個線程中各函數(shù)的調(diào)用關(guān)系的過程可以稱為獲取該線程的調(diào)用棧的過程。一個線程中各個函數(shù)有其對應(yīng)的棧幀,可以用于存儲該函數(shù)的私有資源。根據(jù)函數(shù)之間的調(diào)用關(guān)系,函數(shù)對應(yīng)的棧幀在棧中的位置也有不同,以幀地址的高低以及棧幀相鄰關(guān)系區(qū)分,被調(diào)用函數(shù)的棧幀一般位于調(diào)用函數(shù)的棧幀下一層,即被調(diào)用函數(shù)的棧幀地址較低。

傳統(tǒng)的獲取調(diào)用棧的方法為?;厮菟惴?,在該算法中,需要在棧幀中保存BP寄存器值,一個棧幀中保存的BP寄存器值用于標(biāo)識這個棧幀與上一層棧幀之間的關(guān)聯(lián)關(guān)系,故可以根據(jù)該BP寄存器值推導(dǎo)出這個棧幀的上一層棧幀。如圖1所示,為基于?;厮菟惴ǖ臈5牟季质疽鈭D,圖1中,A棧幀是函數(shù)A對應(yīng)的棧幀,B棧幀是函數(shù)B對應(yīng)的棧幀,bp.A表示函數(shù)A對應(yīng)的A棧幀的BP寄存器值,可以用于指示A棧幀的位置,同理,bp.B表示函數(shù)B對應(yīng)的B棧幀的BP寄存器值,可以用于指示B棧幀的位置,bp.C表示函數(shù)C對應(yīng)的C棧幀的BP寄存器值,可以用于指示C棧幀的位置。根據(jù)BP寄存器值可以獲取到相應(yīng)的棧幀,在每個棧幀中可以保存有上一層棧幀的BP寄存器值,以及該棧幀所對應(yīng)的函數(shù)與上一層棧幀所對應(yīng)函數(shù)之間的調(diào)用關(guān)系,函數(shù)之間的調(diào)用關(guān)系可以是以函數(shù)返回地址的形式保存在棧幀中,以A棧幀為例,依據(jù)bp.A可以從A棧幀中獲取到A返回地址即函數(shù)B與函數(shù)A之間的調(diào)用關(guān)系,以及用于指示B棧幀位置的bp.B。

由此可知,傳統(tǒng)算法需要在棧幀中額外保存BP寄存器值,才可以通過BP寄存器值確定出上一層棧幀的位置。并且為了保證獲取調(diào)用棧的可靠性,還需要BP寄存器專用于推棧位置的定位,浪費(fèi)了CPU寶貴的寄存器資源,影響性能。

為此,本發(fā)明實(shí)施例提供了一種棧解析的方法,通過在棧幀中與最低位地址距離固定偏移的位置存儲該棧幀的長度信息,可以在棧解析過程中,通過獲取一個棧幀例如第一棧幀的最低位地址可以從這個棧幀中得到第二函數(shù)調(diào)用這個棧幀所對應(yīng)的第一函數(shù)的調(diào)用關(guān)系,并可以根據(jù)固定偏移從第一棧幀中得到第一棧幀的長度信息,從而可以依據(jù)第一棧幀的長度信息以及第一棧幀的最低位地址確定出第二棧幀的最低位地址,也就是第二函數(shù)所對應(yīng)棧幀的位置,以此往復(fù)可以依次從各層棧幀中得到各函數(shù)的調(diào)用關(guān)系,可以在獲取調(diào)用棧的過程中,不需要使用到BP寄存器,也不需要在棧幀中保存寄存器值,而所使用的棧指針(Stack Pointer,SP)寄存器在各個應(yīng)用場景中基本都屬于專用于棧幀的寄存器,SP寄存器不會被優(yōu)化作為其他用處,能正確獲取,從而在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

如圖2所示,為本發(fā)明實(shí)施例中棧的布局的示意圖,棧中包含有三個棧幀,每個棧幀都有其所對應(yīng)的函數(shù),棧幀中可以保存該棧幀的長度信息、該棧幀所對應(yīng)函數(shù)的返回地址、局部變量等信息。A棧幀是函數(shù)A對應(yīng)的棧幀,B棧幀是函數(shù)B對應(yīng)的棧幀,C棧幀是函數(shù)C對應(yīng)的棧幀。

在幀中,一般由高地址棧幀所對應(yīng)的函數(shù)調(diào)用下一層低地址棧幀所對應(yīng)的函數(shù),故圖2中,函數(shù)C調(diào)用函數(shù)B,函數(shù)B調(diào)用函數(shù)A。函數(shù)之間的調(diào)用關(guān)系可以通過函數(shù)的返回地址進(jìn)行體現(xiàn),例如A棧幀中保存的A返回地址可以體現(xiàn)出函數(shù)B調(diào)用函數(shù)A的調(diào)用關(guān)系。在棧幀中保存的返回地址可以是一個連接寄存器(Link Register,LR)值。

一般使用SP寄存器對棧幀地址進(jìn)行標(biāo)識,SP.A表示函數(shù)A對應(yīng)的A棧幀的最低位地址,SP.B表示函數(shù)B對應(yīng)的B棧幀的最低位地址,SP.C表示函數(shù)C對應(yīng)的C棧幀的最低位地址,通過棧幀的最低位地址可以確定出該棧幀在棧中的位置。

為了能夠快速確定出上一層棧幀的位置,且不需要使用額外的寄存器,在本發(fā)明實(shí)施例中,引入了棧幀的長度信息作為確定上一層棧幀位置的依據(jù)。棧幀的長度信息用于標(biāo)識該棧幀所占用棧的長度,例如可以是8kb或者16bit等。在每個棧幀中保存該棧幀的長度信息,如圖2所示,A1用于表示A棧幀的長度,B1用于表示B棧幀的長度,C1用于表示C棧幀的長度。一個棧幀的長度信息可以保持在棧幀中的特定位置,以便可以從棧幀中快速準(zhǔn)確的獲取,在本發(fā)明實(shí)施例中,可以將棧幀的長度信息存儲在距離該棧幀最低位地址固定偏移的位置,該固定偏移可以是針對一個棧中所有棧幀統(tǒng)一配置的,也可以是依據(jù)棧幀長度單獨(dú)配置的。從而在得到一個棧幀的最低位地址時,可以通過固定偏移快速定位到在這個棧幀中存儲這個棧幀長度信息的位置。

以A棧幀為例,在該A棧幀中可以保存有函數(shù)A的局部變量即A局部變量、棧幀長度A1和A返回地址,根據(jù)SP.A可以從A棧幀中得到A返回地址即函數(shù)B與函數(shù)A的調(diào)用關(guān)系,將SP.A通過固定偏移可以定位到A棧幀中存儲A棧幀長度信息的位置,從而獲取到棧幀長度A1,根據(jù)SP.A和棧幀長度A1可以確定出B棧幀的SP.B,以此類推可以依次從各層棧幀中得到各個函數(shù)之間的調(diào)用關(guān)系。

本發(fā)明實(shí)施例提供的方法可以應(yīng)用于程序的調(diào)試階段,例如,在程序調(diào)試階段,如果調(diào)試的程序出現(xiàn)漏洞(bug),可以先確定出出現(xiàn)bug的位置,若該位置對應(yīng)的是某一個函數(shù),則說明該函數(shù)或者其他函數(shù)在調(diào)用該函數(shù)的過程中可能會存在問題,則依據(jù)這些函數(shù)之間的調(diào)用關(guān)系,可以依次對這些函數(shù)進(jìn)行檢測從而確定出出現(xiàn)bug的函數(shù),從而可以對該函數(shù)的程序進(jìn)行相應(yīng)的處理來避免該bug的出現(xiàn)。

也可以應(yīng)用于程序運(yùn)行階段,例如,程序運(yùn)行時需要使用函數(shù)A、函數(shù)B、函數(shù)C和函數(shù)D,其中函數(shù)D調(diào)用函數(shù)C,函數(shù)C調(diào)用函數(shù)B,函數(shù)B調(diào)用函數(shù)A,程序在運(yùn)行中如果出現(xiàn)錯誤,可以先確定出發(fā)現(xiàn)錯誤的位置,如該位置對應(yīng)的是函數(shù)B,則可以推知函數(shù)B及其上層函數(shù)可能會存在問題,根據(jù)函數(shù)之間的調(diào)用關(guān)系,可以依次檢測函數(shù)B、函數(shù)C和函數(shù)D從而確定出出現(xiàn)錯誤的函數(shù)。

接下來,詳細(xì)介紹本發(fā)明實(shí)施例所提供的一種棧解析的方法。圖3為本發(fā)明實(shí)施例提供的一種棧解析的方法的流程圖,應(yīng)用于一個線程所對應(yīng)的棧,該方法包括:

S301:獲取第一棧幀的最低位地址,所述第一棧幀為所述多個棧幀中的一個棧幀,所述第一棧幀為用于保存第一函數(shù)私有資源的棧幀,所述第一函數(shù)為所述進(jìn)程使用到的一個函數(shù)。

一個線程往往需要順序執(zhí)行多個函數(shù)才能實(shí)現(xiàn)該線程的功能,每個函數(shù)都有其對應(yīng)的一個棧幀,棧幀可以用于保存函數(shù)的私有資源,例如,該函數(shù)的局部變量、返回地址等信息。

一個線程所對應(yīng)的棧中可以具有多個棧幀,第一棧幀可以是該多個棧幀中的一個,例如,第一棧幀可以是幀中最內(nèi)層的棧幀,即地址最低的棧幀,也可以是除了最外層棧幀或者說地址最高的棧幀以外的其他棧幀。

本發(fā)明實(shí)施例中,可以從所述第一棧幀對應(yīng)的SP寄存器中獲取所述第一棧幀的最低位地址。

S302:根據(jù)所述第一棧幀的最低位地址,從第一棧幀中獲取第二函數(shù)的指令地址。

第一棧幀是第一函數(shù)對應(yīng)的棧幀,在本發(fā)明實(shí)施例中,可以將調(diào)用該第一函數(shù)的上層函數(shù)稱為第二函數(shù),第二函數(shù)的指令地址可以用于標(biāo)識第二函數(shù)調(diào)用第一函數(shù)的調(diào)用關(guān)系。該調(diào)用關(guān)系可以包括第二函數(shù)調(diào)用第一函數(shù),即第一函數(shù)是被調(diào)用函數(shù),第二函數(shù)是調(diào)用函數(shù),以及第二函數(shù)如何實(shí)現(xiàn)對第一函數(shù)的調(diào)用。

一個函數(shù)的指令地址往往有多條,該多條指令地址中的任意一條指令地址都可以指示該函數(shù)與被調(diào)用函數(shù)之間的調(diào)用關(guān)系,因此,獲取到函數(shù)的任意一條指令地址即可獲知該函數(shù)相應(yīng)的調(diào)用關(guān)系。在具體實(shí)現(xiàn)中,第二函數(shù)的指令地址往往以第一函數(shù)的返回地址的形式保存在第一函數(shù)對應(yīng)的第一棧幀中。

根據(jù)第一棧幀的最低位地址可以獲取到該第一棧幀,由于棧幀中保存有該棧幀所對應(yīng)的函數(shù)的返回地址,因此當(dāng)獲取到第一棧幀后,便可以從該第一棧幀中獲取到第一函數(shù)的返回地址即第二函數(shù)的指令地址。

S303:根據(jù)固定偏移以及所述第一棧幀的最低位地址所指示的位置,從所述第一棧幀中獲取第一棧幀的長度信息。

固定偏移可以用于表示棧幀的最低位地址與該棧幀中存儲該棧幀長度信息的地址之間的距離,每個棧幀中存儲該棧幀的長度信息的位置可以是在該棧幀中相對比較固定的位置,故固定偏移可以是一個已知的固定數(shù)值。

通過將第一棧幀的最低位地址偏移該固定偏移量可以得到存儲該棧幀長度信息的地址,從該地址所指示的位置可以獲取第一棧幀的長度信息。例如,第一棧幀的最低位地址為第10比特(bit),固定偏移為8bit,則存儲第一棧幀的長度信息的地址為第18bit,根據(jù)該地址所指示的位置可以獲取到第一棧幀的長度信息。

S304:根據(jù)所述第一棧幀的最低位地址以及所述第一棧幀的長度信息確定出第二棧幀的最低位地址,所述第二棧幀為用于保存所述第二函數(shù)私有資源的棧幀。

一個棧幀的長度可以理解為是該棧幀的最低位地址與該棧幀的最高位地址之間的差值,因此,根據(jù)一個棧幀的最低位地址以及該棧幀的長度可以計(jì)算出該棧幀的最高位地址。

當(dāng)兩個函數(shù)之間具有調(diào)用關(guān)系時,一個可以是調(diào)用函數(shù),另一個可以是被調(diào)用函數(shù),這兩個函數(shù)各自對應(yīng)的棧幀可以是具有相鄰關(guān)系的兩個棧幀,也即調(diào)用函數(shù)對應(yīng)的棧幀的最低位地址與被調(diào)用函數(shù)對應(yīng)的棧幀的最高位地址相同,可知這兩個棧幀的最低位地址之間的差值是被調(diào)用函數(shù)對應(yīng)的棧幀的長度。例如,第二函數(shù)調(diào)用第一函數(shù),則第二函數(shù)對應(yīng)的第二棧幀和第一函數(shù)對應(yīng)的第一棧幀具有相鄰的關(guān)系,第一棧幀的最低位地址和第二棧幀的最低位地址的差值是第一棧幀的長度。

因此,根據(jù)獲取的第一棧幀的長度信息,以及第一棧幀的最低位地址可以計(jì)算得出第二棧幀的最低位地址,例如,第一棧幀的最低位地址為第10bit,第一棧幀的長度為15bit,則可以計(jì)算出第二棧幀的最低位地址為第10+15=25bit。

由上述技術(shù)方案可以看出,通過在棧幀中與最低位地址距離固定偏移的位置存儲該棧幀的長度信息,可以在棧解析過程中,通過獲取一個棧幀例如第一棧幀的最低位地址可以從這個棧幀中得到第二函數(shù)調(diào)用這個棧幀所對應(yīng)的第一函數(shù)的調(diào)用關(guān)系,并可以根據(jù)固定偏移從第一棧幀中得到第一棧幀的長度信息,從而可以依據(jù)第一棧幀的長度信息以及第一棧幀的最低位地址確定出第二棧幀的最低位地址,也就是第二函數(shù)所對應(yīng)棧幀的位置,以此往復(fù)可以依次從各層棧幀中得到各函數(shù)的調(diào)用關(guān)系,可以在獲取調(diào)用棧的過程中,不需要使用到BP寄存器,也不需要在棧幀中保存寄存器值,而所使用的SP寄存器在各個應(yīng)用場景中基本都屬于專用于棧幀的寄存器,SP寄存器不會被優(yōu)化作為其他用處,能正確獲取,從而在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

一般情況下,可以是從棧的最內(nèi)層棧幀即地址最低的棧幀開始,獲取該最內(nèi)層棧幀所對應(yīng)的函數(shù)與上一層棧幀所對應(yīng)函數(shù)之間的調(diào)用關(guān)系,在本發(fā)明實(shí)施例中第一棧幀可以是處于所述棧最內(nèi)層的棧幀。

當(dāng)?shù)谝粭亲顑?nèi)層棧幀即第一函數(shù)為最內(nèi)層函數(shù)時,獲取的調(diào)用棧中除了包括各個函數(shù)之間的調(diào)用關(guān)系外,還可以包括最內(nèi)層函數(shù)所需調(diào)用的相關(guān)信息,在程序計(jì)數(shù)器(Program Counter,PC)中存儲有最內(nèi)層函數(shù)所需調(diào)用的相關(guān)信息,故此,當(dāng)?shù)谝缓瘮?shù)為最內(nèi)層函數(shù)時,可以通過PC獲取到第一函數(shù)所需調(diào)用的相關(guān)信息,從而使獲取的調(diào)用棧中包含的信息更加完善。

在本發(fā)明實(shí)施例中,當(dāng)計(jì)算出第二棧幀的最低位地址后,可以將該第二棧幀的最低位地址保存到第二棧幀對應(yīng)的SP寄存器中,以便后續(xù)操作中可以依據(jù)保存的該第二棧幀的最低位地址,從該第二棧幀中獲取調(diào)用第二函數(shù)的函數(shù)的指令地址。

在上述介紹中,第二棧幀對應(yīng)的SP寄存器和第一棧幀對應(yīng)的SP寄存器可以是同一個SP寄存器,在該SP寄存器中可以保存一個棧幀的最低位地址,以第一棧幀為例,SP寄存器中保存的是第一棧幀的最低位地址,依據(jù)上述操作步驟,當(dāng)計(jì)算出第二棧幀的最低位地址后,則可以將該SP寄存器中保存的地址信息進(jìn)行更新,即將該SP寄存器中保存的第一棧幀的最低位地址更新為第二棧幀的最低位地址。

通過更新SP寄存器中保存的棧幀的最低位地址,可以靈活、高效地獲取所需函數(shù)之間的調(diào)用關(guān)系。

例如,對于一個線程,需要使用五個函數(shù),第一個函數(shù)、第二個函數(shù)、第三個函數(shù)、第四個函數(shù)和第五個函數(shù),第一個函數(shù)為最內(nèi)層函數(shù),最初在SP寄存器中保存的是該線程所需使用的最內(nèi)層函數(shù)對應(yīng)的棧幀(最內(nèi)層棧幀)的最低位地址,當(dāng)需要獲取該線程中函數(shù)之間的調(diào)用關(guān)系時,需要從最內(nèi)層棧幀開始,依據(jù)棧地址從低到高,一層一層獲取棧幀中保存的函數(shù)的調(diào)用關(guān)系。但是,在一些情況下,可能需要獲取第三個函數(shù)及其上層函數(shù)之間的調(diào)用關(guān)系,例如,已經(jīng)獲知第二個函數(shù)調(diào)用第一個函數(shù),第三個函數(shù)調(diào)用第二個函數(shù),現(xiàn)在只需要獲知第三個函數(shù)、第四個函數(shù)和第五個函數(shù)之間的調(diào)用關(guān)系,對于這種情況,若SP寄存器中保存的仍是第一個函數(shù)對應(yīng)的棧幀的最低位地址,則在獲取函數(shù)之間的調(diào)用關(guān)系時,仍是從最內(nèi)層棧幀開始,一層一層獲取棧幀中保存的函數(shù)的調(diào)用關(guān)系,此時會重復(fù)獲取第一個函數(shù)、第二個函數(shù)和第三個函數(shù)之間的調(diào)用關(guān)系,增加了工作量,降低了工作效率。對于這種情況,當(dāng)已經(jīng)獲知第二個函數(shù)調(diào)用第一個函數(shù),第三個函數(shù)調(diào)用第二個函數(shù)后,可以將SP寄存器中保存的棧幀的最低位地址更新為第三個函數(shù)所對應(yīng)棧幀的最低位地址,以便于當(dāng)只需獲知第三個函數(shù)及其上層函數(shù)之間的調(diào)用關(guān)系時,可以直接從第三個函數(shù)所對應(yīng)棧幀開始執(zhí)行。

在上述實(shí)施例中,在每個棧幀中可以存儲有該棧幀的長度信息,接下來將對棧幀中存儲該棧幀的長度信息的具體方式展開介紹,具體操作如下:

執(zhí)行移動指令,所述移動指令用于指示將所述第一棧幀的長度信息壓到所述第一棧幀中。

移動指令可以是一條指令信息,用于實(shí)現(xiàn)棧幀的長度信息的存儲。在具體實(shí)現(xiàn)中,可以是一條數(shù)據(jù)傳送(MOV)指令。

通過該移動指令可以將第一棧幀的長度信息存儲在該第一棧幀的某一個位置處,該位置的選取,可以是在所述第一棧幀中與所述第一棧幀最低位地址距離所述固定偏移設(shè)置一個地址空間;在所述地址空間中存儲所述第一棧幀的長度信息。

例如,第一棧幀的最低位地址為第10bit,固定偏移為5bit,則可以在第一棧幀中地址為第15bit所指示的位置處設(shè)置一個地址空間,用于存儲第一棧幀的長度信息。

由上述介紹可知,通過一條指令便可以實(shí)現(xiàn)在棧幀中存儲該棧幀的長度信息,當(dāng)獲取到第一棧幀的最低位地址后,依據(jù)該第一棧幀長度信息,便可以確定出第二棧幀的最低位地址。

而傳統(tǒng)方式中,為了獲取上一層棧幀的位置,往往需要多條指令信息,參照圖1,bp.B可以用于表示函數(shù)B對應(yīng)的棧幀的位置,傳統(tǒng)方式中,需要執(zhí)行多條指令,才可以將bp.B存儲到函數(shù)A對應(yīng)的棧幀中。

相比于傳統(tǒng)方式,本發(fā)明實(shí)施例采用的方式,有效的減少了指令的條數(shù),從而減少系統(tǒng)性能的損耗,并且移動指令占用的內(nèi)存極小,從而有效減少了可執(zhí)行文件的大小。

本發(fā)明的設(shè)備實(shí)施例

圖4為本發(fā)明實(shí)施例提供的一種棧解析裝置的結(jié)構(gòu)示意圖,所述裝置包括獲取單元401、指令地址單元402、長度信息單元403和確定單元404:

所述獲取單元401,用于獲取第一棧幀的最低位地址,所述第一棧幀為所述多個棧幀中的一個棧幀,所述第一棧幀為用于保存第一函數(shù)私有資源的棧幀,所述第一函數(shù)為所述線程使用到的一個函數(shù)。

所述指令地址單元402,用于根據(jù)所述第一棧幀的最低位地址,從第一棧幀中獲取第二函數(shù)的指令地址,所述第二函數(shù)用于在所述線程中調(diào)用第一函數(shù),所述第二函數(shù)的指令地址用于指示第二函數(shù)調(diào)用第一函數(shù)的調(diào)用關(guān)系。

所述長度信息單元403,用于根據(jù)固定偏移以及所述第一棧幀的最低位地址所指示的位置,從所述第一棧幀中獲取第一棧幀的長度信息。

所述確定單元404,用于根據(jù)所述第一棧幀的最低位地址以及所述第一棧幀的長度信息確定出第二棧幀的最低位地址,所述第二棧幀為用于保存所述第二函數(shù)私有資源的棧幀。

可選的,所述獲取單元具體用于從所述第一棧幀對應(yīng)的棧指針SP寄存器中獲取所述第一棧幀的最低位地址。

可選的,所述裝置還可以包括保存單元:

所述保存單元,用于將所述第二棧幀的最低位地址保存到所述第二棧幀對應(yīng)的SP寄存器中。

可選的,所述第一棧幀為處于所述棧最內(nèi)層的棧幀。

可選的,所述裝置還可以包括執(zhí)行單元:

所述執(zhí)行單元,用于執(zhí)行移動指令,所述移動指令用于指示將所述第一棧幀的長度信息壓到所述第一棧幀中;

在所述第一棧幀中與所述第一棧幀最低位地址距離所述固定偏移設(shè)置一個地址空間;

在所述地址空間中存儲所述第一棧幀的長度信息。

圖4為從網(wǎng)絡(luò)設(shè)備側(cè)描述本發(fā)明技術(shù)方案的裝置實(shí)施例,圖4所對應(yīng)實(shí)施例中特征的說明可以參見圖3所對應(yīng)實(shí)施例的相關(guān)說明,這里不再一一贅述。

由上述技術(shù)方案可以看出,通過在棧幀中與最低位地址距離固定偏移的位置存儲該棧幀的長度信息,可以在棧解析過程中,通過獲取一個棧幀例如第一棧幀的最低位地址可以從這個棧幀中得到第二函數(shù)調(diào)用這個棧幀所對應(yīng)的第一函數(shù)的調(diào)用關(guān)系,并可以根據(jù)固定偏移從第一棧幀中得到第一棧幀的長度信息,從而可以依據(jù)第一棧幀的長度信息以及第一棧幀的最低位地址確定出第二棧幀的最低位地址,也就是第二函數(shù)所對應(yīng)棧幀的位置,以此往復(fù)可以依次從各層棧幀中得到各函數(shù)的調(diào)用關(guān)系,可以在獲取調(diào)用棧的過程中,不需要使用到BP寄存器,也不需要在棧幀中保存寄存器值,而所使用的SP寄存器在各個應(yīng)用場景中基本都屬于專用于棧幀的寄存器,SP寄存器不會被優(yōu)化作為其他用處,能正確獲取,從而在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

圖5為本發(fā)明實(shí)施例提供的一種計(jì)算機(jī)設(shè)備的硬件結(jié)構(gòu)示意圖,所述計(jì)算機(jī)設(shè)備500包括存儲器501、接收器502,以及分別與存儲器501、接收器502連接的處理器503,存儲器501用于存儲一組程序指令,處理器503用于調(diào)用存儲器501存儲的程序指令執(zhí)行如下操作:

觸發(fā)接收器502獲取第一棧幀的最低位地址,所述第一棧幀為所述多個棧幀中的一個棧幀,所述第一棧幀為用于保存第一函數(shù)私有資源的棧幀,所述第一函數(shù)為所述線程使用到的一個函數(shù);

根據(jù)所述第一棧幀的最低位地址,從第一棧幀中獲取第二函數(shù)的指令地址,所述第二函數(shù)用于在所述線程中調(diào)用第一函數(shù),所述第二函數(shù)的指令地址用于指示第二函數(shù)調(diào)用第一函數(shù)的調(diào)用關(guān)系;

根據(jù)固定偏移以及所述第一棧幀的最低位地址所指示的位置,從所述第一棧幀中獲取第一棧幀的長度信息;

根據(jù)所述第一棧幀的最低位地址以及所述第一棧幀的長度信息確定出第二棧幀的最低位地址,所述第二棧幀為用于保存所述第二函數(shù)私有資源的棧幀。

可選地,處理器503可以為中央處理器(Central Processing Unit,CPU),存儲器501可以為隨機(jī)存取存儲器(Random Access Memory,RAM)類型的內(nèi)部存儲器,接收器502可以包含普通物理接口,物理接口可以為以太(Ethernet)接口或異步傳輸模式(Asynchronous Transfer Mode,ATM)接口。處理器503、接收器502和存儲器501可以集成為一個或多個獨(dú)立的電路或硬件,如:專用集成電路(Application Specific Integrated Circuit,ASIC)。

圖5所對應(yīng)實(shí)施例中特征的說明可以參見圖3所對應(yīng)實(shí)施例的相關(guān)說明,這里不再一一贅述。

由上述技術(shù)方案可以看出,通過在棧幀中與最低位地址距離固定偏移的位置存儲該棧幀的長度信息,可以在棧解析過程中,通過獲取一個棧幀例如第一棧幀的最低位地址可以從這個棧幀中得到第二函數(shù)調(diào)用這個棧幀所對應(yīng)的第一函數(shù)的調(diào)用關(guān)系,并可以根據(jù)固定偏移從第一棧幀中得到第一棧幀的長度信息,從而可以依據(jù)第一棧幀的長度信息以及第一棧幀的最低位地址確定出第二棧幀的最低位地址,也就是第二函數(shù)所對應(yīng)棧幀的位置,以此往復(fù)可以依次從各層棧幀中得到各函數(shù)的調(diào)用關(guān)系,可以在獲取調(diào)用棧的過程中,不需要使用到BP寄存器,也不需要在棧幀中保存寄存器值,而所使用的SP寄存器在各個應(yīng)用場景中基本都屬于專用于棧幀的寄存器,SP寄存器不會被優(yōu)化作為其他用處,能正確獲取,從而在獲取調(diào)用棧的過程中節(jié)約了寄存器資源,不會影響系統(tǒng)性能。

本領(lǐng)域普通技術(shù)人員可以理解:實(shí)現(xiàn)上述方法實(shí)施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述程序可以存儲于一計(jì)算機(jī)可讀取存儲介質(zhì)中,該程序在執(zhí)行時,執(zhí)行包括上述方法實(shí)施例的步驟;而前述的存儲介質(zhì)可以是下述介質(zhì)中的至少一種:只讀存儲器(英文:read-only memory,縮寫:ROM)、RAM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。

需要說明的是,本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,各個實(shí)施例之間相同相似的部分互相參見即可,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對于設(shè)備及系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所描述的設(shè)備及系統(tǒng)實(shí)施例僅僅是示意性的,其中作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實(shí)施。

以上所述,僅為本發(fā)明的一些具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求的保護(hù)范圍為準(zhǔn)。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
资源县| 拉萨市| 措美县| 乐亭县| 澄迈县| 万源市| 台北县| 金乡县| 扶沟县| 涿州市| 鲁甸县| 朝阳区| 灌南县| 洪江市| 封开县| 镇远县| 石门县| 桂东县| 乌审旗| 裕民县| 台中县| 永泰县| 延长县| 昌都县| 桦川县| 苗栗市| 桃园县| 黄骅市| 镇平县| 巩留县| 土默特左旗| 宁国市| 岳西县| 霍邱县| 云龙县| 丹东市| 义马市| 儋州市| 文安县| 巴塘县| 海盐县|