專利名稱:一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法、裝置及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法、裝置及系統(tǒng)。
背景技術(shù):
經(jīng)過性數(shù)據(jù)斷點(diǎn)是軟件定位數(shù)據(jù)或指令后,進(jìn)行改寫的必要功能。經(jīng)過性數(shù)據(jù)斷點(diǎn)的基本原理是將要監(jiān)控的數(shù)據(jù)或指令地址設(shè)置到CPU的調(diào)試寄存器中,當(dāng)CPU訪問被監(jiān)控的數(shù)據(jù)或指令地址時(shí)就會(huì)觸發(fā)一個(gè)trap (陷阱)異常處理程序,處理完該trap異常處理程序后會(huì)恢復(fù)到觸發(fā)該trap異常處理程序的上下文,繼續(xù)執(zhí)行。整個(gè)過程不影響原系統(tǒng)的狀態(tài)。 但是,現(xiàn)有的Linux ARM或Unix ARM系統(tǒng)實(shí)現(xiàn)斷點(diǎn)處理時(shí)有如下問題當(dāng)源程序運(yùn)行到被監(jiān)控的數(shù)據(jù)或指令的地址處時(shí),CPU會(huì)觸發(fā)一個(gè)trap異常處理程序,在Linux ARM或Unix ARM系統(tǒng)中,由于這個(gè)trap為同步異常,所以在執(zhí)行完trap異常處理程序后,會(huì)重新執(zhí)行那條觸發(fā)trap的指令。這樣一來,又會(huì)再次觸發(fā)trap異常處理程序,結(jié)果造成循環(huán)觸發(fā),無法實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn),進(jìn)而導(dǎo)致中斷現(xiàn)有軟件系統(tǒng)的業(yè)務(wù)的問題。
發(fā)明內(nèi)容
本發(fā)明的實(shí)施例提供一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法、裝置及系統(tǒng),用以在IinuxARM或Unix ARM系統(tǒng)中實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)。為達(dá)到上述目的,本發(fā)明的實(shí)施例采用如下技術(shù)方案—方面,提供一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn);所述方法包括當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼;執(zhí)行所述解碼后的指令;重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn);將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。一方面,提供一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中;所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn);所述方法包括當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令;將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令;執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令;恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);將所述修改后的下一條指令恢復(fù)為所述備份指令。
一方面,提供一種通信系統(tǒng),所述通信系統(tǒng)包括內(nèi)存和至少一個(gè)CPU ;所述CPU中運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序,所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序;所述內(nèi)存中載入有所述源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)所述異常處理程序,所述異常處理程序還用于,當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼;執(zhí)行所述解碼后的指令;
重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn);將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。—方面,提供一種通信系統(tǒng),所述通信系統(tǒng)包括內(nèi)存和至少一個(gè)CPU ;所述CPU中運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序,所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序;所述內(nèi)存中載入有所述源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)異常處理程序,所述異常處理程序還用于,當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令;將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令;執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令;恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);將所述修改后的下一條指令恢復(fù)為所述備份指令。一方面,提供一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),其特征在于,所述經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置包括第一取消模塊,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);解碼模塊,用于對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼;第一執(zhí)行模塊,用于執(zhí)行所述解碼后的指令;設(shè)定模塊,用于重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn);指向模塊,用于將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。一方面,提供一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中;所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),其特征在于,所述經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置包括第二取消模塊,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);備份模塊,用于備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令;修改模塊,用于將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令;
第二執(zhí)行模塊,用于執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令;恢復(fù)模塊,用于恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);替換模塊,用于將所述修改后的下一條指令恢復(fù)為所述備份指令。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法、裝置及系統(tǒng),通過在異常處理程序中仿真執(zhí)行觸發(fā)異常處理程序的指令后返回源程序執(zhí)行觸發(fā)異常處理程序的指令的下一條指令,或者在異常處理程序中取消該觸發(fā)異常處理程序的數(shù)據(jù)斷點(diǎn),并保存觸發(fā)該異常處理程序的指令的下一條指令及設(shè)置該下一條指令為非法指令,從而達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且不會(huì)再次觸發(fā)異常處理程序,造成循環(huán)觸發(fā),同時(shí)還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖I為本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法;圖2為本發(fā)明實(shí)施例提供的另一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法;圖3為本發(fā)明實(shí)施例提供的又一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法;圖4a為本發(fā)明實(shí)施例的通信系統(tǒng)的一種結(jié)構(gòu)示意圖;
圖4b為本發(fā)明實(shí)施例的通信系統(tǒng)的局部邏輯示意圖;圖4c為一種傳統(tǒng)的應(yīng)用程序的編譯過程的原理不意圖;圖5為本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置;圖6為本發(fā)明實(shí)施例提供的另一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置;圖7為本發(fā)明實(shí)施例提供的又一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置。
具體實(shí)施例方式下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的LinuxARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn);該方法如圖I所示,包括S101、當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn)。具體的,取消源程序的斷點(diǎn)處的數(shù)據(jù)斷點(diǎn)可以直接調(diào)用操作系統(tǒng)中取消數(shù)據(jù)斷點(diǎn)的方法。S102、對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼。具體的,由于CPU在源程序中執(zhí)行到數(shù)據(jù)斷點(diǎn)處時(shí),觸發(fā)異常程序后,都會(huì)保存該觸發(fā)異常處理程序的指令的上下文信息,以使得CPU在執(zhí)行完異常處理程序后會(huì)恢復(fù)到被中斷的源程序的上下文繼續(xù)執(zhí)行,該過程可以通過現(xiàn)有技術(shù)實(shí)現(xiàn),在此不再贅述。該步驟中通過保存的觸發(fā)異常處理程序的指令的上下文信息,查找出該指令,由于該指令是不可預(yù)知的機(jī)器語言,所以此時(shí)需要解碼該指令以得到該指令的信息,為下一步操作奠定基礎(chǔ)。S103、執(zhí)行所述解碼后的指令。具體的,根據(jù)上步驟中解碼出的觸發(fā)異常處理程序的指令,調(diào)用相應(yīng)的方法來執(zhí)行。S104、重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn)。
具體的,可以在該異常程序中直接調(diào)用內(nèi)核提供的設(shè)置數(shù)據(jù)斷點(diǎn)的方法進(jìn)行設(shè)置。S105、將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。具體的,在執(zhí)行觸發(fā)異常處理程序前,由于沒有執(zhí)行設(shè)置有數(shù)據(jù)斷點(diǎn)的指令,所以程序計(jì)數(shù)器PC指針還是會(huì)指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令,這時(shí),為了保證CPU在執(zhí)行完異常程序后,返回源程序時(shí),執(zhí)行觸發(fā)所述異常處理程序的指令的下一條指令,就需要將PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,示例性的,可以將PC指針指向PC =PC+4的位置,并且,由異常處理程序返回到所述源程序中的過程可以通過現(xiàn)有技術(shù)可以實(shí)現(xiàn),此處不再贅述。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,通過在異常處理程序中仿真執(zhí)行觸發(fā)異常處理程序的指令后返回源程序執(zhí)行觸發(fā)異常處理程序的指令的下一條指令,從而達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且不會(huì)再次觸發(fā)異常處理程序,造成循環(huán)觸發(fā),同時(shí)還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。優(yōu)選的,如圖2所示,所述實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法還包括,S106、創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件,所述數(shù)據(jù)斷點(diǎn)文件用于記錄要監(jiān)控的斷點(diǎn)的信息。具體的,創(chuàng)建數(shù)據(jù)斷點(diǎn)文件的過程為首先,倉Il建數(shù)據(jù)斷點(diǎn)文件目錄,該步驟可以通過調(diào)用Linux系統(tǒng)中的kernel_kobj屬性來創(chuàng)建數(shù)據(jù)斷點(diǎn)目錄,示例性的,倉Il建hwbrk這個(gè)目錄,通過下列一段程序?qū)崿F(xiàn)hw_breakpoint_kobj = kobject_create_and_add( " hwbrk " , kernel_kobj);if ( ! hw_breakpoint_kobj)return-ENOMEM ;其次,在所述數(shù)據(jù)斷點(diǎn)目錄中創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件,該過程通過調(diào)用Linux系統(tǒng)內(nèi)核提供的函數(shù)來創(chuàng)建文件,如sysfs_create_group等,示例性的,在hwbrk數(shù)據(jù)斷點(diǎn)目錄下創(chuàng)建數(shù)據(jù)斷點(diǎn)的文件,可以通過以下程序代碼實(shí)現(xiàn)retval = sysfs_create_group(hw—breakpoint—kobj, &attr_group); if (retval)
kobject—put(hw—breakpoint—kobj); printk("Hardware Breakpoint Manager init...\n"); return retval;需要說明的是,可以通過在數(shù)據(jù)斷點(diǎn)文件的寫屬性中調(diào)用Linux系統(tǒng)內(nèi)核提供的與數(shù)據(jù)斷點(diǎn)相關(guān)的函數(shù)來實(shí) 現(xiàn)在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。具體的,在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)地址,根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn),同樣的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中;所述數(shù)據(jù)斷點(diǎn)文件根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。其中,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入數(shù)據(jù)后,會(huì)判斷該數(shù)據(jù)為斷點(diǎn)地址還是斷點(diǎn)參數(shù),當(dāng)該數(shù)據(jù)為斷點(diǎn)地址時(shí),該數(shù)據(jù)斷點(diǎn)文件會(huì)在源程序的相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),以使源程序運(yùn)行到該數(shù)據(jù)斷點(diǎn)處時(shí),觸發(fā)異常處理程序;當(dāng)該數(shù)據(jù)為斷點(diǎn)參數(shù)時(shí),該數(shù)據(jù)斷點(diǎn)文件會(huì)查找出該斷點(diǎn)參數(shù)相應(yīng)的斷點(diǎn)地址,并在該斷點(diǎn)地址處設(shè)置數(shù)據(jù)斷點(diǎn),以使源程序運(yùn)行到具有該斷點(diǎn)參數(shù)的指令處時(shí),觸發(fā)異常處理程序,其中,該斷點(diǎn)參數(shù)包括符號名或參數(shù)值。更具體的,可以通過以下程序代碼實(shí)現(xiàn)根據(jù)寫入的斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)
static ssizet symbol_store(struct kobject *kobj, structkobj attribute * attr, const char *buf, size—t count)
{ /*初始化數(shù)據(jù)斷點(diǎn)*/
hw_breakpoint_init(&atribs);
sscanf(buf, "%s", hwbrk data[index] symbol);
/*判斷用戶輸入的是地址還是斷點(diǎn)參數(shù)*/if (hwbrk_data[index].symbol
== '0' &&(hwbrk_data[index].symbol[I] == 'x' ||hwbrk_data[index],symbol[1 ] == 'X')) {sscanf(hwbrk_data[index], symbol, "%Lx",&atribs.bp_addr);
}
else {/*若是斷點(diǎn)參數(shù)則到符號表中去查找相應(yīng)的地址*/atribs.bp_addr=kallsyms_lookup_name(hwbrk_data[index]. symbol);
}
atribs.bplen = sizeof(long);
atribs.bp—type = hwbrk_data[index].type = hwbrktype;//HW_BREAKPOINT_W is default
if (atribs.bp addr > 0) {
hwbrk_data[index] addr = atribs.bp addr;
hwbrk_data[index] .value = *((u32*)(atribs.bp—addr));
}
/*注冊數(shù)據(jù)斷點(diǎn)及回調(diào)函數(shù)callback*/hwbrk data[index].hbp=register wide hw breakpoint(&atribs,callback)
if (IS—ERR((void ——force *)hwbrk_data[index] .hbp)) { ret = PTR—ERR((void ——force * )hwbrk_data[index].hbp);
goto fail;
}
return ret;
}
這樣,可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù)或斷點(diǎn)地址,以在源程序中相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用,需要說明的是,該斷點(diǎn)參數(shù)可以是符號名或者參數(shù)值。需要說明的是,還可以設(shè)置數(shù)據(jù)斷點(diǎn)文件的讀屬性,來對該數(shù)據(jù)斷點(diǎn)文件進(jìn)行一些操作限制,具體實(shí)現(xiàn)過程為
static ssizet symbol_show(struct kobject *kobj, structkobj attribute * attr,char *buf)
{
short index = 0;
ssize t Ien = 0;
index = getbrkindex(attr);
if (hwbrk—data[index].symbol
== '\0')return sprintf(buf, "Breakpoint not set\n");else {
Ien = sprintf(buf, "Debug symbol %s and has value 0x%d\n",hwbrk_data[index],symbol, hwbrk data[index].value);
Ien += printBreakpointT ype(buf+len);
}
return len;
}進(jìn)一步的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中;根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),該斷點(diǎn)參數(shù)的類型為可讀類型,可寫類型以及可讀可寫類型。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控?cái)帱c(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件寫入要監(jiān)控的斷點(diǎn)參數(shù)的類型,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),進(jìn)一步方便了用戶使用。需要說明的是,根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,可以通過在相應(yīng)表中查找相應(yīng)的斷點(diǎn)地址,該過程為現(xiàn)有技術(shù),此處不再贅述。示例性的,該表可以為操作系統(tǒng)中存儲的符號表,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和斷點(diǎn)參數(shù)的類型后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)類型的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。更進(jìn)一步的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中;根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址, 并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù)的范圍,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),又進(jìn)一步的方便了用戶的使用。示例性的,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和要監(jiān)控的斷點(diǎn)參數(shù)范圍后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)范圍的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。需要說明的是,當(dāng)數(shù)據(jù)斷點(diǎn)文件只寫入了上述內(nèi)容的斷點(diǎn)參數(shù),斷點(diǎn)地址,斷點(diǎn)參數(shù)的類型和斷點(diǎn)參數(shù)范圍中的任意一個(gè)或多個(gè),則其他為默認(rèn)值,顯然,這樣能夠更加靈活的通過該數(shù)據(jù)斷點(diǎn)文件在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的LinuxARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),所述方法如圖3所示,在所述異常處理程序中進(jìn)行以下操作S301、當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn)。
具體的,取消源程序的斷點(diǎn)處的數(shù)據(jù)斷點(diǎn)可以直接調(diào)用內(nèi)核中取消數(shù)據(jù)斷點(diǎn)的方法。S302、備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令。具體的,該過程可以通過現(xiàn)有技術(shù)實(shí)現(xiàn),此處不再贅述。S303、將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令。S304、執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令。需要說明的是,在執(zhí)行完步驟303后,還需要仿真執(zhí)行設(shè)置有數(shù)據(jù)斷點(diǎn)的指令,在執(zhí)行完該設(shè)置有數(shù)據(jù)斷點(diǎn)的指令后,需要返回到源程序中,執(zhí)行修改后的下一條指令,在該過程中,本領(lǐng)域技術(shù)人員可以根據(jù)本發(fā)明實(shí)施例的描述,具體完成上述過程,在此不再贅述。S305、恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn)。具體的,該過程可以通過調(diào)用內(nèi)核提供的設(shè)置數(shù)據(jù)斷點(diǎn)的方法重新設(shè)置斷點(diǎn)處的數(shù)據(jù)斷點(diǎn)。S306、將所述修改后的下一條指令恢復(fù)為所述備份指令。
本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,通過在異常處理程序中取消該觸發(fā)異常處理程序的數(shù)據(jù)斷點(diǎn),并保存觸發(fā)該異常處理程序的指令的下一條指令及設(shè)置該下一條指令為非法指令,從而達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且不會(huì)再次觸發(fā)異常處理程序,造成循環(huán)觸發(fā),同時(shí)還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。
優(yōu)選的,該實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,如圖3所示,還包括,S307、創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件,所述數(shù)據(jù)斷點(diǎn)文件用于記錄要監(jiān)控的斷點(diǎn)的信息。其中,創(chuàng)建數(shù)據(jù)斷點(diǎn)文件的過程可以參考上述實(shí)施例中的步驟106。具體的,在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)地址,根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn),同樣的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中;所述數(shù)據(jù)斷點(diǎn)文件根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。其中,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入數(shù)據(jù)后,會(huì)判斷該數(shù)據(jù)為斷點(diǎn)地址還是斷點(diǎn)參數(shù),當(dāng)該數(shù)據(jù)為斷點(diǎn)地址時(shí),該數(shù)據(jù)斷點(diǎn)文件會(huì)在源程序的相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),以使源程序運(yùn)行到該數(shù)據(jù)斷點(diǎn)處時(shí),觸發(fā)異常處理程序;當(dāng)該數(shù)據(jù)為斷點(diǎn)參數(shù)時(shí),該數(shù)據(jù)斷點(diǎn)文件會(huì)查找出該斷點(diǎn)參數(shù)相應(yīng)的斷點(diǎn)地址,并在該斷點(diǎn)地址處設(shè)置數(shù)據(jù)斷點(diǎn),以使源程序運(yùn)行到具有該斷點(diǎn)參數(shù)的指令處時(shí),觸發(fā)異常處理程序,其中,該斷點(diǎn)參數(shù)包括符號名或參數(shù)值。這樣,可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)值或地址,以在源程序中相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用。進(jìn)一步的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中;根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),該斷點(diǎn)參數(shù)的類型為可讀類型,可寫類型以及可讀可寫類型。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控?cái)帱c(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件寫入要監(jiān)控的斷點(diǎn)參數(shù)的類型,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),進(jìn)一步方便了用戶使用。需要說明的是,根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,可以通過在相應(yīng)表中查找相應(yīng)的斷點(diǎn)地址,該過程為現(xiàn)有技術(shù),此處不再贅述。示例性的,該表可以為操作系統(tǒng)中存儲的符號表,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和斷點(diǎn)參數(shù)的類型后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)類型的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。更進(jìn)一步的,還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中;根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù)的范圍,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),又進(jìn)一步的方便了用戶的使用。示例性的,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和要監(jiān)控的斷點(diǎn)參數(shù)范圍后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)范圍的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。需要說明的是,當(dāng)數(shù)據(jù)斷點(diǎn)文件只寫入了上述內(nèi)容的斷點(diǎn)參數(shù),斷點(diǎn)地址,斷點(diǎn)參數(shù)的類型和斷點(diǎn)參數(shù)范圍中的任意一個(gè)或多個(gè),則其他為默認(rèn)值,顯然,這樣能夠更加靈活的通過該數(shù)據(jù)斷點(diǎn)文件在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。本發(fā)明實(shí)施例提供的一種通信系統(tǒng),其系統(tǒng)結(jié)構(gòu)示意圖以及局部邏輯示意圖分別如圖4a和4b所示,圖4a中包括三個(gè)CPU,即CPUl,CPU2,CPU3,所述CPU通過總線訪問內(nèi)存,應(yīng)當(dāng)理解的是,本發(fā)明實(shí)施例的通信系統(tǒng)中可以包括一個(gè)CPU,即單CPU的通信系統(tǒng),也可以包括多個(gè)CPU,即多CPU(多核)的通信系統(tǒng)。即本發(fā)明實(shí)施例的通信系統(tǒng),包括至少一個(gè)CPU和內(nèi)存,所述CPU上運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序(亦稱為軟件),用于執(zhí)行特定的任務(wù),所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序,其中所述內(nèi)存中載入有所述源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)異常處理程序,所述異常處理程序用于,當(dāng)所述源程序運(yùn)行到設(shè)置數(shù)據(jù)斷點(diǎn)的指令處時(shí),通過調(diào)用操作系統(tǒng)中取消數(shù)據(jù)斷點(diǎn)的方法取消所述數(shù)據(jù)斷點(diǎn);對所述所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼,并執(zhí)行解碼后的指令,具體的,調(diào)用相應(yīng)的方法來執(zhí)行;重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn);將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。本發(fā)明實(shí)施例的通信系統(tǒng)進(jìn)一步包括編譯器(圖中未示意出),用于將源程序進(jìn)行編譯以生成可執(zhí)行文件,請參閱圖4c,為一種傳統(tǒng)的應(yīng)用程序的編譯過程的原理示意圖,如圖4c所示,傳統(tǒng)的編譯過程包括通過編譯器將源文件(.c文件)編譯成目標(biāo)文件(.0文件,即二進(jìn)制文件),再將多個(gè)目標(biāo)文件鏈接成可執(zhí)行文件。編譯器在編譯源程序之前,用戶可以設(shè)置一些經(jīng)過性數(shù)據(jù)斷點(diǎn),這樣,源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí),就會(huì)觸發(fā)異常處理程序;經(jīng)過性數(shù)據(jù)斷點(diǎn)的基本原理是將要監(jiān)控的數(shù)據(jù)/指令地址設(shè)置到cpu的debug寄存器中,當(dāng)cpu訪問被監(jiān)控的數(shù)據(jù)/指令地址時(shí)就出觸發(fā)一個(gè)異常處理程序,處理完異常處理程序后會(huì)恢復(fù)到觸發(fā)異常處理程序的上下文,繼續(xù)執(zhí)行,整個(gè)過程不影響原系統(tǒng)的狀態(tài),達(dá)到“經(jīng)過性數(shù)據(jù)斷點(diǎn)”的效果。在本發(fā)明實(shí)施例中還通過提供一種數(shù)據(jù)斷點(diǎn)文件來在源程序中設(shè)置經(jīng)過性數(shù)據(jù)斷點(diǎn),具體方法是,在操作系統(tǒng)的內(nèi)核中創(chuàng)建數(shù)據(jù)斷點(diǎn)文件的目錄;在所述數(shù)據(jù)斷點(diǎn)目錄中創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件;所述數(shù)據(jù)斷點(diǎn)文件用于寫入要監(jiān)控的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),這樣一來,通過在該文件中寫入數(shù)據(jù)斷點(diǎn)的斷點(diǎn)地址,就可以在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用,除此之外,該數(shù)據(jù)斷點(diǎn)文件還可以通過寫入斷點(diǎn)參數(shù)來設(shè)置數(shù)據(jù)斷點(diǎn),并且還可以通過寫入斷點(diǎn)參數(shù)類型來進(jìn)一步設(shè)置數(shù)據(jù)斷點(diǎn),而且還可以通過寫入斷點(diǎn)參數(shù)范圍來設(shè)置數(shù)據(jù)斷點(diǎn)。應(yīng)當(dāng)理解的是,本發(fā)明實(shí)施例通信系統(tǒng)具體可以是Linux arm系統(tǒng),或者Unix ARM系統(tǒng),也可以是Linux X86系統(tǒng)、Solaris、aix等類Unix系統(tǒng)等等。例如,在Linux arm系 統(tǒng)下,包括至少一個(gè)arm架構(gòu)的CPU,CPU上運(yùn)行有Linux操作系統(tǒng),所述Linux操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序(亦稱為軟件),所述應(yīng)用程序由源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序(具體功能同上,故不再贅述)。
本發(fā)明實(shí)施例提供的通信系統(tǒng),通過在異常處理程序中仿真執(zhí)行觸發(fā)異常處理程序的指令后返回源程序執(zhí)行觸發(fā)異常處理程序的指令的下一條指令,或者在異常處理程序中取消該觸發(fā)異常處理程序的數(shù)據(jù)斷點(diǎn),并保存觸發(fā)該異常處理程序的指令的下一條指令及設(shè)置該下一條指令為非法指令,從而達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且不會(huì)再次觸發(fā)trap異常處理程序,造成循環(huán)觸發(fā),同時(shí)還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。
本發(fā)明實(shí)施例提供的一種通信系統(tǒng),該信系統(tǒng)中可以包括一個(gè)CPU,即單CPU的通信系統(tǒng),也可以包括多個(gè)CPU,即多CPU(多核)的通信系統(tǒng)。即本發(fā)明實(shí)施例的通信系統(tǒng),包括至少一個(gè)CPU和內(nèi)存,所述CPU上運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序(亦稱為軟件),用于執(zhí)行特定的任務(wù),所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序,其中所述內(nèi)存中載入所述有源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)異常處理程序,所述異常處理程序還用于,當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令;將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令;執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令;恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);將所述修改后的下一條指令恢復(fù)為所述備份指令。本發(fā)明實(shí)施例的通信系統(tǒng)進(jìn)一步包括編譯器(圖中未示意出),用于將源程序進(jìn)行編譯以生成可執(zhí)行文件,請參閱圖4c,為一種傳統(tǒng)的應(yīng)用程序的編譯過程的原理示意圖,如圖4c所示,傳統(tǒng)的編譯過程包括通過編譯器將源文件(.c文件)編譯成目標(biāo)文件(.0文件,即二進(jìn)制文件),再將多個(gè)目標(biāo)文件鏈接成可執(zhí)行文件。編譯器在編譯源程序之前,用戶可以設(shè)置一些經(jīng)過性數(shù)據(jù)斷點(diǎn),這樣,源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí),就會(huì)觸發(fā)異常處理程序;經(jīng)過性數(shù)據(jù)斷點(diǎn)的基本原理是將要監(jiān)控的數(shù)據(jù)/指令地址設(shè)置到cpu的debug寄存器中,當(dāng)cpu訪問被監(jiān)控的數(shù)據(jù)/指令地址時(shí)就出觸發(fā)一個(gè)異常處理程序,處理完異常處理程序后會(huì)恢復(fù)到觸發(fā)異常處理程序的上下文,繼續(xù)執(zhí)行,整個(gè)過程不影響原系統(tǒng)的狀態(tài),達(dá)到“經(jīng)過性數(shù)據(jù)斷點(diǎn)”的效果。在本發(fā)明實(shí)施例中還通過提供一種數(shù)據(jù)斷點(diǎn)文件來在源程序中設(shè)置經(jīng)過性數(shù)據(jù)斷點(diǎn),具體方法是,在操作系統(tǒng)的內(nèi)核中創(chuàng)建數(shù)據(jù)斷點(diǎn)文件的目錄;在所述數(shù)據(jù)斷點(diǎn)目錄中創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件;所述數(shù)據(jù)斷點(diǎn)文件用于寫入要監(jiān)控的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),這樣一來,通過在該文件中寫入數(shù)據(jù)斷點(diǎn)的斷點(diǎn)地址,就可以在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用,除此之外,該數(shù)據(jù)斷點(diǎn)文件還可以通過寫入斷點(diǎn)參數(shù)來設(shè)置數(shù)據(jù)斷點(diǎn),并且還可以通過寫入斷點(diǎn)參數(shù)類型來進(jìn)一步設(shè)置數(shù)據(jù)斷點(diǎn),而且還可以通過寫入斷點(diǎn)參數(shù)范圍來設(shè)置數(shù)據(jù)斷點(diǎn)。應(yīng)當(dāng)理解的是,本發(fā)明實(shí)施例通信系統(tǒng)具體可以是Linux arm系統(tǒng),或者Unix ARM系統(tǒng),也可以是Linux X86系統(tǒng)、Solaris、aix等類Unix系統(tǒng)等等。例如,在Linux arm系統(tǒng)下,包括至少一個(gè)arm架構(gòu)的CPU,CPU上運(yùn)行有Linux操作系統(tǒng),所述Linux操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序(亦稱為軟件),所述應(yīng)用程序由源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序(具體功能同上,故不再贅述)。本發(fā)明實(shí)施例提供的通信系統(tǒng),通過在異常處理程序中仿真執(zhí)行觸發(fā)異常處理程序的指令后返回源程序執(zhí)行觸發(fā)異常處理程序的指令的下一條指令,或者在異常處理程序中取消該觸發(fā)異常處理程序的數(shù)據(jù)斷點(diǎn),并保存觸發(fā)該異常處理程序的指令的下一條指令及設(shè)置該下一條指令為非法指令,從而達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且不會(huì)再次觸發(fā)trap異常處理程序,造成循環(huán)觸發(fā),同時(shí)還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),如圖5所示,該裝置50包括第一取消模塊501,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn)。解碼模塊502,用于對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼。
第一執(zhí)行模塊503,用于執(zhí)行所述解碼后的指令。設(shè)定模塊504,用于重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn)。指向模塊505,用于將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,通過在異常處理程序中仿真執(zhí)行觸發(fā)異常處理程序的指令后返回源程序執(zhí)行觸發(fā)異常處理程序的指令的下一條指令,這樣一來,達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。優(yōu)選的,如圖6所示,該經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置50還包括創(chuàng)建文件模塊506,用于創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件。寫入模塊507,用于將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中。設(shè)置模塊508,用于根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。具體的,寫入模塊507在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)地址,設(shè)置模塊508根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn),同樣的,寫入模塊507還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊508根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)值或地址,以在源程序中相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用。進(jìn)一步的,寫入模塊507還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊508根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),該斷點(diǎn)參數(shù)的類型為可讀類型,可寫類型以及可讀可寫類型。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控?cái)帱c(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件寫入要監(jiān)控的斷點(diǎn)參數(shù)的類型,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),進(jìn)一步方便了用戶使用。需要說明的是,根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,可以通過在相應(yīng)表中查找相應(yīng)的斷點(diǎn)地址,該過程為現(xiàn)有技術(shù),此處不再贅述。示例性的,該表可以為操作系統(tǒng)中存儲的符號表,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和斷點(diǎn)參數(shù)的類型后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)類型的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。更進(jìn)一步的,寫入模塊507還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊508根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù)的范圍,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),又進(jìn)一步的方便了用戶的使用。示例性的,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和要監(jiān)控的斷點(diǎn)參數(shù)范圍后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)范圍的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。需要說明的是,當(dāng)數(shù)據(jù)斷點(diǎn)文件只寫入了上述內(nèi)容的斷點(diǎn)參數(shù),斷點(diǎn)地址,斷點(diǎn)參數(shù)的類型和斷點(diǎn)參數(shù)范圍中的任意一個(gè)或多個(gè),則其他為默認(rèn)值,顯然,這樣能夠更加靈活的通過該數(shù)據(jù)斷點(diǎn)文件在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),該裝置70,如圖7所示,包括第二取消模塊701,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);備份模塊702,用于備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令;修改模塊703,用于將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令;第二執(zhí)行模塊704,用于執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令;恢復(fù)模塊705,用于恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);替換模塊706,用于將所述修改后的下一條指令恢復(fù)為所述備份指令。本發(fā)明實(shí)施例提供的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,通過在異常處理程序中取消該觸發(fā)異常處理程序的數(shù)據(jù)斷點(diǎn),并保存觸發(fā)該異常處理程序的指令的下一條指令及設(shè)置該下一條指令為非法指令,當(dāng)源程序運(yùn)行到觸發(fā)該異常處理程序的指令的下一條指令時(shí),會(huì)觸發(fā)非法異常處理程序,在該非法異常處理程序中,恢復(fù)先前的數(shù)據(jù)斷點(diǎn)并將保存的指令替換本條指令,這樣,當(dāng)源程序運(yùn)行到該數(shù)據(jù)斷點(diǎn)處時(shí)達(dá)到了實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的效果,并且還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn)。優(yōu)選的,該經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置70還包括創(chuàng)建文件模塊707,用于創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件。寫入模塊708,用于將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中。設(shè)置模塊709,用于根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。 具體的該優(yōu)選的內(nèi)容提供的創(chuàng)建文件模塊707如圖6所示的創(chuàng)建文件模塊506,寫、入模塊708如圖6所示的寫入模塊507,設(shè)置模塊709如圖6所示的設(shè)置模塊508。具體的,寫入模塊708可以在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)地址,設(shè)置模塊709根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn),同樣的,寫入模塊708還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊709根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)值或地址,以在源程序中相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),方便了用戶使用。
進(jìn)一步的,寫入模塊708還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊709根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn),該斷點(diǎn)參數(shù)的類型為可讀類型,可寫類型以及可讀可寫類型。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控?cái)帱c(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件寫入要監(jiān)控的斷點(diǎn)參數(shù)的類型,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),進(jìn)一步方便了用戶使用。需要說明的是,根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,可以通過在相應(yīng)表中查找相應(yīng)的斷點(diǎn)地址,該過程為現(xiàn)有技術(shù),此處不再贅述。示例性的,該表可以為操作系統(tǒng)中存儲的符號表,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和斷點(diǎn)參數(shù)的類型后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)類型的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。更進(jìn)一步的,寫入模塊708還可以將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中;設(shè)置模塊709根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。這樣,不僅可以通過在數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù),還可以通過在該數(shù)據(jù)斷點(diǎn)文件中寫入要監(jiān)控的斷點(diǎn)參數(shù)的范圍,以在源程序相應(yīng)位置處設(shè)置數(shù)據(jù)斷點(diǎn),又進(jìn)一步的方便了用戶的使用。示例性的,當(dāng)該數(shù)據(jù)斷點(diǎn)文件寫入斷點(diǎn)參數(shù)和要監(jiān)控的斷點(diǎn)參數(shù)范圍后,該數(shù)據(jù)斷點(diǎn)文件會(huì)在符號表中查找出符合該斷點(diǎn)參數(shù)范圍的斷點(diǎn)參數(shù)的斷點(diǎn)地址,并根據(jù)該斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。需要說明的是,當(dāng)數(shù)據(jù)斷點(diǎn)文件只寫入了上述內(nèi)容的斷點(diǎn)參數(shù),斷點(diǎn)地址,斷點(diǎn)參數(shù)的類型和斷點(diǎn)參數(shù)范圍中的任意一個(gè)或多個(gè),則其他為默認(rèn)值,顯然,這樣能夠更加靈活的通過該數(shù)據(jù)斷點(diǎn)文件在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。以上所述,僅為本發(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)。
權(quán)利要求
1.一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的LinuxARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn);其特征在于,所述方法包括 當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼; 執(zhí)行所述解碼后的指令; 重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn); 將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。
2.根據(jù)權(quán)利要去I所述的方法,其特征在于,還包括 創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件,所述數(shù)據(jù)斷點(diǎn)文件用于記錄要監(jiān)控的斷點(diǎn)的信息。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
5.根據(jù)權(quán)利要2所述的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
6.根據(jù)權(quán)利要求2所述的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
7.一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中;所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn);其特征在于,所述方法包括 當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令; 將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令; 執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令; 恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn); 將所述修改后的下一條指令恢復(fù)為所述備份指令。
8.根據(jù)權(quán)利要求7所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,其特征在于,還包括 創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件,所述數(shù)據(jù)斷點(diǎn)文件用于記錄要監(jiān)控的斷點(diǎn)的信息。
9.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中;根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
10.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)到預(yù)先設(shè)置的符號表中去查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
11.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的類型寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的類型查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
12.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法,其特征在于,還包括 將用戶需要監(jiān)控的斷點(diǎn)參數(shù)以及要監(jiān)控的斷點(diǎn)參數(shù)的范圍寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述斷點(diǎn)參數(shù)和所述斷點(diǎn)參數(shù)的范圍查找相應(yīng)的斷點(diǎn)地址,并根據(jù)所述斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
13.一種通信系統(tǒng),所述通信系統(tǒng)包括內(nèi)存和至少一個(gè)CPU ; 所述CPU中運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序,所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序;所述內(nèi)存中載入有所述源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)所述異常處理程序,其特征在于,所述異常處理程序還用于, 當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼; 執(zhí)行所述解碼后的指令; 重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn); 將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。
14.根據(jù)權(quán)利要求13所述的通信系統(tǒng),其特征在于,所述異常處理程序還用于, 創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件;將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
15.一種通信系統(tǒng),其特征在于,所述通信系統(tǒng)包括內(nèi)存和至少一個(gè)CPU ; 所述CPU中運(yùn)行有操作系統(tǒng),所述操作系統(tǒng)之上運(yùn)行有至少一種應(yīng)用程序,所述應(yīng)用程序包括源程序以及與之關(guān)聯(lián)的至少一個(gè)異常處理程序;所述內(nèi)存中載入有所述源程序和所述異常處理程序,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)所述源程序運(yùn)行到具有數(shù)據(jù)斷點(diǎn)的指令處時(shí)觸發(fā)異常處理程序,其特征在于,所述異常處理程序還用于, 當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令; 將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令; 執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令; 恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn);將所述修改后的下一條指令恢復(fù)為所述備份指令。
16.根據(jù)權(quán)利要求15所述的通信系統(tǒng),其特征在于,所述異常處理程序還用于, 創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件;將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中; 根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
17.一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中,所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),其特征在于,所述經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置包括 第一取消模塊,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 解碼模塊,用于對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼; 第一執(zhí)行模塊,用于執(zhí)行所述解碼后的指令; 設(shè)定模塊,用于重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn); 指向模塊,用于將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址。
18.根據(jù)權(quán)利要求17所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,其特征在于,所述實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置還包括 創(chuàng)建文件模塊,用于創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件; 寫入模塊,用于將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中; 設(shè)置模塊,用于根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
19.一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,應(yīng)用在運(yùn)行有源程序的Linux ARM或Unix ARM系統(tǒng)中;所述源程序中設(shè)置有至少一個(gè)數(shù)據(jù)斷點(diǎn),其特征在于,所述經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置包括 第二取消模塊,用于當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn); 備份模塊,用于備份所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,作為備份指令; 修改模塊,用于將所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令修改為非法指令; 第二執(zhí)行模塊,用于執(zhí)行所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令以及所述修改后的下一條指令; 恢復(fù)模塊,用于恢復(fù)所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處的數(shù)據(jù)斷點(diǎn); 替換模塊,用于將所述修改后的下一條指令恢復(fù)為所述備份指令。
20.根據(jù)權(quán)利要求19所述的實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置,其特征在于,所述實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的裝置還包括 創(chuàng)建文件模塊,用于創(chuàng)建至少一個(gè)數(shù)據(jù)斷點(diǎn)文件; 寫入模塊,用于將用戶需要監(jiān)控的斷點(diǎn)地址寫入所述數(shù)據(jù)斷點(diǎn)文件中; 設(shè)置模塊,用于根據(jù)所述數(shù)據(jù)斷點(diǎn)文件中的斷點(diǎn)地址在所述源程序中設(shè)置數(shù)據(jù)斷點(diǎn)。
全文摘要
本發(fā)明實(shí)施例提供的一種實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的方法、裝置及系統(tǒng),涉及計(jì)算機(jī)領(lǐng)域,用以在Linux ARM或Unix ARM系統(tǒng)中實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)的同時(shí),還可以重復(fù)使用該數(shù)據(jù)斷點(diǎn),該方法包括,當(dāng)所述源程序運(yùn)行到設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處時(shí),取消所述數(shù)據(jù)斷點(diǎn);對所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令進(jìn)行解碼;執(zhí)行所述解碼后的指令;重新在所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令處設(shè)定數(shù)據(jù)斷點(diǎn);將程序計(jì)數(shù)器PC指針指向所述設(shè)置有數(shù)據(jù)斷點(diǎn)的指令的下一條指令,其中,所述程序計(jì)數(shù)器PC指針用于存放將要執(zhí)行的下一條指令的地址,本發(fā)明實(shí)施例用于實(shí)現(xiàn)經(jīng)過性數(shù)據(jù)斷點(diǎn)。
文檔編號G06F11/36GK102662845SQ20121011276
公開日2012年9月12日 申請日期2012年4月17日 優(yōu)先權(quán)日2012年4月17日
發(fā)明者黃見輝 申請人:華為技術(shù)有限公司