一種?;厮莘椒?br>
【專(zhuān)利摘要】本發(fā)明公開(kāi)一種?;厮莘椒?,該?;厮莘椒ɑ厮莸暮瘮?shù)為PPC??蚪Y(jié)構(gòu),該?;厮莘椒ò航馕霎?dāng)前函數(shù)的棧框,查找并回溯出調(diào)用當(dāng)前函數(shù)的上一層函數(shù);對(duì)函數(shù)層層回溯,得到函數(shù)調(diào)用的層次關(guān)系。本發(fā)明根據(jù)PPC內(nèi)存??蚪Y(jié)構(gòu)特點(diǎn)進(jìn)行函數(shù)?;厮?,提高PPC完整回溯的概率,便于底層開(kāi)發(fā)人員回溯函數(shù)層次關(guān)系信息。
【專(zhuān)利說(shuō)明】一種棧回溯方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種嵌入式底層開(kāi)發(fā)技術(shù),具體涉及一種棧回溯方法。
【背景技術(shù)】
[0002]嵌入式底層開(kāi)發(fā)經(jīng)常遇到各種問(wèn)題需要解決,因此定位問(wèn)題的手段對(duì)一個(gè)底層開(kāi)發(fā)人員來(lái)說(shuō)非常重要。當(dāng)然,對(duì)不同的問(wèn)題也會(huì)有不同的定位手段。其中?;厮菔堑讓榆浖_(kāi)發(fā)人員常用的重要定位手段之一。?;厮莺?jiǎn)單地說(shuō)就是,檢索出函數(shù)之間的調(diào)用的層次關(guān)系。常見(jiàn)的棧回溯方法,主要是通過(guò)查找匯編指令來(lái)實(shí)現(xiàn)。這種回溯方法有一定的缺陷,就是查找的指令中有的指令是通過(guò)其它的指令來(lái)完成的,或者說(shuō)有些指令不是直接實(shí)現(xiàn)的,而是通過(guò)其它幾條指令來(lái)實(shí)現(xiàn)的。如果出現(xiàn)這種情況,回溯就可能無(wú)法檢索出完整的函數(shù)調(diào)用層次關(guān)系。
【發(fā)明內(nèi)容】
[0003]本發(fā)明提供了一種棧回溯方法,根據(jù)PPC棧框的特點(diǎn)進(jìn)行回溯,提高了 PPC完整地回溯的概率。
[0004]為實(shí)現(xiàn)上述目的,本發(fā)明提供一種?;厮莘椒?,其特點(diǎn)是,該?;厮莘椒ɑ厮莸暮瘮?shù)為PPC??蚪Y(jié)構(gòu),該棧回溯方法包含:
解析當(dāng)前函數(shù)的???,查找并回溯出調(diào)用當(dāng)前函數(shù)的上一層函數(shù);
對(duì)函數(shù)層層回溯,得到函數(shù)調(diào)用的層次關(guān)系。
[0005]上述解析當(dāng)前函數(shù)的???,查找并回溯出調(diào)用當(dāng)前函數(shù)的上一層函數(shù)包含:
獲取第一函數(shù)的函數(shù)棧中返回鏈字段的首地址;第一函數(shù)為當(dāng)前函數(shù);
查找第一函數(shù)的函數(shù)棧中返回鏈字段,獲取第二函數(shù)的返回鏈字段的首地址;第二函數(shù)為調(diào)用第一函數(shù)的上一層函數(shù);
通過(guò)第二函數(shù)的返回鏈字段查找得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
[0006]上述查找得到第二函數(shù)調(diào)用第一函數(shù)的指令地址包含:
通過(guò)第二函數(shù)的返回鏈字段獲取第二函數(shù)的函數(shù)棧的鏈接寄存器保存字段的首地址;
從第二函數(shù)的鏈接寄存器保存字段中得到第一函數(shù)返回第二函數(shù)的返回地址;
根據(jù)第一函數(shù)的返回地址得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
[0007]上述?;厮莘椒ㄖ校_(kāi)始回溯的第一層函數(shù)的函數(shù)棧信息通過(guò)PPC中央處理器的寄存器獲取。
[0008]上述當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的SP寄存器保存當(dāng)前函數(shù)的返回鏈字段的地址。
[0009]上述當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的鏈接寄存器寄存器保存當(dāng)前函數(shù)的返回至調(diào)用當(dāng)前函數(shù)的上一層函數(shù)的返回地址。
[0010]上述?;厮莘椒ㄖ谢厮莸暮瘮?shù)為公共接口函數(shù)。
[0011]上述函數(shù)的函數(shù)棧中,返回鏈字段與鏈接寄存器保存字段組成函數(shù)棧頭部,并位于函數(shù)棧內(nèi)存空間的棧頂位置;返回鏈字段與鏈接寄存器保存字段之間的位置關(guān)系固定。
[0012]上述函數(shù)的函數(shù)棧的棧框中每個(gè)字段都是8個(gè)字節(jié)對(duì)齊。
[0013]本發(fā)明一種?;厮莘椒ê同F(xiàn)有技術(shù)的?;厮菁夹g(shù)相比,其優(yōu)點(diǎn)在于,本發(fā)明根據(jù)PPC內(nèi)存棧框結(jié)構(gòu)特點(diǎn)進(jìn)行函數(shù)?;厮荩岣逷PC完整回溯的概率,便于底層開(kāi)發(fā)人員回溯函數(shù)層次關(guān)系信息。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0014]圖1為PPC??虻牟糠纸Y(jié)構(gòu)示意圖;
圖2為PPC開(kāi)棧和消除棧的流程示意圖;
圖3為本發(fā)明一種?;厮莘椒ǖ姆椒鞒虉D;
圖4為一個(gè)PPC棧回溯的實(shí)施例的示意圖。
【具體實(shí)施方式】
[0015]以下結(jié)合附圖,進(jìn)一步說(shuō)明本發(fā)明的具體實(shí)施例。
[0016]如圖1所示,為一種PPC??虻慕Y(jié)構(gòu)的一部分結(jié)構(gòu)示意圖。PPC,即PowerPC,是一種計(jì)算機(jī)處理器體系結(jié)構(gòu)規(guī)范。??蛑傅氖呛瘮?shù)運(yùn)行時(shí),在內(nèi)存棧中開(kāi)辟的一段棧空間。PPC棧框結(jié)構(gòu)分有不同的字段,包含:函數(shù)參數(shù)寄存器保存區(qū)域(FPR save area),通用寄存器保存區(qū)域(GPR save area)、條件寄存器保存字段(CR save word, ConditonRegister save word)、本地變量區(qū)域(local variables area)、函數(shù)參數(shù)區(qū)域(funct1nparameters area)、填充以調(diào)節(jié)小至8字節(jié)的倍數(shù)(padding to adjust size to multipleof 8 bytes)、鏈接寄存器保存字段(LR Save Word,Link Register Save Word)、返回鏈字段(Back Chain Word),每一字段都有其用途,其中跟開(kāi)棧和消除棧關(guān)系最密切的是“BackChain Word”和“LR Save Word”字段,也就是圖1中所不的“Frame Header”函數(shù)棧頭部。除了這些字段之外,還有其他??臻g,這樣加起來(lái)就是一個(gè)函數(shù)的??臻g。也就是說(shuō),函數(shù)??臻g通常包含兩個(gè)部分,一部分是函數(shù)本身運(yùn)行可能需要用到的一些空間(如:函數(shù)中的局部變量也會(huì)占用??臻g),另一部分就是如圖一所示的開(kāi)棧需要使用的一些空間。其中函數(shù)棧頭部跟開(kāi)?;蛘呦龡jP(guān)系是最大的,其他字段是可選字段,根據(jù)實(shí)際情況使用。PPC??虻奶攸c(diǎn)就是,函數(shù)棧頭部在每個(gè)函數(shù)棧內(nèi)存空間中的棧頂位置。也就是說(shuō),每個(gè)PPC函數(shù)棧的棧頂都是“Back Chain Word”和“LR Save Word”字段,而且這兩個(gè)字段之間的位置關(guān)系也是固定的。另外這個(gè)??蛑忻總€(gè)字段都是8個(gè)字節(jié)對(duì)齊的。
[0017]如圖2所示,為PPC開(kāi)棧和消除棧的流程,步驟I表示執(zhí)行函數(shù)A,步驟2表示函數(shù)A執(zhí)行過(guò)程中調(diào)用函數(shù)B、步驟3表示函數(shù)B執(zhí)行過(guò)程中調(diào)用函數(shù)C,步驟4表示函數(shù)C執(zhí)行結(jié)束后返回函數(shù)B。各個(gè)框分別表示函數(shù)A、B、C各自的??臻g。SP是PPC中央處理器(CPU)的一個(gè)寄存器,專(zhuān)門(mén)用來(lái)保存當(dāng)前函數(shù)棧的棧頂?shù)刂?,也就是?dāng)前函數(shù)內(nèi)存棧中的“Back Chain Word”字段的首地址。
[0018]除了 SP寄存器外,PPC的CPU中的LR寄存器在開(kāi)棧和消除棧的過(guò)程中也很重要。LR寄存器用于保存函數(shù)的返回地址。如圖2中所示,當(dāng)函數(shù)C在執(zhí)行時(shí),CPU的LR寄存器中保存的是返回到函數(shù)B的地址,也就是函數(shù)B調(diào)用函數(shù)C時(shí)的一個(gè)指令地址。在函數(shù)C執(zhí)行結(jié)束后,會(huì)通過(guò)這個(gè)返回地址跳轉(zhuǎn)回到B函數(shù)調(diào)用C函數(shù)的地方,然后重新執(zhí)行B函數(shù)剩下的指令。以下三點(diǎn)是需要特點(diǎn)注意的:
1)當(dāng)函數(shù)C在執(zhí)行時(shí),LR寄存器保存的返回地址,不是放在C函數(shù)內(nèi)存棧框里的“LRSave Word”字段,而是放在B函數(shù)內(nèi)存??蚶锏摹癓R Save Word”字段;
2)當(dāng)函數(shù)C在執(zhí)行時(shí),SP寄存器保存的是當(dāng)前函數(shù)內(nèi)存棧的棧頂?shù)刂?,也就是C函數(shù)內(nèi)存棧的“Back Chain Word”字段的首地址。
[0019]3)當(dāng)函數(shù)C在執(zhí)行時(shí),C函數(shù)內(nèi)存棧的“Back Chain Word”字段上保存的是B函數(shù)內(nèi)存棧的“Back Chain Word”字段的首地址。
[0020]如圖3所示,為本發(fā)明一種基于PPC??虻奶攸c(diǎn)對(duì)PPC棧框結(jié)構(gòu)的函數(shù)進(jìn)行?;厮莘椒?,該棧回溯方法包含以下步驟:
步驟1、當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的SP寄存器保存當(dāng)前函數(shù)的返回鏈字段(“Back Chain Word”字段)的地址。當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的LR寄存器保存當(dāng)前函數(shù)的返回至調(diào)用當(dāng)前函數(shù)的上一層函數(shù)的返回地址。
[0021]所以,通過(guò)PPC中央處理器的SP寄存器獲取第一函數(shù)的返回鏈字段的首地址。該第一函數(shù)即為,?;厮莘椒ㄖ虚_(kāi)始回溯的第一層函數(shù)。
[0022]步驟2、解析第一函數(shù)的???,查找并回溯出調(diào)用第一函數(shù)的上一層函數(shù),該調(diào)用第一函數(shù)的上一層函數(shù)為第二函數(shù)。
[0023]步驟2.1、由于第一函數(shù)的返回鏈字段上保存了第二函數(shù)內(nèi)存?!癇ack ChainWord”字段的首地址。故查找第一函數(shù)的函數(shù)棧中的返回鏈字段,獲取第二函數(shù)的函數(shù)棧的返回鏈字段的首地址。
[0024]步驟2.2、通過(guò)第二函數(shù)的返回鏈字段查找得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
[0025]步驟2.2.1、通過(guò)第二函數(shù)的返回鏈字段獲取第二函數(shù)的函數(shù)棧的LR保存字段的首地址。
[0026]步驟2.2.2、從第二函數(shù)的LR保存字段中得到第一函數(shù)返回第二函數(shù)的返回地址。
[0027]步驟2.2.3、根據(jù)第一函數(shù)的返回地址得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
[0028]所以,在步驟2中可以得到第二函數(shù)的內(nèi)存棧的棧頂?shù)刂?,即第二函?shù)內(nèi)存棧中的“Back Chain Word”字段的首地址,同時(shí)可以得到第一函數(shù)的返回地址,即第二函數(shù)調(diào)用第一函數(shù)的指令地址。這樣也就通過(guò)第一函數(shù)回溯出了第二函數(shù)。
[0029]步驟3、對(duì)函數(shù)層層回溯,得到函數(shù)調(diào)用的層次關(guān)系。步驟2是通過(guò)解析第一函數(shù)內(nèi)存棧信息,進(jìn)而解析第二函數(shù)內(nèi)存棧信息,最后回溯出第二函數(shù)的。所以,使用同樣的方法,從解析第二函數(shù)內(nèi)存棧信息開(kāi)始,然后解析調(diào)用第二函數(shù)的上一層函數(shù)的內(nèi)存棧信息,最終也可以回溯出第二函數(shù)的上一層函數(shù),以此類(lèi)推。
[0030]在回溯過(guò)程中,第一層函數(shù)是需要通過(guò)CPU的寄存器來(lái)獲得一些函數(shù)內(nèi)存棧信息,如第一函數(shù)的“Back Chain Word”字段的首地址,就是從CPU中的SP寄存器獲取。其它層次的函數(shù)的回溯則是根據(jù)PPC內(nèi)存??蚪Y(jié)構(gòu)的特點(diǎn)進(jìn)行回溯的。
[0031]本發(fā)明主要用于研發(fā)領(lǐng)域。公共接口函數(shù)是軟件中經(jīng)常被不同函數(shù)調(diào)用到的,但當(dāng)某個(gè)公共接口函數(shù)發(fā)生異常時(shí),其被調(diào)用的層次關(guān)系對(duì)開(kāi)發(fā)人員來(lái)說(shuō)就很重要。因?yàn)檫@可能是開(kāi)發(fā)人員需要用到的信息。所以本發(fā)明對(duì)這種公共接口函數(shù)的回溯很有幫助。
[0032]如圖4所示,為一個(gè)PPC?;厮莸膶?shí)施例,本實(shí)例使用的也是根據(jù)PPC內(nèi)存棧框的特點(diǎn)進(jìn)行回溯。
[0033]PC是當(dāng)前CPU執(zhí)行的指令地址,PC列所打印的是回溯過(guò)程中各個(gè)函數(shù)跳轉(zhuǎn)到其它函數(shù)時(shí)所執(zhí)行到的指令;SP,也就是SP寄存器,SP列打印的是回溯過(guò)程中各個(gè)函數(shù)跳轉(zhuǎn)到其它函數(shù)時(shí)SP寄存器中的值;FuncName即funct1n name,是回溯過(guò)程中獲取出來(lái)的函數(shù)名稱(chēng)。圖中表示,回溯過(guò)程從函數(shù)sysBacktrece到函數(shù)VxTaskEntry,打印出來(lái)的函數(shù)及順序就是回溯過(guò)程中的函數(shù)層次關(guān)系。
[0034]盡管本發(fā)明的內(nèi)容已經(jīng)通過(guò)上述優(yōu)選實(shí)施例作了詳細(xì)介紹,但應(yīng)當(dāng)認(rèn)識(shí)到上述的描述不應(yīng)被認(rèn)為是對(duì)本發(fā)明的限制。在本領(lǐng)域技術(shù)人員閱讀了上述內(nèi)容后,對(duì)于本發(fā)明的多種修改和替代都將是顯而易見(jiàn)的。因此,本發(fā)明的保護(hù)范圍應(yīng)由所附的權(quán)利要求來(lái)限定。
【權(quán)利要求】
1.一種棧回溯方法,其特征在于,該?;厮莘椒ɑ厮莸暮瘮?shù)為PPC??蚪Y(jié)構(gòu),該?;厮莘椒ò? 解析當(dāng)前函數(shù)的??颍檎也⒒厮莩稣{(diào)用當(dāng)前函數(shù)的上一層函數(shù); 對(duì)函數(shù)層層回溯,得到函數(shù)調(diào)用的層次關(guān)系。
2.如權(quán)利要求1所述的?;厮莘椒ǎ涮卣髟谟?,所述解析當(dāng)前函數(shù)的???,查找并回溯出調(diào)用當(dāng)前函數(shù)的上一層函數(shù)包含: 獲取第一函數(shù)的函數(shù)棧中返回鏈字段的首地址;第一函數(shù)為當(dāng)前函數(shù); 查找第一函數(shù)的函數(shù)棧中返回鏈字段,獲取第二函數(shù)的返回鏈字段的首地址;第二函數(shù)為調(diào)用第一函數(shù)的上一層函數(shù); 通過(guò)第二函數(shù)的返回鏈字段查找得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
3.如權(quán)利要求2所述的?;厮莘椒?,其特征在于,所述查找得到第二函數(shù)調(diào)用第一函數(shù)的指令地址包含: 通過(guò)第二函數(shù)的返回鏈字段獲取第二函數(shù)的函數(shù)棧的鏈接寄存器保存字段的首地址; 從第二函數(shù)的鏈接寄存器保存字段中得到第一函數(shù)返回第二函數(shù)的返回地址; 根據(jù)第一函數(shù)的返回地址得到第二函數(shù)調(diào)用第一函數(shù)的指令地址。
4.如權(quán)利要求1或2所述的?;厮莘椒ǎ涮卣髟谟?,所述?;厮莘椒ㄖ校_(kāi)始回溯的第一層函數(shù)的函數(shù)棧信息通過(guò)PPC中央處理器的寄存器獲取。
5.如權(quán)利要求1所述的?;厮莘椒?,其特征在于,所述當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的SP寄存器保存當(dāng)前函數(shù)的返回鏈字段的地址。
6.如權(quán)利要求1所述的棧回溯方法,其特征在于,所述當(dāng)前函數(shù)執(zhí)行時(shí),PPC中央處理器的鏈接寄存器寄存器保存當(dāng)前函數(shù)的返回至調(diào)用當(dāng)前函數(shù)的上一層函數(shù)的返回地址。
7.如權(quán)利要求1所述的?;厮莘椒?,其特征在于,所述?;厮莘椒ㄖ谢厮莸暮瘮?shù)為公共接口函數(shù)。
8.如權(quán)利要求1所述的?;厮莘椒ǎ涮卣髟谟?,所述函數(shù)的函數(shù)棧中,返回鏈字段與鏈接寄存器保存字段組成函數(shù)棧頭部,并位于函數(shù)棧內(nèi)存空間的棧頂位置;返回鏈字段與鏈接寄存器保存字段之間的位置關(guān)系固定。
9.如權(quán)利要求1所述的棧回溯方法,其特征在于,所述函數(shù)的函數(shù)棧的??蛑忻總€(gè)字段都是8個(gè)字節(jié)對(duì)齊。
【文檔編號(hào)】G06F9/34GK104484179SQ201410806851
【公開(kāi)日】2015年4月1日 申請(qǐng)日期:2014年12月23日 優(yōu)先權(quán)日:2014年12月23日
【發(fā)明者】陸丹宏, 周琳, 劉馳 申請(qǐng)人:上海斐訊數(shù)據(jù)通信技術(shù)有限公司