專利名稱:進(jìn)程調(diào)試方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域,具體而言,涉及一種進(jìn)程調(diào)試方法及裝置。
背景技術(shù):
由于類Unix系統(tǒng)用戶態(tài)進(jìn)程地址空間具有相互獨(dú)立性,shell程序的空間和用戶 進(jìn)程的空間是相對(duì)隔離的,所以在一個(gè)進(jìn)程運(yùn)行過(guò)程中,我們無(wú)法通過(guò)shell獲取用戶進(jìn) 程空間的信息,也難以實(shí)現(xiàn)對(duì)運(yùn)行進(jìn)程的訪問(wèn)和控制,即對(duì)進(jìn)程進(jìn)行在線調(diào)試。傳統(tǒng)的類Unix系統(tǒng)軟件開發(fā),在開發(fā)初期會(huì)使用一些調(diào)試工具,對(duì)程序設(shè)置斷點(diǎn) 或是讓程序單步執(zhí)行,來(lái)跟蹤調(diào)試程序。待軟件開發(fā)完成后,一般都會(huì)進(jìn)行優(yōu)化編譯。以 release版本發(fā)布,在這種情況下,調(diào)試工具是沒法對(duì)軟件進(jìn)行精確調(diào)試跟蹤的。如果開 發(fā)者需要抓取系統(tǒng)運(yùn)行過(guò)程中的一些信息,一般只能查看軟件在運(yùn)行過(guò)程中的一些狀態(tài)輸 出,或者由串口打印,或者由別的信號(hào)來(lái)表達(dá)。而當(dāng)軟件流程出現(xiàn)異常導(dǎo)致系統(tǒng)無(wú)法正常工 作的時(shí)候,故障現(xiàn)場(chǎng)的數(shù)據(jù)只能靠程序預(yù)定的流程來(lái)收集。事后,開發(fā)者再根據(jù)這些數(shù)據(jù)來(lái) 定位故障產(chǎn)生的原因。這種軟件架構(gòu)存在著一些缺陷,首先,系統(tǒng)運(yùn)行過(guò)程中的狀態(tài)信息由程序主動(dòng)輸 出,這個(gè)操作會(huì)在系統(tǒng)正常工作流程中,若系統(tǒng)比較復(fù)雜,信息量大,這部分流程會(huì)消耗很 多CPU,嚴(yán)重影響系統(tǒng)性能。其次,在發(fā)生軟件異常時(shí),異常記錄信息由軟件設(shè)計(jì)人員預(yù)先設(shè) 定,故障發(fā)生后,開發(fā)者只能利用僅有的這些數(shù)據(jù)進(jìn)行故障分析,如果某些重要信息沒有記 錄下來(lái),那就只能重新制作臨時(shí)軟件版本去收集信息,再?gòu)?fù)現(xiàn)這個(gè)故障。而很多故障往往是 不能或者很難復(fù)現(xiàn)的,所以這類故障定位的效率會(huì)很低或者根本無(wú)法定位。
發(fā)明內(nèi)容
針對(duì)相關(guān)技術(shù)中進(jìn)程調(diào)試過(guò)程會(huì)消耗很多CPU并難以定位故障的問(wèn)題而提出本 發(fā)明,為此,本發(fā)明的主要目的在于提供一種進(jìn)程調(diào)試方法及裝置,以解決上述問(wèn)題。為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個(gè)方面,提供了 一種進(jìn)程調(diào)試方法。根據(jù)本發(fā)明的進(jìn)程調(diào)試方法包括代理線程接收到來(lái)自用戶的調(diào)試命令,其中調(diào) 試命令用于調(diào)試待調(diào)試的用戶進(jìn)程,代理線程預(yù)先設(shè)置在待調(diào)試的用戶進(jìn)程中;代理線程 根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程。進(jìn)一步地,代理線程接收到來(lái)自用戶的調(diào)試命令包括與代理線程對(duì)應(yīng)的代理工 具接收到來(lái)自用戶的調(diào)試命令,其中代理工具與用戶進(jìn)程分離;代理工具將調(diào)試命令轉(zhuǎn)發(fā) 給代理線程。進(jìn)一步地,代理工具使用隊(duì)列方式或者管道方式將調(diào)試命令轉(zhuǎn)發(fā)給代理線程。進(jìn)一步地,在代理線程接收到來(lái)自用戶的調(diào)試命令之前,上述方法還包括代理線 程創(chuàng)建用戶進(jìn)程的符號(hào)表;代理線程在代理線程的私有變量中存儲(chǔ)符號(hào)表。進(jìn)一步地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括代理線程分離調(diào) 試命令,得到調(diào)試函數(shù)名和參數(shù);代理線程在符號(hào)表中查找與調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù);代理線程執(zhí)行該執(zhí)行函數(shù)。進(jìn)一步地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括代理線程獲取用 戶進(jìn)程的狀態(tài)信息;代理線程向代理工具發(fā)送用戶進(jìn)程的狀態(tài)信息,其中代理工具與用戶 進(jìn)程分離。進(jìn)一步地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括以下至少之一調(diào) 試命令為Printfifo,代理線程判斷代理線程的輸出是否已經(jīng)重定向到管道,如果判斷結(jié)果 為否,則將代理線程的輸出重定向到管道,否則忽略調(diào)試命令;調(diào)試命令為Debug,代理線 程判斷是否處于調(diào)試狀態(tài),如果判斷結(jié)果為否,則代理線程進(jìn)入調(diào)試狀態(tài),否則忽略調(diào)試命 令;調(diào)試命令為Quit,代理線程判斷代理線程的輸出是否已經(jīng)重定向,如果判斷結(jié)果為是, 則恢復(fù)代理線程的輸出的重定向,否則忽略調(diào)試命令。為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的另一個(gè)方面,提供了 一種進(jìn)程調(diào)試裝置。根據(jù)本發(fā)明的進(jìn)程調(diào)試裝置包括接收模塊,用于接收來(lái)自用戶的調(diào)試命令,其中 調(diào)試命令用于調(diào)試待調(diào)試的用戶進(jìn)程,接收模塊所屬的代理線程預(yù)先設(shè)置在待調(diào)試的用戶 進(jìn)程中;調(diào)試模塊,用于根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程。進(jìn)一步地,進(jìn)程調(diào)試裝置還包括創(chuàng)建模塊,用于創(chuàng)建用戶進(jìn)程的符號(hào)表;存儲(chǔ)模 塊,用于在代理線程的私有變量中存儲(chǔ)符號(hào)表。進(jìn)一步地,調(diào)試模塊包括分離子模塊,用于分離調(diào)試命令,得到調(diào)試函數(shù)名和參 數(shù);查找子模塊,用于在符號(hào)表中查找與調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù);執(zhí)行子模塊,用于執(zhí) 行該執(zhí)行函數(shù)。通過(guò)本發(fā)明,在用戶進(jìn)程中添加了代理線程,它可以根據(jù)用戶的調(diào)試命令調(diào)試用 戶進(jìn)程,解決了相關(guān)技術(shù)中進(jìn)程調(diào)試過(guò)程會(huì)消耗很多CPU并難以定位故障的問(wèn)題,從而實(shí) 現(xiàn)故障的快速、準(zhǔn)確地定位,并且,如果沒有需要,代理線程是保持阻塞的,所以僅僅會(huì)增加 代碼體積,而不會(huì)消耗CPU影響系統(tǒng)性能。
此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部分,本發(fā) 明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中圖1是根據(jù)本發(fā)明實(shí)施例的進(jìn)程調(diào)試方法的流程圖;圖2是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊在類Unix系統(tǒng)中的應(yīng)用場(chǎng)景的示意圖;圖3是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊中D_Shell線程的流程圖;圖4是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊中D-Shell工具的流程圖;圖5是根據(jù)本發(fā)明實(shí)施例的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖;圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例一的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖;圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例二的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖。
具體實(shí)施例方式需要說(shuō)明的是,在不沖突的情況下,本申請(qǐng)中的實(shí)施例及實(shí)施例中的特征可以相 互組合。下面將參考附圖并結(jié)合實(shí)施例來(lái)詳細(xì)說(shuō)明本發(fā)明。本發(fā)明實(shí)施例提供了 一種進(jìn)程調(diào)試方法。圖1是根據(jù)本發(fā)明實(shí)施例的進(jìn)程調(diào)試方法的流程圖,包括如下的步驟S102至步驟S104。步驟S102,代理線程接收到來(lái)自用戶的調(diào)試命令,其中調(diào)試命令用于調(diào)試待調(diào)試 的用戶進(jìn)程,代理線程預(yù)先設(shè)置在待調(diào)試的用戶進(jìn)程中。步驟S104,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程。相關(guān)技術(shù)中,進(jìn)程調(diào)試過(guò)程會(huì)消耗很多CPU并難以定位故障。本發(fā)明實(shí)施例在用 戶進(jìn)程中添加了代理線程,它可以根據(jù)用戶的調(diào)試命令調(diào)試用戶進(jìn)程,從而實(shí)現(xiàn)故障的快 速、準(zhǔn)確地定位,并且,如果沒有需要,代理線程是保持阻塞的,所以僅僅會(huì)增加代碼體積, 而不會(huì)消耗CPU影響系統(tǒng)性能。需要說(shuō)明的是,本發(fā)明的進(jìn)程調(diào)試方法可以適用于類Unix系統(tǒng),尤其適用于 Linux系統(tǒng)或嵌入式Linux系統(tǒng)。優(yōu)選地,代理線程接收到來(lái)自用戶的調(diào)試命令包括與代理線程對(duì)應(yīng)的代理工具 接收到來(lái)自用戶的調(diào)試命令,其中代理工具與用戶進(jìn)程分離;代理工具將調(diào)試命令轉(zhuǎn)發(fā)給 代理線程。本優(yōu)選實(shí)施例,在軟件運(yùn)行的過(guò)程中,通過(guò)代理工具直接跟運(yùn)行中的軟件交互。這 樣,用戶只需要通過(guò)telnet到待調(diào)試的系統(tǒng),運(yùn)行代理工具,并執(zhí)行一些命令,即可將代理 工具和代理線程連接,然后,可以在代理工具中輸入調(diào)試命令調(diào)試用戶進(jìn)程,或者查看用戶 進(jìn)程的全局變量值。優(yōu)選地,代理工具使用隊(duì)列方式或者管道方式將調(diào)試命令轉(zhuǎn)發(fā)給代理線程。需要說(shuō)明的是,D-Shell代理線程和D-Shell工具需要同步,否則會(huì)出現(xiàn)異常。比 如,D-Shell工具退出的時(shí)候,D-Shel 1代理線程必須恢復(fù)輸出重定向,否則D_Shel 1代理線 程將輸出往管道里面寫,卻沒有進(jìn)程讀管道,管道必定溢出。優(yōu)選地,在代理線程接收到來(lái)自用戶的調(diào)試命令之前,上述方法還包括代理線程 創(chuàng)建用戶進(jìn)程的符號(hào)表;代理線程在代理線程的私有變量中存儲(chǔ)符號(hào)表。優(yōu)選地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括代理線程分離調(diào)試 命令,得到調(diào)試函數(shù)名和參數(shù);代理線程在符號(hào)表中查找與調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù); 代理線程執(zhí)行該執(zhí)行函數(shù)。優(yōu)選地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括代理線程獲取用戶 進(jìn)程的狀態(tài)信息;代理線程向代理工具發(fā)送用戶進(jìn)程的狀態(tài)信息,其中代理工具與用戶進(jìn) 程分離。優(yōu)選地,代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程包括以下至少之一調(diào)試 命令為Printfifo,代理線程判斷代理線程的輸出是否已經(jīng)重定向到管道,如果判斷結(jié)果 為否,則將代理線程的輸出重定向到管道,否則忽略調(diào)試命令;調(diào)試命令為Debug,代理線 程判斷是否處于調(diào)試狀態(tài),如果判斷結(jié)果為否,則代理線程進(jìn)入調(diào)試狀態(tài),否則忽略調(diào)試命 令;調(diào)試命令為Quit,代理線程判斷代理線程的輸出是否已經(jīng)重定向,如果判斷結(jié)果為是, 則恢復(fù)代理線程的輸出的重定向,否則忽略調(diào)試命令。下面將結(jié)合實(shí)例對(duì)本發(fā)明實(shí)施例的實(shí)現(xiàn)過(guò)程進(jìn)行詳細(xì)描述。圖2是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊在類Unix系統(tǒng)中的應(yīng)用場(chǎng)景的示意圖, 如圖2所示,圖中有三個(gè)進(jìn)程,其中用戶進(jìn)程1和用戶進(jìn)程2是軟件的主體。D-Shell工具 (即上述代理工具)和駐留在用戶進(jìn)程中的D-Shell代理線程(即上述代理線程)共同完成D-Shell對(duì)用戶進(jìn)程的在線調(diào)試功能。D-Shell代理線程和D_Shell工具使用管道和消 息隊(duì)列來(lái)進(jìn)行交互。基于圖2的D-Shell模塊,首先需要進(jìn)行下述準(zhǔn)備工作。1、將用戶進(jìn)程(elf格式執(zhí)行文件名)加入到D-Shell配置文件中,D-Shell代理 線程和D-Shell工具都需要使用到這個(gè)配置文件。2、在應(yīng)用程序中選擇一個(gè)合適的地方進(jìn)行D-Shell代理線程初始化,D-Shell代 理線程與應(yīng)用程序編譯在一起。3、D-Shell工具需要單獨(dú)編譯。4、將D-Shell工具和應(yīng)用程序放置在同一個(gè)目錄下面,先執(zhí)行應(yīng)用程序,再執(zhí)行 D-Shell工具,這樣就可以使用D-Shell工具進(jìn)行在線調(diào)試了。然后,在用戶進(jìn)程啟動(dòng)過(guò)程中,它需要調(diào)用D-Shell初始化函數(shù),創(chuàng)建D_Shell代 理線程,D-Shell代理線程會(huì)創(chuàng)建隊(duì)列和管道,等用戶進(jìn)程正常啟動(dòng)之后,我們就可以開動(dòng) D-Shell工具對(duì)用戶進(jìn)程進(jìn)行調(diào)試了。D-Shell工具將用戶命令經(jīng)過(guò)本地解析后,通過(guò)消息 隊(duì)列發(fā)送給D-Shell代理線程。D-Shell代理線程收到用戶命令后,會(huì)在用戶進(jìn)程的空間執(zhí) 行相應(yīng)的操作,或者獲取一些有用的信息,然后通過(guò)管道傳送給D-Shell工具。D-Shell模 塊就這樣實(shí)現(xiàn)了用戶態(tài)進(jìn)程進(jìn)行在線調(diào)試的功能。圖3是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊中D-Shell線程的流程圖,如圖3所示, 包括如下的步驟S302至步驟S320。步驟S302,D-Shell 初始化。步驟S304,啟動(dòng)D-Shell代理線程。具體地,在用戶進(jìn)程初始化時(shí),調(diào)用DshelljnitO函數(shù),啟動(dòng)代理線程。并且優(yōu) 選地,D-Shell初始化函數(shù)啟動(dòng)代理線程后就回到用戶進(jìn)程,繼續(xù)執(zhí)行用戶進(jìn)程的流程。步驟S306,創(chuàng)建符號(hào)表。具體地,用戶進(jìn)程會(huì)根據(jù)配置文件讀取進(jìn)程的elf執(zhí)行文件,根據(jù)elf文件來(lái)創(chuàng)建 本進(jìn)程的符號(hào)表。步驟S308,創(chuàng)建用來(lái)輸出重定向的管道。步驟S310,創(chuàng)建用來(lái)接收D-Shell傳來(lái)的命令的隊(duì)列。步驟S312,代理線程進(jìn)入死循環(huán),阻塞讀消息隊(duì)列。步驟S314,在非調(diào)試模式(運(yùn)行調(diào)試函數(shù)狀態(tài))下,判斷是否為Printffifo、 quit、debug字符串,如果是則在步驟S318至步驟S322中選擇相應(yīng)的執(zhí)行,如果不是以上 字符串,則進(jìn)行步驟S316。步驟S316,判斷是否是調(diào)試狀態(tài),如果是則分離調(diào)試函數(shù)并執(zhí)行調(diào)試函數(shù),如果不 是則忽略,并返回步驟S312。具體地,分離調(diào)試函數(shù)并執(zhí)行調(diào)試函數(shù)包括如下的步驟1、先將字符串分離成函數(shù)名和參數(shù)的形式。2、查符號(hào)表找到函數(shù)或變量。3、執(zhí)行函數(shù),或顯示變量值。步驟S318,判斷是否輸出未重定向,如果是則將輸出重定向到pipe,如果已重定 向,則忽略,并返回步驟S312。
步驟S320,判斷是否是調(diào)試狀態(tài),如果不是則進(jìn)入調(diào)試狀態(tài),如果是則忽略,并返 回步驟S312。步驟S322,判斷是否是輸出未重定向,如果是則忽略,如果不是(即已重定向),則 恢復(fù)輸出至標(biāo)準(zhǔn)設(shè)備,并返回步驟S312。圖4是根據(jù)本發(fā)明實(shí)施例的D-Shell模塊中D_Shell工具的流程圖,如圖4所示, 包括如下的步驟S402至S420。這個(gè)模塊需要獨(dú)立編譯,在用戶進(jìn)程上電完成后使用,它的作用是利用進(jìn)程間通 信原理將用戶的命令傳給用戶進(jìn)程空間。步驟S402,D-Shell工具啟動(dòng),并執(zhí)行步驟S404和步驟S412。步驟S404,開啟D-Shell管道守護(hù)線程,阻塞讀管道。步驟S406,管道守護(hù)線程會(huì)根據(jù)讀到配置文件中的進(jìn)程信息,打開每個(gè)進(jìn)程的管 道。步驟S408,調(diào)用select阻塞讀上述每個(gè)進(jìn)程的管道。步驟S410,根據(jù)Select返回值選擇讀取管道并打印,然后返回進(jìn)行步驟S408。步驟S412,D-Shell工具主線程繼續(xù)打開消息隊(duì)列,消息隊(duì)列也是由用戶進(jìn)程創(chuàng)建。步驟S414,D-Shell使用格式輸入的系統(tǒng)調(diào)用或readline庫(kù)的調(diào)用,讀取用戶從 鍵盤輸入的命令。這里也會(huì)阻塞,直到用戶敲入命令并以回車結(jié)束,D-Shell工具會(huì)進(jìn)入用 戶命令分析流程。步驟S416,判斷是否為調(diào)試狀態(tài),如果是則進(jìn)行步驟S418,否則進(jìn)行步驟S420。步驟S418,若用戶進(jìn)程為調(diào)試狀態(tài),鍵盤獲取輸入為‘Q’,就進(jìn)入非調(diào)試狀態(tài),并 向?qū)?yīng)消息隊(duì)列發(fā)送“Quit”,如果是別的字符串,D-Shell會(huì)認(rèn)為它是調(diào)試函數(shù),D-Shell 工具會(huì)將字符串直接發(fā)送到消息隊(duì)列。步驟S420,如果用戶進(jìn)程不是調(diào)試狀態(tài),D-Shell會(huì)對(duì)輸入的字符串進(jìn)行比對(duì)。對(duì) 不同的命令會(huì)執(zhí)行相應(yīng)的操作,使D-Shell代理線程進(jìn)入不同的狀態(tài),或者輸出重定向,或 者進(jìn)入調(diào)試狀態(tài)。即向?qū)?yīng)進(jìn)程的消息隊(duì)列發(fā)送“Printfifo”或者“Debug”。優(yōu)選地,對(duì)于調(diào)試狀態(tài)下的調(diào)試函數(shù),D-Shell工具會(huì)調(diào)用readline庫(kù)函數(shù)來(lái)對(duì) 近10次執(zhí)行的調(diào)試函數(shù)進(jìn)行歷史保留操作,使用上下方向鍵即可調(diào)用之前使用過(guò)的調(diào)試 函數(shù)。需要說(shuō)明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的 計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不 同于此處的順序執(zhí)行所示出或描述的步驟。 本發(fā)明實(shí)施例提供了 一種進(jìn)程調(diào)試裝置,該進(jìn)程調(diào)試裝置可以用于實(shí)現(xiàn)上述進(jìn)程 調(diào)試方法。圖5是根據(jù)本發(fā)明實(shí)施例的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖,如圖5所示,包括接收模 塊52和調(diào)試模塊54。下面對(duì)其進(jìn)行詳細(xì)描述。接收模塊52,用于接收來(lái)自用戶的調(diào)試命令,其中調(diào)試命令用于調(diào)試待調(diào)試的用 戶進(jìn)程,接收模塊所屬的代理線程預(yù)先設(shè)置在待調(diào)試的用戶進(jìn)程中;調(diào)試模塊54,連接至 接收模塊52,用于根據(jù)接收模塊52接收的調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程。圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例一的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖。
優(yōu)選地,上述進(jìn)程調(diào)試裝置還包括創(chuàng)建模塊56和存儲(chǔ)模塊58,下面對(duì)其進(jìn)行詳細(xì) 描述。創(chuàng)建模塊56,用于創(chuàng)建用戶進(jìn)程的符號(hào)表;存儲(chǔ)模塊58,連接至創(chuàng)建模塊56,用于 在代理線程的私有變量中存儲(chǔ)創(chuàng)建模塊56創(chuàng)建的符號(hào)表。圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例二的進(jìn)程調(diào)試裝置的結(jié)構(gòu)框圖。優(yōu)選地,調(diào)試模塊54包括分離子模塊542,查找子模塊544和執(zhí)行子模塊546,下 面對(duì)其結(jié)構(gòu)進(jìn)行詳細(xì)描述。分離子模塊542,連接至接收模塊52,用于分離接收模塊52接收的調(diào)試命令,得 到調(diào)試函數(shù)名和參數(shù);查找子模塊544,連接至分離子模塊542,用于在符號(hào)表中查找與分 離子模塊542分離得到的調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù);執(zhí)行子模塊546,連接至查找子模塊 544,用于執(zhí)行查找子模塊544查找的執(zhí)行函數(shù)。需要說(shuō)明的是,裝置實(shí)施例中描述的進(jìn)程調(diào)試裝置對(duì)應(yīng)于上述的方法實(shí)施例,其 具體的實(shí)現(xiàn)過(guò)程在方法實(shí)施例中已經(jīng)進(jìn)行過(guò)詳細(xì)說(shuō)明,在此不再贅述。綜上所述,根據(jù)本發(fā)明的上述實(shí)施例,提供了 一種進(jìn)程調(diào)試方法及裝置。通過(guò)在用 戶進(jìn)程中添加了代理線程,它可以根據(jù)用戶的調(diào)試命令調(diào)試用戶進(jìn)程,解決了相關(guān)技術(shù)中 進(jìn)程調(diào)試過(guò)程會(huì)消耗很多CPU并難以定位故障的問(wèn)題,從而實(shí)現(xiàn)故障的快速、準(zhǔn)確地定位, 并且,如果沒有需要,代理線程是保持阻塞的,所以僅僅會(huì)增加代碼體積,而不會(huì)消耗CPU 影響系統(tǒng)性能。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用 的計(jì)算裝置來(lái)實(shí)現(xiàn),它們可以集中在單個(gè)的計(jì)算裝置上,或者分布在多個(gè)計(jì)算裝置所組成 的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來(lái)實(shí)現(xiàn),從而,可以將它們存儲(chǔ) 在存儲(chǔ)裝置中由計(jì)算裝置來(lái)執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們 中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來(lái)實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的 硬件和軟件結(jié)合。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技 術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修 改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種進(jìn)程調(diào)試方法,其特征在于,包括代理線程接收到來(lái)自用戶的調(diào)試命令,其中所述調(diào)試命令用于調(diào)試待調(diào)試的用戶進(jìn) 程,所述代理線程預(yù)先設(shè)置在所述待調(diào)試的用戶進(jìn)程中;所述代理線程根據(jù)所述調(diào)試命令,調(diào)試所述待調(diào)試的用戶進(jìn)程。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述代理線程接收到來(lái)自所述用戶的所 述調(diào)試命令包括與所述代理線程對(duì)應(yīng)的代理工具接收到來(lái)自所述用戶的所述調(diào)試命令,其中所述代理 工具與所述用戶進(jìn)程分離;所述代理工具將所述調(diào)試命令轉(zhuǎn)發(fā)給所述代理線程。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述代理工具使用隊(duì)列方式或者管道方 式將所述調(diào)試命令轉(zhuǎn)發(fā)給所述代理線程。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述代理線程接收到來(lái)自所述用戶的 所述調(diào)試命令之前,所述方法還包括所述代理線程創(chuàng)建所述用戶進(jìn)程的符號(hào)表;所述代理線程在所述代理線程的私有變量中存儲(chǔ)所述符號(hào)表。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述代理線程根據(jù)所述調(diào)試命令,調(diào)試所 述待調(diào)試的用戶進(jìn)程包括所述代理線程分離所述調(diào)試命令,得到調(diào)試函數(shù)名和參數(shù); 所述代理線程在所述符號(hào)表中查找與所述調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù); 所述代理線程執(zhí)行所述執(zhí)行函數(shù)。
6.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述代理線程根據(jù)所述調(diào)試命令,調(diào)試所 述待調(diào)試的用戶進(jìn)程包括所述代理線程獲取所述用戶進(jìn)程的狀態(tài)信息;所述代理線程向代理工具發(fā)送所述用戶進(jìn)程的狀態(tài)信息,其中所述代理工具與所述用 戶進(jìn)程分離。
7.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述代理線程根據(jù)所述調(diào)試命令,調(diào)試所 述待調(diào)試的用戶進(jìn)程包括以下至少之一所述調(diào)試命令為Printfifo,所述代理線程判斷所述代理線程的輸出是否已經(jīng)重定向 到管道,如果判斷結(jié)果為否,則將所述代理線程的輸出重定向到管道,否則忽略所述調(diào)試命 令;所述調(diào)試命令為Debug,所述代理線程判斷是否處于調(diào)試狀態(tài),如果判斷結(jié)果為否,則 所述代理線程進(jìn)入調(diào)試狀態(tài),否則忽略所述調(diào)試命令;所述調(diào)試命令為Quit,所述代理線程判斷所述代理線程的輸出是否已經(jīng)重定向,如果 判斷結(jié)果為是,則恢復(fù)所述代理線程的輸出的重定向,否則忽略所述調(diào)試命令。
8.—種進(jìn)程調(diào)試裝置,其特征在于,包括接收模塊,用于接收來(lái)自用戶的調(diào)試命令,其中所述調(diào)試命令用于調(diào)試待調(diào)試的用戶 進(jìn)程,所述接收模塊所屬的代理線程預(yù)先設(shè)置在所述待調(diào)試的用戶進(jìn)程中; 調(diào)試模塊,用于根據(jù)所述調(diào)試命令,調(diào)試所述待調(diào)試的用戶進(jìn)程。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,還包括創(chuàng)建模塊,用于創(chuàng)建所述用戶進(jìn)程的符號(hào)表;存儲(chǔ)模塊,用于在所述代理線程的私有變量中存儲(chǔ)所述符號(hào)表。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述調(diào)試模塊包括分離子模塊,用于分離所述調(diào)試命令,得到調(diào)試函數(shù)名和參數(shù);查找子模塊,用于在所述符號(hào)表中查找與所述調(diào)試函數(shù)名對(duì)應(yīng)的執(zhí)行函數(shù);執(zhí)行子模塊,用于執(zhí)行所述執(zhí)行函數(shù)。
全文摘要
本發(fā)明公開了一種進(jìn)程調(diào)試方法及裝置,該方法包括代理線程接收到來(lái)自用戶的調(diào)試命令,其中調(diào)試命令用于調(diào)試待調(diào)試的用戶進(jìn)程,代理線程預(yù)先設(shè)置在待調(diào)試的用戶進(jìn)程中;代理線程根據(jù)調(diào)試命令,調(diào)試待調(diào)試的用戶進(jìn)程。本發(fā)明可以實(shí)現(xiàn)故障的快速、準(zhǔn)確定位。
文檔編號(hào)G06F11/36GK102004692SQ201010559840
公開日2011年4月6日 申請(qǐng)日期2010年11月25日 優(yōu)先權(quán)日2010年11月25日
發(fā)明者王才才 申請(qǐng)人:中興通訊股份有限公司