本發(fā)明屬于計(jì)算機(jī)軟件開發(fā),具體涉及一種基于自反射機(jī)制的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法。
背景技術(shù):
1、動(dòng)態(tài)指令轉(zhuǎn)換(dynamic?instruction?translation,dit)也被稱為動(dòng)態(tài)二進(jìn)制翻譯(dynamic?binary?translation,dbt),是一種在運(yùn)行時(shí)將程序指令從一種指令集轉(zhuǎn)換為當(dāng)前物理處理器指令集的方法,主要用于滿足在一種處理器上運(yùn)行異構(gòu)指令集程序的需求。以x86處理器程序在arm處理器上執(zhí)行為例,x86處理器上的程序通過動(dòng)態(tài)指令轉(zhuǎn)換后在arm處理器上實(shí)際執(zhí)行的是轉(zhuǎn)換得到的arm指令,此時(shí)如果程序發(fā)生異?;虮罎?,出錯(cuò)的指令則無法映射到原始指令,即無法確定程序崩潰時(shí)異常地址處的arm指令對(duì)應(yīng)于原始x86程序中的具體地址及指令,這導(dǎo)致基于dbt執(zhí)行的程序難以調(diào)試。
技術(shù)實(shí)現(xiàn)思路
1、有鑒于此,本發(fā)明提供了一種基于自反射機(jī)制的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,通過異構(gòu)程序在目標(biāo)處理器上的預(yù)轉(zhuǎn)換實(shí)現(xiàn)基于dbt執(zhí)行的程序的可調(diào)試。
2、本發(fā)明提供的一種基于自反射機(jī)制的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,具體包括以下步驟:
3、步驟1、在目標(biāo)處理器中以動(dòng)態(tài)指令轉(zhuǎn)換方式啟動(dòng)異構(gòu)程序的執(zhí)行,將當(dāng)前待轉(zhuǎn)換后執(zhí)行的指令記為當(dāng)前源指令,將當(dāng)前源指令的地址記為當(dāng)前源指令地址;
4、步驟2、若當(dāng)前源指令為源分割指令則執(zhí)行步驟3,否則執(zhí)行步驟4;
5、步驟3、將當(dāng)前源指令轉(zhuǎn)換為目標(biāo)指令集中的目標(biāo)非法指令,并在目標(biāo)非法指令后添加當(dāng)前源指令地址,將目標(biāo)非法指令及當(dāng)前源指令地址保存到目標(biāo)指令緩存中,執(zhí)行步驟5;
6、步驟4、將當(dāng)前源指令轉(zhuǎn)換為目標(biāo)指令集中對(duì)應(yīng)的一個(gè)或多個(gè)目標(biāo)指令,由目標(biāo)指令構(gòu)成當(dāng)前目標(biāo)指令序列;在當(dāng)前目標(biāo)指令序列后添加由分割指令及當(dāng)前源指令地址組成的分割指令塊,將當(dāng)前目標(biāo)指令序列及分割指令塊保存到目標(biāo)指令緩存中,執(zhí)行步驟5;
7、步驟5、若異構(gòu)程序內(nèi)存在未轉(zhuǎn)換的指令,則以下一指令為當(dāng)前源指令執(zhí)行步驟2;否則在目標(biāo)指令緩存中添加目標(biāo)非法指令的異常處理代碼并恢復(fù)異常,形成第一目標(biāo)程序;
8、步驟6、在目標(biāo)指令集中執(zhí)行第一目標(biāo)程序,將執(zhí)行過程產(chǎn)生異?;虮罎⒌哪繕?biāo)指令地址記為異常目標(biāo)地址,在目標(biāo)指令緩存中從異常目標(biāo)地址向高地址方向搜索,當(dāng)?shù)谝淮纬霈F(xiàn)分割指令時(shí)獲取其所在的分割指令塊,從分割指令塊提取當(dāng)前源指令地址確定異常或崩潰所對(duì)應(yīng)的異構(gòu)程序中源指令的位置,完成調(diào)試。
9、進(jìn)一步地,所述當(dāng)前源指令地址表示為相對(duì)于基地址的偏移地址,所述基地址為異構(gòu)程序的起始地址。
10、進(jìn)一步地,所述分割指令為目標(biāo)指令集中的空指令,所述源分割指令為源指令集中的空指令。
11、進(jìn)一步地,所述目標(biāo)非法指令為目標(biāo)指令集中長(zhǎng)度為一字節(jié)或兩字節(jié)的非法指令。
12、進(jìn)一步地,所述當(dāng)前源指令地址以立即數(shù)的形式表示,在當(dāng)前源指令地址需要被拆分為多個(gè)當(dāng)前源指令子地址時(shí)分割指令塊包含多個(gè)由分割指令與當(dāng)前源指令子地址形成的組合。
13、進(jìn)一步地,所述分割指令塊的構(gòu)建過程包括:
14、步驟4.1、根據(jù)目標(biāo)指令集中立即數(shù)的表示方式,確定當(dāng)前源指令地址所需拆分為當(dāng)前源指令子地址的數(shù)量n,將當(dāng)前源指令地址拆分為n個(gè)立即數(shù);令序列號(hào)n的取值為1,n的最大值為n;
15、步驟4.2、添加分割指令,若n=1則執(zhí)行步驟4.3,否則執(zhí)行步驟4.4;
16、步驟4.3、添加第一目標(biāo)指令,第一目標(biāo)指令的操作數(shù)分別為預(yù)留寄存器和由當(dāng)前源指令地址拆分得到的第n個(gè)立即數(shù),執(zhí)行步驟4.5;
17、步驟4.4、添加第二目標(biāo)指令,第二目標(biāo)指令的操作數(shù)分別為預(yù)留內(nèi)存地址和由當(dāng)前源指令地址拆分得到的第n個(gè)立即數(shù),執(zhí)行步驟4.5;
18、步驟4.5、若n不大于n則令n自加1后執(zhí)行步驟4.2,否則結(jié)束本流程。
19、進(jìn)一步地,所述步驟5中所述目標(biāo)非法指令的異常處理代碼為:當(dāng)捕獲的異常為目標(biāo)非法指令產(chǎn)生的異常時(shí),獲取異常地址及該異常地址處的當(dāng)前源指令地址,并將異常地址、目標(biāo)非法指令的長(zhǎng)度及當(dāng)前源指令地址的長(zhǎng)度之和作為恢復(fù)執(zhí)行地址;重置異常信息后,以恢復(fù)執(zhí)行地址為起始地址重新開始執(zhí)行。
20、進(jìn)一步地,所述步驟6中所述從分割指令塊提取當(dāng)前源指令地址的方式為:從分割指令塊中提取所有由分割指令與當(dāng)前源指令子地址形成的組合,由所有當(dāng)前源指令子地址從低地址向高地址的方向順序拼接形成當(dāng)前源指令地址。
21、進(jìn)一步地,當(dāng)異構(gòu)程序存在符號(hào)文件時(shí)根據(jù)獲取的產(chǎn)生異?;虮罎⒌漠悩?gòu)程序中當(dāng)前源指令地址定位其所在源代碼文件的文件名及其在文件中的行號(hào)。
22、有益效果
23、本發(fā)明基于自反射機(jī)制修改dbt引擎,將目標(biāo)處理器的目標(biāo)指令集中不影響原異構(gòu)程序上下文的特定指令作為分割指令,并將其中的特定非法指令作為目標(biāo)非法指令,在動(dòng)態(tài)指令轉(zhuǎn)換過程中為由每個(gè)源指令轉(zhuǎn)換得到的目標(biāo)指令序列添加分割指令塊,并將源分割指令轉(zhuǎn)換為目標(biāo)非法指令,實(shí)現(xiàn)異構(gòu)程序在目標(biāo)處理器上的預(yù)轉(zhuǎn)換得到對(duì)應(yīng)的目標(biāo)程序,在目標(biāo)指令集中調(diào)試執(zhí)行該目標(biāo)程序時(shí)即可定位產(chǎn)生異?;虮罎⒌漠悩?gòu)程序內(nèi)源指令的地址,實(shí)現(xiàn)了基于dbt執(zhí)行的程序的可調(diào)試。
1.一種基于自反射機(jī)制的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,具體包括以下步驟:
2.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述當(dāng)前源指令地址表示為相對(duì)于基地址的偏移地址,所述基地址為異構(gòu)程序的起始地址。
3.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述分割指令為目標(biāo)指令集中的空指令,所述源分割指令為源指令集中的空指令。
4.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述目標(biāo)非法指令為目標(biāo)指令集中長(zhǎng)度為一字節(jié)或兩字節(jié)的非法指令。
5.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述當(dāng)前源指令地址以立即數(shù)的形式表示,在當(dāng)前源指令地址需要被拆分為多個(gè)當(dāng)前源指令子地址時(shí)分割指令塊包含多個(gè)由分割指令與當(dāng)前源指令子地址形成的組合。
6.根據(jù)權(quán)利要求5所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述分割指令塊的構(gòu)建過程包括:
7.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述步驟5中所述目標(biāo)非法指令的異常處理代碼為:當(dāng)捕獲的異常為目標(biāo)非法指令產(chǎn)生的異常時(shí),獲取異常地址及該異常地址處的當(dāng)前源指令地址,并將異常地址、目標(biāo)非法指令的長(zhǎng)度及當(dāng)前源指令地址的長(zhǎng)度之和作為恢復(fù)執(zhí)行地址;重置異常信息后,以恢復(fù)執(zhí)行地址為起始地址重新開始執(zhí)行。
8.根據(jù)權(quán)利要求5所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,所述步驟6中所述從分割指令塊提取當(dāng)前源指令地址的方式為:從分割指令塊中提取所有由分割指令與當(dāng)前源指令子地址形成的組合,由所有當(dāng)前源指令子地址從低地址向高地址的方向順序拼接形成當(dāng)前源指令地址。
9.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)指令轉(zhuǎn)換調(diào)試方法,其特征在于,當(dāng)異構(gòu)程序存在符號(hào)文件時(shí)根據(jù)獲取的產(chǎn)生異?;虮罎⒌漠悩?gòu)程序中當(dāng)前源指令地址定位其所在源代碼文件的文件名及其在文件中的行號(hào)。