專利名稱:調(diào)試進(jìn)程的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)軟件領(lǐng)域,特別涉及一種調(diào)試進(jìn)程的方法和系統(tǒng)。
背景技術(shù):
計(jì)算機(jī)軟件開發(fā)過程中,調(diào)試器是不可或缺的工具。在嵌入式軟件開發(fā)領(lǐng)域,目標(biāo) 機(jī)或單板(后面統(tǒng)稱“目標(biāo)機(jī)”)的硬件資源通常比較有限,例如存儲(chǔ)空間不大、中央處理單 元(Central Processing Unit, CPU)性能也不及PC機(jī)和服務(wù)器,因此常常使用交叉調(diào)試模 式,即在目標(biāo)機(jī)上運(yùn)行一個(gè)尺寸較小、功能相對(duì)簡(jiǎn)單的代理程序(本文后面統(tǒng)稱為“調(diào)試代 理模塊”),而尺寸較大,功能完整的調(diào)試主控模塊運(yùn)行在資源相對(duì)豐富的主機(jī)端?,F(xiàn)有的交叉調(diào)試器存在一個(gè)缺陷,不方便跟蹤被調(diào)試程序在調(diào)試過程中創(chuàng)建 的子進(jìn)程。被調(diào)試程序通常是采用fork、vfork等事件創(chuàng)建子進(jìn)程,然后,再通過調(diào)用 execv系列函數(shù)來運(yùn)行新的程序。開源GDB在本地調(diào)試時(shí),可以用set follow-fork-mode parent | child命令預(yù)先設(shè)置當(dāng)有子進(jìn)程生成時(shí),調(diào)試器是繼續(xù)調(diào)試被調(diào)試程序還是調(diào)試子 進(jìn)程。如果設(shè)置的是調(diào)試被調(diào)試程序,那么用戶可以繼續(xù)在被調(diào)試程序中進(jìn)行調(diào)試,而子進(jìn) 程在創(chuàng)建以后將不受約束地正常運(yùn)行;如果設(shè)置的是調(diào)試子進(jìn)程,那么調(diào)試流程進(jìn)入調(diào)試 子進(jìn)程的狀態(tài),而被調(diào)試程序脫離調(diào)試器的控制,恢復(fù)正常運(yùn)行。開源⑶B進(jìn)行本地調(diào)試的 缺陷在于,如果設(shè)置的是調(diào)試子進(jìn)程,子進(jìn)程調(diào)用execv系列函數(shù)來運(yùn)行新的程序時(shí),調(diào)試 器將不能跟蹤進(jìn)入新啟動(dòng)的程序,更不能在新啟動(dòng)的程序的入口代碼處停住,等待用戶進(jìn) 行調(diào)試控制。開源GDB/GDBSERVER交叉調(diào)試器則完全不支持從被調(diào)試程序調(diào)試跟蹤子進(jìn)程 的功能?,F(xiàn)有的其它一些交叉調(diào)試器,有些提供了調(diào)試子進(jìn)程的功能,例如在調(diào)試器感知 到被調(diào)試程序創(chuàng)建了子進(jìn)程時(shí),自動(dòng)把新創(chuàng)建的子進(jìn)程置于調(diào)試器的控制之下。但是,從其 實(shí)際效果來說,與用戶知道有子進(jìn)程創(chuàng)建時(shí),手工把子進(jìn)程置于調(diào)試器控制中沒有本質(zhì)差 別,它們的共同缺點(diǎn)是不方便調(diào)試子進(jìn)程的入口代碼,特別是當(dāng)子進(jìn)程會(huì)很快運(yùn)行結(jié)束并 退出的時(shí)候,很難對(duì)子進(jìn)程進(jìn)行調(diào)試。為了解決上述不方便調(diào)試子進(jìn)程入口代碼的難題,通常推薦調(diào)試器使用者在子進(jìn) 程的入口代碼開始處插入一段條件循環(huán)的代碼,并將循環(huán)條件設(shè)置為‘真’,這樣,在子進(jìn)程 啟動(dòng)后,將停在新加的循環(huán)代碼中;待調(diào)試器跟蹤到子進(jìn)程以后,再修改循環(huán)條件為‘假’, 終止循環(huán),流程繼續(xù)往下執(zhí)行。這樣就可以調(diào)試子進(jìn)程的入口代碼了。此方法有一個(gè)很明顯 的缺點(diǎn),就是要修改被調(diào)試程序,并且修改后要重新編譯,這給調(diào)試器的使用帶來了不便。另一種方法是編寫腳本文件,例如,子進(jìn)程要運(yùn)行的可執(zhí)行文件是fil印athname, 首先修改該文件的名字,例如,修改為f ilepathname 1 ;然后,寫一個(gè)shel 1腳本文件命名為 fil印athname,在該腳本文件中,首先啟動(dòng)一個(gè)新的shell,然后在新啟動(dòng)的shell中,使用 ⑶B調(diào)試fil印athnamel文件。這樣,當(dāng)子進(jìn)程調(diào)用execv函數(shù)執(zhí)行fil印athname文件時(shí), 實(shí)際上會(huì)在一個(gè)新的shell中啟動(dòng)一個(gè)⑶B,然后在這個(gè)⑶B中對(duì)新運(yùn)行的程序進(jìn)行調(diào)試。 但這種方法不僅使用麻煩,而且只適用于本地調(diào)試,不適用于嵌入式交叉調(diào)試環(huán)境。
綜上所述,現(xiàn)有的交叉調(diào)試器在調(diào)試子進(jìn)程時(shí),特別是在跟蹤子進(jìn)程入口代碼時(shí), 要么是需要修改被調(diào)試程序,要么是編寫腳本文件,調(diào)試過程復(fù)雜,工作量大,工作效率低。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例要解決的問題是提供一種調(diào)試進(jìn)程的方法和系統(tǒng),以解決現(xiàn)有技術(shù) 中無法在嵌入式交叉調(diào)試器中,跟蹤子進(jìn)程入口代碼的問題。為了解決上述問題,本發(fā)明實(shí)施例提供了一種調(diào)試進(jìn)程的方法和系統(tǒng),具體技術(shù) 方案如下一種調(diào)試進(jìn)程的方法,包括根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處于停止?fàn)顟B(tài);判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;控制所述子進(jìn)程運(yùn)行新程序,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試 信息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。一種調(diào)試進(jìn)程的方法,包括在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取到執(zhí)行新程序事件的 信號(hào);根據(jù)所述信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所 述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。一種調(diào)試進(jìn)程的系統(tǒng),包括所述調(diào)試代理模塊,用于在獲取到創(chuàng)建子進(jìn)程事件的信號(hào)時(shí),使被調(diào)試程序和所 述子進(jìn)程處于停止?fàn)顟B(tài);所述調(diào)試主控模塊,用于在判斷要調(diào)試所述子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn) 程;使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新程序的入口代碼 處插入臨時(shí)斷點(diǎn)。一種調(diào)試進(jìn)程的系統(tǒng),包括調(diào)試代理模塊,用于在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取 到執(zhí)行新程序事件的信號(hào);調(diào)試主控模塊,用于根據(jù)所述信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相 關(guān)調(diào)試信息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。在本發(fā)明實(shí)施例中,根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處于停 止?fàn)顟B(tài);判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;控制所述子進(jìn)程運(yùn)行新程序, 使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新程序的入口代碼處插 入臨時(shí)斷點(diǎn),解決了現(xiàn)有交叉調(diào)試器不便跟蹤子進(jìn)程、特別是很難跟蹤子進(jìn)程入口代碼的 問題,使用戶可以不修改被調(diào)試程序的代碼,也不需要任何額外的腳本,即可方便地跟蹤子 進(jìn)程的入口代碼,從而簡(jiǎn)化了調(diào)試過程,降低了軟件開發(fā)人員調(diào)試程序的工作量,提高了工 作效率。
圖1、7是本發(fā)明實(shí)施例提供的一種調(diào)試進(jìn)程的方法的流程圖2是本發(fā)明實(shí)施例提供的一種調(diào)試進(jìn)程的系統(tǒng)的結(jié)構(gòu)圖;圖3是本發(fā)明實(shí)施例提供的調(diào)試代理模塊和調(diào)試主控模塊的結(jié)構(gòu)圖;圖4是本發(fā)明實(shí)施例提供的調(diào)試代理模塊對(duì)創(chuàng)建子進(jìn)程事件的處理流程圖;圖5是本發(fā)明實(shí)施例提供的調(diào)試主控模塊對(duì)創(chuàng)建子進(jìn)程事件的處理流程圖。圖6是本發(fā)明實(shí)施例提供的調(diào)試主控模塊調(diào)對(duì)execv事件的處理流程圖。
具體實(shí)施例方式本發(fā)明的核心思想在于根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處 于停止?fàn)顟B(tài);判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;控制所述子進(jìn)程運(yùn)行新 程序,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新程序的入口代 碼處插入臨時(shí)斷點(diǎn),解決了現(xiàn)有交叉調(diào)試器不便跟蹤子進(jìn)程、特別是很難跟蹤子進(jìn)程入口 代碼的問題,使用戶可以不修改被調(diào)試程序的代碼,也不需要任何額外的腳本,即可方便地 跟蹤子進(jìn)程的入口代碼,從而簡(jiǎn)化了調(diào)試過程,降低了軟件開發(fā)人員調(diào)試程序的工作量,提 高了工作效率。下面結(jié)合附圖及優(yōu)選實(shí)施方式對(duì)本發(fā)明技術(shù)方案進(jìn)行詳細(xì)說明。本發(fā)明實(shí)施例提供了一種調(diào)試進(jìn)程的方法,如圖1所示,包括10,根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處于停止?fàn)顟B(tài);20,判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為子進(jìn)程;30,控制子進(jìn)程運(yùn)行新程序,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試 信息,并在新程序的入口代碼處插入臨時(shí)斷點(diǎn)。進(jìn)一步地,切換調(diào)試對(duì)象為所述子進(jìn)程,包括初始化內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)及變量,重新初始化緩存幀內(nèi)容。進(jìn)一步地使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,包括清空當(dāng)前的符號(hào)表,重新加載新程序的符號(hào)表,重新加載新程序的共享庫(kù)符號(hào)。進(jìn)一步地,該方法還包括在判斷不調(diào)試子進(jìn)程時(shí),繼續(xù)調(diào)試被調(diào)試程序,使子進(jìn)程脫離跟蹤調(diào)試狀態(tài),并結(jié)
束ο下面結(jié)合附圖,對(duì)本發(fā)明所述調(diào)試進(jìn)程的系統(tǒng)以及在類UNIX目標(biāo)機(jī)上的具體實(shí) 施做進(jìn)一步說明如圖2所示為調(diào)試進(jìn)程的系統(tǒng)結(jié)構(gòu)圖,圖2所示的系統(tǒng)只是為了描述的需要,本發(fā) 明的保護(hù)范圍并不限于此。圖2所示的系統(tǒng)包括調(diào)試代理模塊100和調(diào)試主控模塊106。其中,如圖3所示,調(diào)試代理模塊100,運(yùn)行在目標(biāo)機(jī)端,運(yùn)行的操作系統(tǒng)環(huán)境101 是類UNIX操作系統(tǒng)。調(diào)試代理模塊100包括連接管理單元102、硬件抽象單元103、任務(wù) 管理單元104和命令處理單元105。連接管理單元102負(fù)責(zé)維護(hù)調(diào)試代理模塊100與調(diào)試 主控模塊106的網(wǎng)絡(luò)連接,為上層處理單元提供數(shù)據(jù)通信通道。硬件抽象單元103負(fù)責(zé)屏蔽 各種CPU的硬件(例如寄存器)差異,抽象出統(tǒng)一的接口,方便上層處理單元的流程實(shí)現(xiàn); 任務(wù)管理單元104負(fù)責(zé)控制被調(diào)試的各個(gè)程序的狀態(tài),感知并處理被調(diào)試對(duì)象的各種調(diào)試 事件,并把被調(diào)試對(duì)象的事件及狀態(tài)變遷通知調(diào)試主控模塊106,其中,被調(diào)試對(duì)象可以是子進(jìn)程,也可以是被調(diào)試程序,具體根據(jù)實(shí)際情況而定;命令處理單元105負(fù)責(zé)接收來自調(diào) 試主控模塊106的各種調(diào)試命令,執(zhí)行相應(yīng)的調(diào)試操作,并把操作結(jié)果反饋給調(diào)試主控模 塊 106 ;如圖3所示,調(diào)試主控模塊106運(yùn)行在調(diào)試主機(jī)上,其中,調(diào)試主機(jī)與目標(biāo)機(jī)可以 是不同的計(jì)算機(jī),也可以是同一臺(tái)計(jì)算機(jī),它運(yùn)行的操作系統(tǒng)環(huán)境107既可以是Windows, 也可以是類UNIX操作系統(tǒng)。調(diào)試主控模塊106包括命令處理單元112、目標(biāo)管理單元111、 符號(hào)處理單元110、斷點(diǎn)管理單元109和連接管理單元108。其中,連接管理單元108負(fù)責(zé) 維護(hù)調(diào)試主控模塊106和調(diào)試代理模塊100的網(wǎng)絡(luò)連接,為上層處理單元提供數(shù)據(jù)通信通 道;斷點(diǎn)管理單元109負(fù)責(zé)各種類型斷點(diǎn)的插入、刪除、屬性修改和斷點(diǎn)表維護(hù)等工作;符 號(hào)處理單元110負(fù)責(zé)分析被調(diào)試對(duì)象的符號(hào)信息和調(diào)試信息,它是調(diào)試主控模塊106的核 心組成部分之一,是實(shí)現(xiàn)源代碼級(jí)調(diào)試、斷點(diǎn)管理、變量查看、表達(dá)式求值和堆?;厮莸戎T 多功能的必要基礎(chǔ);目標(biāo)管理單元111 一方面負(fù)責(zé)向被調(diào)試對(duì)象發(fā)送指令,另一方面負(fù)責(zé) 處理來自調(diào)試代理模塊100的被調(diào)試對(duì)象的調(diào)試事件;命令處理單元112的任務(wù)是接收、處 理用戶命令,并把命令處理結(jié)果反饋給用戶,如果是需要調(diào)試代理模塊100處理的命令,命 令處理單元112會(huì)通過目標(biāo)管理單元111向調(diào)試代理模塊100發(fā)送數(shù)據(jù)報(bào)文,控制調(diào)試代 理模塊100執(zhí)行特定的操作,然后接收調(diào)試代理模塊100返回的處理結(jié)果,再把處理結(jié)果反 饋給用戶。下面結(jié)合圖3對(duì)本發(fā)明實(shí)施例的方法進(jìn)行詳細(xì)的描述,具體如下產(chǎn)生子進(jìn)程的操作包括以下幾種fork事件、vfork事件、clone事件,其中,clone 事件可以屬于fork事件,也可以屬于vfork事件。在實(shí)際應(yīng)用中,用得最多的是fork事件 和execv事件,或是vfork事件加execv事件創(chuàng)建子進(jìn)程,但實(shí)際應(yīng)用中,用戶也可以只使 用fork事件或vfork事件創(chuàng)建子進(jìn)程,此時(shí),子進(jìn)程和被調(diào)試程序擁有相同的地址空間,在 本實(shí)施例中,在感知到有子進(jìn)程創(chuàng)建時(shí),可以提示用戶來選擇是繼續(xù)調(diào)試被調(diào)試程序、還是 調(diào)試子進(jìn)程;而對(duì)于execv事件,被調(diào)試程序調(diào)用execv系列函數(shù)時(shí),發(fā)生該事件,此時(shí),進(jìn) 程地址空間已經(jīng)更新為新運(yùn)行的程序的地址空間。在本實(shí)施例中,vfork事件、fork事件為 創(chuàng)建子進(jìn)程事件,execv事件是執(zhí)行新程序事件。圖4所示為調(diào)試代理模塊100對(duì)創(chuàng)建子進(jìn)程事件的處理流程,調(diào)試代理模塊100 的任務(wù)管理單元104通過類UNIX操作系統(tǒng)定義的PTRACE_EVENT_F0RK、PTRACE_EVENT_ VFORK或者PTRACE_EVENT_CL0NE等信號(hào)感知子進(jìn)程創(chuàng)建事件(步驟201)。任務(wù)管理單元 104感知到創(chuàng)建子進(jìn)程事件時(shí),使父子進(jìn)程都處于停止運(yùn)行狀態(tài)(步驟20 ;任務(wù)管理單元 104判斷用戶是否設(shè)置了調(diào)試子進(jìn)程(步驟20 ,如果用戶事先設(shè)置了不調(diào)試子進(jìn)程,那么 任務(wù)管理單元104刪除子進(jìn)程空間中的斷點(diǎn)(步驟213),并使子進(jìn)程脫離調(diào)試跟蹤狀態(tài), 恢復(fù)正常運(yùn)行(步驟214);如果用戶設(shè)置了調(diào)試子進(jìn)程,則首先通過連接管理單元102向 調(diào)試主控模塊106發(fā)送攜帶子進(jìn)程標(biāo)識(shí)和事件類型的數(shù)據(jù)報(bào)文,報(bào)告子進(jìn)程創(chuàng)建事件(步 驟204),再由任務(wù)管理單元104判斷是通過fork事件還是vfork事件創(chuàng)建的子進(jìn)程(步驟 205),如果感知到的是PTRACE_EVENT_VF0RK信號(hào),則是通過vfork事件創(chuàng)建的子進(jìn)程,那么 任務(wù)管理單元104切換當(dāng)前調(diào)試對(duì)象為子進(jìn)程(步驟211),并初始化內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)和 變量(步驟212);如果感知到的是PTRACE_EVENT_F0RK信號(hào),則是通過fork事件創(chuàng)建的子 進(jìn)程,那么任務(wù)管理單元104首先刪除被調(diào)試程序空間中的內(nèi)存斷點(diǎn)(步驟206),使被調(diào)試程序脫離調(diào)試跟蹤狀態(tài)(步驟207),再切換當(dāng)前調(diào)試對(duì)象為子進(jìn)程(步驟208)、初始化 相關(guān)的內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)和變量(步驟209),并根據(jù)調(diào)試主控模塊106的指令回插子進(jìn)程 空間中的斷點(diǎn)到內(nèi)存中(步驟210);如果感知到的是PTRACE_EVENT_CLONE事件,則是通過 clone事件創(chuàng)建的子進(jìn)程,處理流程與PTRACE_EVENT_FORK事件的處理流程相同,在此不再 贅述。需要說明的是,任務(wù)管理單元104切換當(dāng)前調(diào)試對(duì)象為子進(jìn)程也可以是根據(jù)調(diào)試主 控模塊106的指令進(jìn)行,即調(diào)試主控模塊106在將當(dāng)前調(diào)試對(duì)象切換為子進(jìn)程后,會(huì)通知調(diào) 試代理模塊100,調(diào)試代理模塊100中的任務(wù)管理單元104根據(jù)該指令切換當(dāng)前的調(diào)試對(duì)象 為子進(jìn)程。圖5是調(diào)試主控模塊106對(duì)創(chuàng)建子進(jìn)程事件的處理流程圖。調(diào)試主控模塊106通 過連接管理單元108收到調(diào)試代理模塊100上報(bào)的數(shù)據(jù)報(bào)文后(步驟216),目標(biāo)管理單元 111配合命令處理單元112首先根據(jù)用戶的配置或者用戶的選擇,判斷是否要調(diào)試子進(jìn)程 (步驟217),如果不調(diào)試子進(jìn)程,那么當(dāng)前調(diào)試對(duì)象不變,繼續(xù)為被調(diào)試程序(步驟221),目 標(biāo)管理單元111使子進(jìn)程脫離跟蹤狀態(tài),恢復(fù)正常運(yùn)行(步驟222);如果要調(diào)試子進(jìn)程,則 連接管理單元108從上報(bào)報(bào)文中解析出子進(jìn)程的ID(步驟218),由目標(biāo)管理單元111切換 當(dāng)前調(diào)試對(duì)象為子進(jìn)程(步驟219),并初始化內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)及變量(步驟220),此時(shí), 調(diào)試主控模塊106處理子進(jìn)程創(chuàng)建事件的過程結(jié)束(步驟223)。然后,調(diào)試主控模塊106通知調(diào)試代理模塊100,使調(diào)試代理模塊100控制其讓子 進(jìn)程繼續(xù)運(yùn)行。調(diào)試代理模塊100控制子進(jìn)程調(diào)用execv系列函數(shù)執(zhí)行新的程序,類UNIX 操作系統(tǒng)感知到該execv事件,生成相應(yīng)的信號(hào)傳送給調(diào)試代理模塊106。調(diào)試代理模塊 106中的任務(wù)管理單元104通過類UNIX操作系統(tǒng)定義的PTRACE_EVENT_EXEC信號(hào)感知到 execv事件后,處理流程比較簡(jiǎn)單如果命令處理單元105設(shè)置了調(diào)試子進(jìn)程,則向調(diào)試主 控模塊106發(fā)送數(shù)據(jù)報(bào)文,通知調(diào)試主控模塊106發(fā)生了 execv事件,加載符號(hào)表等流程由 調(diào)試主控模塊106的符號(hào)處理單元110完成;如果命令處理單元105沒有設(shè)置調(diào)試子進(jìn)程 功能,則任務(wù)管理單元104直接讓子進(jìn)程繼續(xù)運(yùn)行,不做其它處理。如圖6所示,調(diào)試主控模塊106中的連接管理單元108收到調(diào)試代理模塊105上 報(bào)的數(shù)據(jù)報(bào)文時(shí)(步驟224),通知符號(hào)處理單元110清空當(dāng)前的符號(hào)表,重新加載新程序的 符號(hào)表(步驟22 ,重新加載新程序的共享庫(kù)符號(hào)(步驟226),由斷點(diǎn)管理單元109在新 程序的入口代碼處插入臨時(shí)斷點(diǎn)(步驟227),目標(biāo)管理單元111重新初始化幀緩沖區(qū)的內(nèi) 容以后(步驟228),讓子進(jìn)程繼續(xù)運(yùn)行(步驟229),并結(jié)束(步驟230)。在子進(jìn)程運(yùn)行到 入口代碼的時(shí)候,會(huì)命中臨時(shí)斷點(diǎn)而停住,這樣就可以調(diào)試子進(jìn)程中新程序的代碼。本發(fā)明實(shí)施例還提供了一種調(diào)試進(jìn)程的方法,如圖7所示,包括40,在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取到執(zhí)行新程序事 件的信號(hào);50,根據(jù)該信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在該 新程序的入口代碼處插入臨時(shí)斷點(diǎn)。進(jìn)一步地,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,包括清空當(dāng)前的符號(hào)表,重新加載新程序的符號(hào)表,重新加載新程序的共享庫(kù)符號(hào)。下面結(jié)合具體的示例對(duì)本發(fā)明的保護(hù)范圍進(jìn)行具體的描述,具體地,被調(diào)試程序直接調(diào)用execv系列函數(shù)執(zhí)行新程序。這種情況下,沒有子進(jìn)程產(chǎn)生,調(diào)試代理模塊100通過操作系統(tǒng)的信號(hào)感知到execv事件后,向調(diào)試主控模塊106發(fā)送數(shù) 據(jù)報(bào)文,通知調(diào)試主控模塊106發(fā)生了該execv事件。調(diào)試主控模塊106收到調(diào)試代理模 塊100上報(bào)的數(shù)據(jù)報(bào)文后,清空當(dāng)前的符號(hào)表,重新加載新程序的符號(hào)表,重新加載新程序 的共享庫(kù)符號(hào),在新程序的入口代碼處插入臨時(shí)斷點(diǎn),重新初始化幀緩沖區(qū)的內(nèi)容以后,讓 子進(jìn)程繼續(xù)運(yùn)行。通過以上流程,可以在類UNIX目標(biāo)機(jī)上,實(shí)現(xiàn)了調(diào)試子進(jìn)程入口代碼的方法?;谂c方法相同的發(fā)明構(gòu)思,本發(fā)明實(shí)施例提供了一種調(diào)試進(jìn)程的系統(tǒng),如圖1 所示,包括調(diào)試代理模塊,用于在獲取到創(chuàng)建子進(jìn)程事件的信號(hào)時(shí),使被調(diào)試程序和所述子 進(jìn)程處于停止?fàn)顟B(tài);調(diào)試主控模塊,用于在判斷要調(diào)試所述子進(jìn)程時(shí),切換調(diào)試對(duì)象為子進(jìn)程;使新 程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在新程序的入口代碼處插入臨時(shí)斷
點(diǎn)ο進(jìn)一步地,調(diào)試主控模塊切換調(diào)試對(duì)象為子進(jìn)程,包括調(diào)試主控模塊根據(jù)調(diào)試代理模塊上報(bào)的數(shù)據(jù)報(bào)文中的子進(jìn)程標(biāo)識(shí)和創(chuàng)建子進(jìn)程 事件的類型切換調(diào)試對(duì)象。進(jìn)一步地,調(diào)試代理模塊,還用于判斷所述創(chuàng)建子進(jìn)程事件的類型,如果是vfork 事件,則切換調(diào)試對(duì)象為所述子進(jìn)程;如果創(chuàng)建子進(jìn)程事件的類型是fork事件,則刪除被 調(diào)試程序空間中的內(nèi)存斷點(diǎn),切換當(dāng)前調(diào)試對(duì)象為所述子進(jìn)程。進(jìn)一步地,調(diào)試主控模塊,還用于在判斷不調(diào)試所述子進(jìn)程時(shí),繼續(xù)調(diào)試所述被調(diào) 試程序,使所述子進(jìn)程脫離跟蹤調(diào)試狀態(tài),并結(jié)束。進(jìn)一步地,調(diào)試代理模塊和調(diào)試主控模塊集成在同一設(shè)備上或分布在不同的設(shè)備 上?;谂c方法相同的發(fā)明構(gòu)思,本發(fā)明實(shí)施還提供了一種調(diào)試進(jìn)程的系統(tǒng),如圖1 所示,包括調(diào)試代理模塊,用于在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取 到執(zhí)行新程序事件的信號(hào);調(diào)試主控模塊,用于根據(jù)所述信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相 關(guān)調(diào)試信息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。其中,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,包括根據(jù)該通知清空當(dāng)前的符號(hào)表,重新加載該新程序的符號(hào)表,重新加載該新程序 的共享庫(kù)符號(hào)。本發(fā)明實(shí)施例可以解決了現(xiàn)有交叉調(diào)試器不便跟蹤子進(jìn)程、特別是很難跟蹤子進(jìn) 程入口代碼的問題,使用戶可以不修改被調(diào)試程序的代碼,也不需要任何額外的腳本,即可 方便地跟蹤子進(jìn)程的入口代碼,從而簡(jiǎn)化了調(diào)試過程,降低了軟件開發(fā)人員調(diào)試程序的工 作量,提高了工作效率。上述說明示出并描述了本發(fā)明的一個(gè)優(yōu)選實(shí)施例,但如前所述,應(yīng)當(dāng)理解本發(fā)明 并非局限于本文所披露的形式,不應(yīng)看作是對(duì)其他實(shí)施例的排除,而可用于各種其他組合、 修改和環(huán)境,并能夠在本文所述發(fā)明構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識(shí)進(jìn)行改動(dòng)。而本領(lǐng)域人員所進(jìn)行的改動(dòng)和變化不脫離本發(fā)明的精神和范圍,則都應(yīng)在本發(fā) 明所附權(quán)利要求的保護(hù)范圍內(nèi)。
權(quán)利要求
1.一種調(diào)試進(jìn)程的方法,其特征在于,包括根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處于停止?fàn)顟B(tài);判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;控制所述子進(jìn)程運(yùn)行新程序,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信 息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。
2.如權(quán)利要求1所述的方法,其特征在于,所述切換調(diào)試對(duì)象為所述子進(jìn)程,包括初始化內(nèi)部管理數(shù)據(jù)結(jié)構(gòu)及變量,重新初始化緩存幀內(nèi)容。
3.如權(quán)利要求1所述的方法,其特征在于,所述使新程序的相關(guān)調(diào)試信息替換原有程 序的相關(guān)調(diào)試信息,包括清空當(dāng)前的符號(hào)表,重新加載新程序的符號(hào)表,重新加載新程序的共享庫(kù)符號(hào)。
4.如權(quán)利要求1所述的方法,其特征在于,還包括在判斷不調(diào)試所述子進(jìn)程時(shí),繼續(xù)調(diào)試所述被調(diào)試程序,使所述子進(jìn)程脫離跟蹤調(diào)試 狀態(tài),并結(jié)束。
5.一種調(diào)試進(jìn)程的方法,其特征在于,包括在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取到執(zhí)行新程序事件的信號(hào);根據(jù)所述信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新 程序的入口代碼處插入臨時(shí)斷點(diǎn)。
6.如權(quán)利要求5所述的方法,其特征在于,包括使新程序的相關(guān)調(diào)試信息替換原有程 序的相關(guān)調(diào)試信息,包括清空當(dāng)前的符號(hào)表,重新加載新程序的符號(hào)表,重新加載新程序的共享庫(kù)符號(hào)。
7.—種調(diào)試進(jìn)程的系統(tǒng),其特征在于,包括所述調(diào)試代理模塊,用于在獲取到創(chuàng)建子進(jìn)程事件的信號(hào)時(shí),使被調(diào)試程序和所述子 進(jìn)程處于停止?fàn)顟B(tài);所述調(diào)試主控模塊,用于在判斷要調(diào)試所述子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;使 新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新程序的入口代碼處插入 臨時(shí)斷點(diǎn)。
8.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述調(diào)試主控模塊切換調(diào)試對(duì)象為所述子 進(jìn)程,包括所述調(diào)試主控模塊根據(jù)所述調(diào)試代理模塊上報(bào)的數(shù)據(jù)報(bào)文中的子進(jìn)程標(biāo)識(shí)和創(chuàng)建子 進(jìn)程事件的類型切換調(diào)試對(duì)象。
9.如權(quán)利要求7所述的系統(tǒng),其特征在于,所述調(diào)試代理模塊,還用于判斷所述創(chuàng)建子 進(jìn)程事件的類型,如果是vfork事件,則切換調(diào)試對(duì)象為所述子進(jìn)程;如果創(chuàng)建子進(jìn)程事件 的類型是fork事件,則刪除被調(diào)試程序空間中的內(nèi)存斷點(diǎn),切換當(dāng)前調(diào)試對(duì)象為所述子進(jìn) 程。
10.如權(quán)利要求7至9任意一項(xiàng)權(quán)利要求所述的系統(tǒng),其特征在于,所述調(diào)試主控模塊, 還用于在判斷不調(diào)試所述子進(jìn)程時(shí),繼續(xù)調(diào)試所述被調(diào)試程序,使所述子進(jìn)程脫離跟蹤調(diào) 試狀態(tài),并結(jié)束。
11.如權(quán)利要求7至9任意一項(xiàng)權(quán)利要求所述的系統(tǒng),其特征在于,所述調(diào)試代理模塊和所述調(diào)試主控模塊集成在同一設(shè)備上或分布在不同的設(shè)備上。
12. —種調(diào)試進(jìn)程的系統(tǒng),其特征在于,包括調(diào)試代理模塊,用于在被調(diào)試程序調(diào)用執(zhí)行新程序系列函數(shù)運(yùn)行新程序后,獲取到執(zhí) 行新程序事件的信號(hào);調(diào)試主控模塊,用于根據(jù)所述信號(hào),使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào) 試信息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。
全文摘要
本發(fā)明公開了一種調(diào)試進(jìn)程的方法和系統(tǒng),屬于計(jì)算機(jī)軟件領(lǐng)域。該方法包括根據(jù)創(chuàng)建子進(jìn)程事件的信號(hào),使被調(diào)試程序和子進(jìn)程處于停止?fàn)顟B(tài);判斷要調(diào)試子進(jìn)程時(shí),切換調(diào)試對(duì)象為所述子進(jìn)程;控制所述子進(jìn)程運(yùn)行新程序,使新程序的相關(guān)調(diào)試信息替換原有程序的相關(guān)調(diào)試信息,并在所述新程序的入口代碼處插入臨時(shí)斷點(diǎn)。該系統(tǒng)包括調(diào)試代理模塊和調(diào)試主控模塊。本發(fā)明的技術(shù)方案可方便地跟蹤子進(jìn)程的入口代碼,從而簡(jiǎn)化了調(diào)試過程,降低了軟件開發(fā)人員調(diào)試程序的工作量,提高了工作效率。
文檔編號(hào)G06F11/36GK102063366SQ20091022480
公開日2011年5月18日 申請(qǐng)日期2009年11月18日 優(yōu)先權(quán)日2009年11月18日
發(fā)明者張華強(qiáng), 曾義, 湯孝林, 程圣宇, 鐘衛(wèi)東 申請(qǐng)人:中興通訊股份有限公司