專利名稱:一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及編譯器的開發(fā)與測(cè)試技術(shù)領(lǐng)域,更具體地說(shuō),涉及一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法和裝置。
背景技術(shù):
在編譯器的研制開發(fā)過(guò)程中,通常利用大型應(yīng)用軟件(例如SPEC的基準(zhǔn)測(cè)試包) 對(duì)編譯器進(jìn)行測(cè)試。然而,大型應(yīng)用軟件的代碼量很大,涉及的函數(shù)數(shù)量成百上千,一旦編譯器有問(wèn)題導(dǎo)致應(yīng)用軟件出錯(cuò),問(wèn)題定位非常耗時(shí),很難對(duì)其出錯(cuò)位置以及造成錯(cuò)誤的編譯器方面的原因進(jìn)行快速定位。因此,如何對(duì)運(yùn)行錯(cuò)誤進(jìn)行快速定位是編譯器研制開發(fā)過(guò)程中迫切需要解決的問(wèn)題。編譯器的編譯過(guò)程大致可以分為詞法分析、語(yǔ)法分析、語(yǔ)義分析、優(yōu)化以及代碼生成。前端的詞法分析、語(yǔ)法分析、語(yǔ)義分析生成中端代碼,中端代碼優(yōu)化后生成后端代碼, 后端代碼優(yōu)化后得到編譯后的目標(biāo)碼。在利用大型應(yīng)用程序?qū)幾g器進(jìn)行測(cè)試過(guò)程中,出錯(cuò)信息主要包括三個(gè)方面,分別為出錯(cuò)區(qū)域、導(dǎo)致錯(cuò)誤的優(yōu)化選項(xiàng)、導(dǎo)致錯(cuò)誤的優(yōu)化階段。 其中,出錯(cuò)區(qū)域是指測(cè)試用的大型應(yīng)用程序運(yùn)行時(shí)錯(cuò)誤的出現(xiàn)位置,出錯(cuò)區(qū)域可以分為源文件、函數(shù)單元、控制流圖的區(qū)域、區(qū)域中的基本塊、基本塊中的指令。當(dāng)定位的錯(cuò)誤區(qū)域的范圍越小,就越有利于研究人員做后續(xù)的分析工作。傳統(tǒng)的方法是利用調(diào)試器對(duì)運(yùn)行過(guò)程中的錯(cuò)誤進(jìn)行手工定位,進(jìn)而分析出錯(cuò)的原因。但這種方法對(duì)編譯器的問(wèn)題定位十分低效,因?yàn)榫幾g器出錯(cuò)對(duì)應(yīng)用程序的影響是指令級(jí),面對(duì)指令級(jí)的錯(cuò)誤調(diào)試難度非常大,若錯(cuò)誤位置范圍過(guò)大,編譯器開發(fā)人員需要耗費(fèi)大量的時(shí)間和精力用于進(jìn)一步定位錯(cuò)誤的位置。已有的改進(jìn)方法是針對(duì)編譯器出錯(cuò)的優(yōu)化選項(xiàng)編譯源程序生成包含錯(cuò)誤的目標(biāo)文件集合E,同時(shí)針對(duì)正確的優(yōu)化選項(xiàng)生成正確的目標(biāo)文件集合C,然后把E中的一部分目標(biāo)文件El和C中的一部分目標(biāo)文件Cl鏈接成一個(gè)可執(zhí)行碼,若該可執(zhí)行碼執(zhí)行正確,則說(shuō)明錯(cuò)誤的目標(biāo)文件應(yīng)該在E-El中;若該執(zhí)行碼執(zhí)行錯(cuò)誤,則說(shuō)明錯(cuò)誤的目標(biāo)文件應(yīng)該在El 中。這樣通過(guò)二分的方法可以快速找到錯(cuò)誤的目標(biāo)文件。一個(gè)目標(biāo)文件中往往包含許多函數(shù),下一步需要把目標(biāo)文件分裂成多個(gè)文件,每個(gè)文件只包含一個(gè)函數(shù),然后再采用該方法最終確定出錯(cuò)的函數(shù)。上述改進(jìn)方法可通過(guò)手工進(jìn)行,為進(jìn)一步增加錯(cuò)誤定位的效率,現(xiàn)有技術(shù)中也有將上述過(guò)程自動(dòng)化,以實(shí)現(xiàn)自動(dòng)定位的方法。通過(guò)發(fā)明人的研究發(fā)現(xiàn),現(xiàn)有針對(duì)編譯器中的錯(cuò)誤進(jìn)行自動(dòng)定位的方法仍然存在一些不足之處1、有些錯(cuò)誤不是由編譯器的某種特定優(yōu)化造成的,這時(shí)不能通過(guò)調(diào)整選項(xiàng)而編譯出正確的目標(biāo)碼集合,解決方法是可以采用系統(tǒng)中的標(biāo)準(zhǔn)編譯器(如GCC)產(chǎn)生正確目標(biāo)碼集合,但定位到一個(gè)文件內(nèi)后就無(wú)法進(jìn)一步定位到同一源文件內(nèi)具體的函數(shù);2、處理時(shí)間慢前期準(zhǔn)備工作比較復(fù)雜,需要先準(zhǔn)備好目標(biāo)文件集合和文件中的函數(shù)集合,自動(dòng)定位工具每一次處理過(guò)程都需要進(jìn)行重新鏈接,生成一個(gè)新的可執(zhí)行程序。 當(dāng)錯(cuò)誤已經(jīng)縮小到一個(gè)目標(biāo)文件時(shí),再對(duì)發(fā)生錯(cuò)誤的選項(xiàng)進(jìn)行定位時(shí),需要對(duì)該源程序文件進(jìn)行重新編譯,然后再進(jìn)行目標(biāo)代碼鏈接,生成一個(gè)新的可執(zhí)行程序。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明實(shí)施例提供一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法和裝置,以實(shí)現(xiàn)對(duì)編譯器錯(cuò)誤的快速、自動(dòng)查找。本發(fā)明實(shí)施例提供一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,所述方法包括利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;利用所述程序加載工具分別從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。優(yōu)選的,利用所述程序加載工具根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行碼,按照可執(zhí)行程序指定的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間。優(yōu)選的,所述方法還包括利用所述程序加載工具修改所述運(yùn)行空間中的內(nèi)容,實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制;修改完成后轉(zhuǎn)入所述可執(zhí)行程序的入口函數(shù),再次啟動(dòng)所述可執(zhí)行程序的運(yùn)行。優(yōu)選的,所述第一可執(zhí)行程序和第二可執(zhí)行程序分別運(yùn)行的運(yùn)行空間不同,運(yùn)行所述第一可執(zhí)行程序和第二可執(zhí)行程序的運(yùn)行空間與所述程序加載工具的地址空間也不同。優(yōu)選的,實(shí)現(xiàn)所述第一可執(zhí)行碼和第二可執(zhí)行碼分別運(yùn)行的地址空間不同的方式包括通過(guò)不同的鏈接腳本實(shí)現(xiàn),在鏈接腳本中指定對(duì)應(yīng)可執(zhí)行碼的可執(zhí)行程序?qū)?yīng)的靜態(tài)空間的起始地址。優(yōu)選的,所述將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間,具體包括將第二可執(zhí)行程序的全局偏移表中的運(yùn)行地址改為第一可執(zhí)行程序中對(duì)應(yīng)的運(yùn)行地址數(shù)據(jù);遍歷第二可執(zhí)行程序中的重定位信息,將涉及到全局符號(hào)地址重定位的地址數(shù)據(jù)修改為第一可執(zhí)行程序?qū)?yīng)的運(yùn)行地址數(shù)據(jù)。優(yōu)選的,利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,具體包括4-1、由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序,將考察排序范圍的最低點(diǎn)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值設(shè)置為中間點(diǎn)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);4-2、判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果否,則將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行;如果運(yùn)行出現(xiàn)錯(cuò)誤,則第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);如果運(yùn)行正確,則第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);如果是,則將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,如果運(yùn)行結(jié)果正確, 則轉(zhuǎn)入步驟4-3 ;否則,轉(zhuǎn)入步驟4-4 ;4-3、將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后按照步驟4-2對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;
4-4、將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后按照步驟4-2對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置,所述裝置包括可執(zhí)行碼生成模塊,用于利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;可執(zhí)行程序運(yùn)行模塊,用于利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;錯(cuò)誤函數(shù)定位模塊,用于利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。優(yōu)選的,所述可執(zhí)行程序運(yùn)行模塊,包括讀寫子模塊,用于利用所述程序加載工具根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行碼, 按照可執(zhí)行程序的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間;修改子模塊,利用所述程序加載工具修改所述運(yùn)行空間中的內(nèi)容,實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制;修改完成后轉(zhuǎn)入所述可執(zhí)行程序的入口函數(shù),再次啟動(dòng)所述可執(zhí)行程序的運(yùn)行。優(yōu)選的,所述錯(cuò)誤函數(shù)定位模塊,包括函數(shù)設(shè)置子模塊,用于由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序,將考察排序范圍的最低點(diǎn)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值設(shè)置為中間點(diǎn)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);
7
判斷子模塊,用于判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果否,則觸發(fā)第一結(jié)果子模塊;如果是,則觸發(fā)第二結(jié)果子模塊;第一結(jié)果子模塊,用于將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行;如果運(yùn)行出現(xiàn)錯(cuò)誤,則第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);如果運(yùn)行正確,則第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);第二結(jié)果子模塊,用于將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,如果運(yùn)行結(jié)果正確,則觸發(fā)第三結(jié)果子模塊;否則,觸發(fā)第四結(jié)果子模塊;第三結(jié)果子模塊,用于將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;第四結(jié)果子模塊,用于將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。同現(xiàn)有技術(shù)相比,本發(fā)明提供的技術(shù)方案通過(guò)函數(shù)替換,能夠把錯(cuò)誤定位到函數(shù)一級(jí),直接針對(duì)可執(zhí)行碼中的函數(shù)進(jìn)行錯(cuò)誤定位;此外,本發(fā)明提供的技術(shù)方案中,關(guān)于錯(cuò)誤定位的前期準(zhǔn)備工作簡(jiǎn)單,只需準(zhǔn)備好正確的可執(zhí)行碼和錯(cuò)誤的可執(zhí)行碼,每一次處理過(guò)程只是對(duì)兩個(gè)可執(zhí)行碼中的函數(shù)進(jìn)行重新組合并運(yùn)行,不需要進(jìn)行可執(zhí)行程序的重新編譯或鏈接操作,因此,錯(cuò)誤定位的時(shí)間更快。
為了更清楚地說(shuō)明本發(fā)明實(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í)施例一提供的一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法流程示意圖;圖2為圖1中步驟103的具體實(shí)現(xiàn)流程示意圖;圖3為圖1中步驟104的具體實(shí)現(xiàn)流程示意圖;圖4為本發(fā)明實(shí)施例二提供的一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法示意圖;圖5為本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置結(jié)構(gòu)示意圖;圖6為圖5中可執(zhí)行程序運(yùn)行模塊的結(jié)構(gòu)示意圖;圖7為圖5中錯(cuò)誤函數(shù)定位模塊的結(jié)構(gòu)示意圖。
具體實(shí)施例方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。首先對(duì)本發(fā)明提供的實(shí)施例一中一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法進(jìn)行說(shuō)明。本發(fā)明實(shí)施例的目的在于通過(guò)在程序加載時(shí)從可執(zhí)行程序一級(jí)進(jìn)行函數(shù)替換操作,從而避免編譯器對(duì)可執(zhí)行程序進(jìn)行的重新鏈接和編譯操作,節(jié)約了錯(cuò)誤定位的時(shí)間。參照?qǐng)D1所示,所述實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法包括步驟101、利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;步驟102、利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;步驟103、利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。本發(fā)明實(shí)施例中,第一可執(zhí)行碼是由已知的標(biāo)準(zhǔn)編譯器(即正確的編譯器)生成, 因此,對(duì)應(yīng)第一可執(zhí)行碼的第一可執(zhí)行程序是使用已知在正確的編譯器版本以及正確的編譯選項(xiàng)進(jìn)行編譯后所得到的正確的可執(zhí)行程序文件集合;第二可執(zhí)行碼是由當(dāng)前待檢測(cè)的編譯器(即發(fā)生錯(cuò)誤的編譯器)生成,同理,對(duì)應(yīng)第二可執(zhí)行碼的第二可執(zhí)行程序是使用發(fā)生錯(cuò)誤的編譯器以及發(fā)生錯(cuò)誤的編譯選項(xiàng)進(jìn)行編譯后所得到的錯(cuò)誤的可執(zhí)行程序文件集
I=I O本發(fā)明提供的技術(shù)方案能夠基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,利用程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中直接選取函數(shù),從而利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,在與標(biāo)準(zhǔn)編譯器產(chǎn)生的正確的可執(zhí)行碼進(jìn)行對(duì)比時(shí),也可以把出錯(cuò)范圍定位到一個(gè)函數(shù)??梢?,本發(fā)明實(shí)施例通過(guò)函數(shù)替換,可以直接將編譯器中的錯(cuò)誤定位到函數(shù)一級(jí),而不是一個(gè)文件。由于不需要利用編譯器所提供的函數(shù)的優(yōu)化開關(guān)選項(xiàng)實(shí)現(xiàn)函數(shù)的定位,因此, 能夠節(jié)省編譯器在對(duì)函數(shù)進(jìn)行優(yōu)化而進(jìn)行的可執(zhí)行程序的重新編譯或鏈接操作,因此,錯(cuò)誤定位的時(shí)間更快。此外,本發(fā)明提供的技術(shù)方案中,關(guān)于錯(cuò)誤定位的前期準(zhǔn)備工作簡(jiǎn)單,只需準(zhǔn)備好正確的可執(zhí)行碼和錯(cuò)誤的可執(zhí)行碼,后面的操作完全自動(dòng)進(jìn)行。本發(fā)明實(shí)施例中,實(shí)現(xiàn)一個(gè)程序加載工具是實(shí)現(xiàn)本發(fā)明的基礎(chǔ)。所述的程序加載工具是一個(gè)正常的程序,它能夠根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行程序,按照可執(zhí)行程序的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間。需要說(shuō)明的是,第一可執(zhí)行程序和第二可執(zhí)行程序的分別運(yùn)行的運(yùn)行空間不同, 可以通過(guò)在程序加載工具鏈接可執(zhí)行程序時(shí)指定鏈接腳本來(lái)實(shí)現(xiàn),利用程序加載工具在鏈接腳本中指定對(duì)應(yīng)可執(zhí)行程序?qū)?yīng)的靜態(tài)空間的起始地址。為了能申請(qǐng)到可執(zhí)行程序指定的地址空間,程序加載工具使用的地址空間與可執(zhí)行程序使用的運(yùn)行空間不能沖突,也就是要保證程序加載工具使用的地址空間與可執(zhí)行程序使用的運(yùn)行空間不同,因此,本發(fā)明實(shí)施例中運(yùn)行所述第一可執(zhí)行程序和第二可執(zhí)行程序的運(yùn)行空間與所述程序加載工具的地址空間不同。此外,本發(fā)明實(shí)施例在具體實(shí)施時(shí),可以利用程序加載工具根據(jù)需要修改可執(zhí)行程序運(yùn)行空間中的內(nèi)容,從而實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制,修改完成后轉(zhuǎn)入可執(zhí)行程序的入口函數(shù),再次啟動(dòng)可執(zhí)行程序的運(yùn)行。另外,為了能夠利用程序加載工具實(shí)現(xiàn)兩個(gè)可執(zhí)行程序中函數(shù)之間可以進(jìn)行替換,編譯鏈接時(shí)需要保留可執(zhí)行程序的重定位信息,可以通過(guò)在程序加載工具鏈接可執(zhí)行程序時(shí)增加選項(xiàng)以保留程序的重定位信息的方式實(shí)現(xiàn)。為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式
做詳細(xì)的說(shuō)明。如圖2所示,為上述實(shí)施例一中步驟102的具體實(shí)現(xiàn)流程,可以包括以下步驟步驟201、所述程序加載工具按照所述第一可執(zhí)行程序和第二可執(zhí)行程序指定的地址申請(qǐng)相應(yīng)運(yùn)行空間,并將相應(yīng)讀入的所述第一可執(zhí)行程序和第二可執(zhí)行程序的內(nèi)容寫入所述運(yùn)行空間;該步驟中,利用程序加載工具在鏈接腳本中指定對(duì)應(yīng)可執(zhí)行程序?qū)?yīng)的靜態(tài)空間的起始地址,使得所述第一可執(zhí)行程序和第二可執(zhí)行程序的運(yùn)行空間不同;隨后,利用程序加載工具按照所述第一可執(zhí)行程序和第二可執(zhí)行程序的地址申請(qǐng)相應(yīng)的運(yùn)行空間,將讀入的所述第一可執(zhí)行程序和第二可執(zhí)行程序的內(nèi)容寫入對(duì)應(yīng)的運(yùn)行空間;步驟202、將第二可執(zhí)行程序的全局偏移表(GOT)中的地址改為第一可執(zhí)行程序中對(duì)應(yīng)的運(yùn)行地址數(shù)據(jù);通過(guò)將出錯(cuò)的第二可執(zhí)行程序的全局偏移表(GOT)中的地址改為正確的第一可執(zhí)行程序中對(duì)應(yīng)的地址數(shù)據(jù),實(shí)現(xiàn)將出錯(cuò)的可執(zhí)行程序中直接使用GOT表尋址的情況映射到正確的可執(zhí)行程序的地址空間中;步驟203、遍歷第二可執(zhí)行程序中的重定位信息,將涉及到全局符號(hào)地址重定位的地址數(shù)據(jù)修改為第一可執(zhí)行程序?qū)?yīng)的運(yùn)行地址數(shù)據(jù);步驟203執(zhí)行之后,出錯(cuò)的第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)都已經(jīng)被映射到正確的第一可執(zhí)行程序的地址空間,若需要從出錯(cuò)的第二可執(zhí)行程序中選一個(gè)函數(shù)替換正確的第一可執(zhí)行程序中的相應(yīng)函數(shù),只要遍歷正確的第一可執(zhí)行程序中的重定位信息,凡是涉及到調(diào)用該函數(shù)的地方都修改成調(diào)用出錯(cuò)的第二可執(zhí)行程序中對(duì)應(yīng)的函數(shù),從而完成相應(yīng)的替換操作。在錯(cuò)誤函數(shù)集合中,發(fā)生錯(cuò)誤的函數(shù)可能不止一個(gè),利用二分法和替代法一次只能查找到一個(gè)出錯(cuò)函數(shù)。因此,可以通過(guò)二分法和替代法的反復(fù)使用,實(shí)現(xiàn)對(duì)出錯(cuò)函數(shù)的逐
一定位。由于正確的第一可執(zhí)行程序和錯(cuò)誤的第二可執(zhí)行程序由相同的源文件經(jīng)過(guò)不同版本的編譯器編譯后生成,因此,正確的第一可執(zhí)行程序和錯(cuò)誤的第二可執(zhí)行程序中包含的函數(shù)數(shù)量相同,并且一一對(duì)應(yīng)。本發(fā)明實(shí)施例中,在綜合運(yùn)用二分法和替代法進(jìn)行錯(cuò)誤定位時(shí),將編譯器出錯(cuò)的區(qū)域從一個(gè)文件縮小到一個(gè)函數(shù),使分析工作縮小至函數(shù)。如圖3所示,為上述實(shí)施例一中步驟103的實(shí)現(xiàn)流程,可以包括以下步驟步驟301、由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序,將考察排序范圍的最低點(diǎn)(low)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)(high)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值 (high+low)/2設(shè)置為中間點(diǎn)(mid)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);步驟302、判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果判斷條件不成立,則繼續(xù)步驟303 ;如果判斷條件成立,則繼續(xù)步驟304 ;步驟303、將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行;如果運(yùn)行出現(xiàn)錯(cuò)誤,則繼續(xù)步驟305 ;如果運(yùn)行正確,則繼續(xù)步驟306 ;步驟304、將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,觀察運(yùn)行結(jié)果是否正確,若正確則轉(zhuǎn)入步驟307,否則轉(zhuǎn)入步驟308 ;步驟305、第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);步驟306、第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);步驟307、重新設(shè)置最低點(diǎn)的值,將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后返回步驟302,對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;步驟308、重新設(shè)置最高點(diǎn)的值,將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后返回步驟302,對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。可見,利用程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中直接選取函數(shù),從而利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,在與標(biāo)準(zhǔn)編譯器產(chǎn)生的正確的可執(zhí)行碼進(jìn)行對(duì)比時(shí),也可以把出錯(cuò)范圍定位到一個(gè)函數(shù)。本發(fā)明實(shí)施例通過(guò)函數(shù)替換,可以直接將編譯器中的錯(cuò)誤定位到函數(shù)一級(jí),而不是一個(gè)文件。由于不需要利用編譯器所提供的函數(shù)的優(yōu)化開關(guān)選項(xiàng)實(shí)現(xiàn)函數(shù)的定位,因此,能夠節(jié)省編譯器在對(duì)函數(shù)進(jìn)行優(yōu)化而進(jìn)行的可執(zhí)行程序的重新編譯或鏈接操作,因此,錯(cuò)誤定位的時(shí)間更快。為了清楚說(shuō)明本發(fā)明實(shí)施例的實(shí)現(xiàn)過(guò)程,圖4示出了本方案實(shí)施例二的完整實(shí)現(xiàn)流程,主要包括以下步驟步驟401、用正確的編譯器編譯正確的第一可執(zhí)行程序;步驟402、用當(dāng)前待檢測(cè)的編譯器編譯錯(cuò)誤的第二可執(zhí)行程序;步驟403、設(shè)第一可執(zhí)行程序和第二可執(zhí)行程中均包含有η個(gè)函數(shù),最低點(diǎn)low = 1,最高點(diǎn) high = n,中間點(diǎn) mid = (low+high)/2 ;該步驟中,由于正確的第一可執(zhí)行程序和錯(cuò)誤的第二可執(zhí)行程序由相同的源文件經(jīng)過(guò)不同版本的編譯器編譯后生成,因此,正確的第一可執(zhí)行程序和錯(cuò)誤的第二可執(zhí)行程序中包含的函數(shù)數(shù)量相同,并且一一對(duì)應(yīng);步驟404、設(shè)置可能發(fā)生錯(cuò)誤的函數(shù)集合[low,mid];步驟405、判斷Low < high-1是否成立,如果判斷條件不成立,則繼續(xù)步驟406 ;如果判斷條件成立,則繼續(xù)步驟407 ;步驟406、取錯(cuò)誤函數(shù)集合中第low個(gè)函數(shù),替代正確函數(shù)中第low個(gè)函數(shù),與正確函數(shù)集合中的其他函數(shù)組成可執(zhí)行程序運(yùn)行,如果運(yùn)行出現(xiàn)錯(cuò)誤,則繼續(xù)步驟408;如果運(yùn)行正確,則繼續(xù)步驟409 ;步驟407、取錯(cuò)誤函數(shù)集合中[low,mid]的所有函數(shù),替代正確函數(shù)集合中[low, mid]的所有函數(shù),其余取正確函數(shù)集合中的其他函數(shù)組成可執(zhí)行程序運(yùn)行,觀察運(yùn)行結(jié)果是否正確,若正確則轉(zhuǎn)入步驟410,否則轉(zhuǎn)入步驟411 ;步驟408、最低點(diǎn)low的函數(shù)就是所求錯(cuò)誤函數(shù);步驟409、最高點(diǎn)high的函數(shù)即為所求錯(cuò)誤函數(shù);步驟410、重新設(shè)置最低點(diǎn)low’的值,將原中間點(diǎn)mid的值賦給最低點(diǎn)low’,并根據(jù)最高點(diǎn)high的值和新的最低點(diǎn)low’的值重新計(jì)算中間點(diǎn)mid’的值,然后按照步驟405 對(duì)最低點(diǎn)low’和最高點(diǎn)high間的函數(shù)重新進(jìn)行判斷;步驟411、重新設(shè)置最高點(diǎn)high’的值,將原中間點(diǎn)mid的值賦給最高點(diǎn)high’,并根據(jù)最低點(diǎn)low的值和新的最高點(diǎn)high’的值重新計(jì)算中間點(diǎn)的值,然后按照步驟405對(duì)最低點(diǎn)low和最高點(diǎn)high’間的函數(shù)重新進(jìn)行判斷。本發(fā)明提供的技術(shù)方案能夠利用程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中直接選取函數(shù),從而利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,在與標(biāo)準(zhǔn)編譯器產(chǎn)生的正確的可執(zhí)行碼進(jìn)行對(duì)比時(shí),也可以把出錯(cuò)范圍定位到一個(gè)函數(shù)??梢姡景l(fā)明實(shí)施例通過(guò)函數(shù)替換,可以直接將編譯器中的錯(cuò)誤定位到函數(shù)一級(jí),而不是一個(gè)文件。由于不需要利用編譯器所提供的函數(shù)的優(yōu)化開關(guān)選項(xiàng)實(shí)現(xiàn)函數(shù)的定位,因此,能夠節(jié)省編譯器在對(duì)函數(shù)進(jìn)行優(yōu)化而進(jìn)行的可執(zhí)行程序的重新編譯或鏈接操作, 錯(cuò)誤定位的時(shí)間更快。相應(yīng)上述實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法實(shí)施例,本發(fā)明還提供了一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置,如圖5所示,所述裝置包括可執(zhí)行碼生成模塊501,用于利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;可執(zhí)行程序運(yùn)行模塊502,用于利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;錯(cuò)誤函數(shù)定位模塊503,用于利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。在本發(fā)明提供的一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置的優(yōu)選實(shí)施例中,如圖6所示,所述可執(zhí)行程序運(yùn)行模塊502可以包括讀寫子模塊5021,用于利用所述程序加載工具根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行碼,按照可執(zhí)行程序的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間;修改子模塊5022,用于利用所述程序加載工具修改所述運(yùn)行空間中的內(nèi)容,實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制;修改完成后轉(zhuǎn)入所述可執(zhí)行程序的入口函數(shù),再次啟動(dòng)所述可執(zhí)行程序的運(yùn)行。此外,在本發(fā)明提供的另一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置的優(yōu)選實(shí)施例中, 如圖7所示,所述錯(cuò)誤函數(shù)定位模塊503可以包括函數(shù)設(shè)置子模塊5031,用于由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序,將考察排序范圍的最低點(diǎn)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值設(shè)置為中間點(diǎn)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);判斷子模塊5032,用于判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果否, 則觸發(fā)第一結(jié)果子模塊5043 ;如果是,則觸發(fā)第二結(jié)果子模塊5044 ;第一結(jié)果子模塊5033,用于將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行; 如果運(yùn)行出現(xiàn)錯(cuò)誤,則第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);如果運(yùn)行正確,則第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);第二結(jié)果子模塊5034,用于將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,如果運(yùn)行結(jié)果正確,則觸發(fā)第三結(jié)果子模塊5035 ;否則,觸發(fā)第四結(jié)果子模塊5036 ;第三結(jié)果子模塊5035,用于將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;第四結(jié)果子模塊5036,用于將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。本發(fā)明提供的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置技術(shù)方案通過(guò)函數(shù)替換,可以直接將編譯器中的錯(cuò)誤定位到函數(shù)一級(jí),而不是一個(gè)文件。由于不需要利用編譯器所提供的函數(shù)的優(yōu)化開關(guān)選項(xiàng)實(shí)現(xiàn)函數(shù)的定位,因此,能夠節(jié)省編譯器在對(duì)函數(shù)進(jìn)行優(yōu)化而進(jìn)行的可執(zhí)行程序的重新編譯或鏈接操作,錯(cuò)誤定位的時(shí)間更快。對(duì)于裝置實(shí)施例而言,由于其基本相應(yīng)于方法實(shí)施例,所以描述得比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上。 可以根據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例方法中的全部或部分流程,是可以通過(guò)計(jì)算機(jī)程序來(lái)指令相關(guān)的硬件來(lái)完成,所述的程序可存儲(chǔ)于計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中,該程序在執(zhí)行時(shí),可包括如上述各方法的實(shí)施例的流程。其中,所述的存儲(chǔ)介質(zhì)可為磁碟、光盤、只讀存儲(chǔ)記憶體(Read-OnlyMemory,ROM)或隨機(jī)存儲(chǔ)記憶體(Random Access Memory, RAM)等。對(duì)所公開的實(shí)施例的上述說(shuō)明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。
13對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來(lái)說(shuō)將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明實(shí)施例的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此, 本發(fā)明實(shí)施例將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。
權(quán)利要求
1.一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,所述方法包括利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;利用所述程序加載工具分別從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。
2.根據(jù)權(quán)利要求1所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,利用所述程序加載工具根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行碼,按照可執(zhí)行程序指定的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間。
3.根據(jù)權(quán)利要求2所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,所述自動(dòng)定位方法還包括在將相應(yīng)的讀入內(nèi)容寫入所述地址空間后,利用所述程序加載工具修改所述運(yùn)行空間中的內(nèi)容,實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制;修改完成后轉(zhuǎn)入所述可執(zhí)行程序的入口函數(shù),再次啟動(dòng)所述可執(zhí)行程序的運(yùn)行。
4.根據(jù)權(quán)利要求2所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,所述第一可執(zhí)行程序和第二可執(zhí)行程序分別運(yùn)行的運(yùn)行空間不同,運(yùn)行所述第一可執(zhí)行程序和第二可執(zhí)行程序的運(yùn)行空間與所述程序加載工具的地址空間也不同。
5.根據(jù)權(quán)利要求4所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,實(shí)現(xiàn)所述第一可執(zhí)行碼和第二可執(zhí)行碼分別運(yùn)行的運(yùn)行空間不同的方式包括通過(guò)不同的鏈接腳本實(shí)現(xiàn),在鏈接腳本中指定對(duì)應(yīng)可執(zhí)行碼的可執(zhí)行程序?qū)?yīng)的靜態(tài)空間的起始地址。
6.根據(jù)權(quán)利要求1所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,所述將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間,包括將第二可執(zhí)行程序的全局偏移表中的地址改為第一可執(zhí)行程序中對(duì)應(yīng)的運(yùn)行地址數(shù)據(jù);遍歷第二可執(zhí)行程序中的重定位信息,將涉及到全局符號(hào)地址重定位的地址數(shù)據(jù)修改為第一可執(zhí)行程序?qū)?yīng)的運(yùn)行地址數(shù)據(jù)。
7.根據(jù)權(quán)利要求1所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法,其特征在于,利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,具體包括4-1、由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序,將考察排序范圍的最低點(diǎn)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值設(shè)置為中間點(diǎn)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);4-2、判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果否,則將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行;如果運(yùn)行出現(xiàn)錯(cuò)誤,則第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);如果運(yùn)行正確,則第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);如果是,則將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,如果運(yùn)行結(jié)果正確,則轉(zhuǎn)入步驟4-3 ;否則,轉(zhuǎn)入步驟4-4 ;4-3、將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后按照步驟4-2對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;4-4、將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后按照步驟4-2對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。
8.一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置,其特征在于,所述裝置包括可執(zhí)行碼生成模塊,用于利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;可執(zhí)行程序運(yùn)行模塊,用于利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行,將第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)映射到第一可執(zhí)行程序的地址空間;錯(cuò)誤函數(shù)定位模塊,用于利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位,所述替代法包括基于第二可執(zhí)行程序中使用的全局?jǐn)?shù)據(jù)與第一可執(zhí)行程序的地址空間的映射關(guān)系,以第二可執(zhí)行程序中的函數(shù)替代第一可執(zhí)行程序中的相應(yīng)函數(shù)。
9.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置,其特征在于,所述可執(zhí)行程序運(yùn)行模塊,包括讀寫子模塊,用于利用所述程序加載工具根據(jù)可執(zhí)行程序的格式讀入可執(zhí)行碼,按照可執(zhí)行程序的地址空間申請(qǐng)相應(yīng)的運(yùn)行空間,并將相應(yīng)的讀入內(nèi)容寫入所述運(yùn)行空間;修改子模塊,用于利用所述程序加載工具修改所述運(yùn)行空間中的內(nèi)容,實(shí)現(xiàn)對(duì)可執(zhí)行程序的執(zhí)行控制;修改完成后轉(zhuǎn)入所述可執(zhí)行程序的入口函數(shù),再次啟動(dòng)所述可執(zhí)行程序的運(yùn)行。
10.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位裝置,其特征在于,所述錯(cuò)誤函數(shù)定位模塊,包括函數(shù)設(shè)置子模塊,用于由程序加載工具統(tǒng)計(jì)第一可執(zhí)行程序和第二可執(zhí)行程序中包含的函數(shù)數(shù)量,將所有函數(shù)分別按在第一可執(zhí)行程序和第二可執(zhí)行程序中的地址順序排序, 將考察排序范圍的最低點(diǎn)的值設(shè)為1,對(duì)應(yīng)于第一個(gè)函數(shù);將最高點(diǎn)的值設(shè)置為所述出錯(cuò)的可執(zhí)行程序中的函數(shù)總個(gè)數(shù),對(duì)應(yīng)于最后一個(gè)函數(shù);將最高點(diǎn)和最低點(diǎn)的中間值設(shè)置為中間點(diǎn)的值,對(duì)應(yīng)于位于第一個(gè)和最后一個(gè)函數(shù)中間的函數(shù);判斷子模塊,用于判斷最低點(diǎn)的值是否小于最高點(diǎn)的值與1的差值;如果否,則觸發(fā)第一結(jié)果子模塊;如果是,則觸發(fā)第二結(jié)果子模塊;第一結(jié)果子模塊,用于將第一可執(zhí)行程序中最低點(diǎn)對(duì)應(yīng)的函數(shù)替換為第二可執(zhí)行碼中最低點(diǎn)對(duì)應(yīng)的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行;如果運(yùn)行出現(xiàn)錯(cuò)誤,則第二可執(zhí)行碼中最低點(diǎn)的函數(shù)就是所求錯(cuò)誤函數(shù);如果運(yùn)行正確,則第二可執(zhí)行碼中最高點(diǎn)函數(shù)為所求錯(cuò)誤函數(shù);第二結(jié)果子模塊,用于將第一可執(zhí)行程序中最低點(diǎn)與中間點(diǎn)之間的函數(shù)替換為第二可執(zhí)行碼中的函數(shù),利用程序加載工具控制完成替換后的第一可執(zhí)行程序運(yùn)行,如果運(yùn)行結(jié)果正確,則觸發(fā)第三結(jié)果子模塊;否則,觸發(fā)第四結(jié)果子模塊;第三結(jié)果子模塊,用于將原中間點(diǎn)的值賦給最低點(diǎn),并根據(jù)原最高點(diǎn)的值和新的最低點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)重新確定的最低點(diǎn)和原最高點(diǎn)間的函數(shù)進(jìn)行判斷;第四結(jié)果子模塊,用于將原中間點(diǎn)的值賦給最高點(diǎn),并根據(jù)原最低點(diǎn)的值和新的最高點(diǎn)的值重新計(jì)算中間點(diǎn)的值,然后觸發(fā)所述第一結(jié)果子模塊,對(duì)原最低點(diǎn)和重新確定的最高點(diǎn)間的函數(shù)進(jìn)行判斷。
全文摘要
本發(fā)明公開了一種實(shí)現(xiàn)編譯器錯(cuò)誤的自動(dòng)定位方法和裝置,其中,所述方法包括利用編譯器編譯可執(zhí)行程序的源文件,包括分別用標(biāo)準(zhǔn)的編譯器生成正確的第一可執(zhí)行碼,用待定位錯(cuò)誤的編譯器生成第二可執(zhí)行碼;利用程序加載工具讀入所述第一可執(zhí)行碼和第二可執(zhí)行碼,完成對(duì)應(yīng)所述第一可執(zhí)行碼的第一可執(zhí)行程序及對(duì)應(yīng)所述第二可執(zhí)行碼的第二可執(zhí)行程序的運(yùn)行;利用所述程序加載工具控制從第一可執(zhí)行程序和第二可執(zhí)行程序中選取函數(shù),利用二分法和替代法定位實(shí)現(xiàn)對(duì)第二可執(zhí)行程序中錯(cuò)誤函數(shù)的定位。通過(guò)本發(fā)明,能夠把錯(cuò)誤定位到函數(shù)一級(jí),直接針對(duì)可執(zhí)行碼中的函數(shù)進(jìn)行錯(cuò)誤定位,并且,錯(cuò)誤定位的時(shí)間更快。
文檔編號(hào)G06F11/36GK102446134SQ20101050898
公開日2012年5月9日 申請(qǐng)日期2010年10月13日 優(yōu)先權(quán)日2010年10月13日
發(fā)明者姜軍, 張海軍, 李中升, 漆鋒濱, 王超, 白書敬 申請(qǐng)人:無(wú)錫江南計(jì)算技術(shù)研究所