專利名稱:一種基于jpda的面向?qū)嵤┤藛T的軟件運(yùn)行控制方法
技術(shù)領(lǐng)域:
本發(fā)明涉及基于Java平臺(tái)調(diào)試框架(JPDA)來開發(fā)Java調(diào)試程序的方法,該 調(diào)試程序提供給實(shí)施人員而不是軟件開發(fā)人員使用。
背景技術(shù):
軟件維護(hù)在整個(gè)軟件生命周期預(yù)算中占很大比例是公認(rèn)的。它占軟件生命周期 費(fèi)用的70%是常見的(而軟件開發(fā)占30%)。按一般的經(jīng)驗(yàn)法則,軟件維護(hù)預(yù)算的 分配是60%用于功能增強(qiáng);適應(yīng)新環(huán)境和糾錯(cuò)各占20%。所以對(duì)于軟件實(shí)施人員 來講,軟件實(shí)施是一項(xiàng)非常大的工作。再者,目前高性能服務(wù)器相關(guān)的軟件產(chǎn)品 都是由實(shí)施人員現(xiàn)場(chǎng)安裝,由軟件開發(fā)人員提供遠(yuǎn)程技術(shù)支持。而實(shí)施人員對(duì)于 軟件本身并不了解,遇到的錯(cuò)誤自己并不能及時(shí)解決,也不能很好地定位問題的 所在。
目前主要的解決辦法就是軟件開發(fā)人員事先在軟件內(nèi)部設(shè)定一些標(biāo)志性輸出, 這種方式的缺點(diǎn)是實(shí)施人員能夠獲得的信息量是固定的,而且在很多情況是不 夠的; 一些軟件如Web項(xiàng)目,實(shí)施人員需要深入到Web服務(wù)器內(nèi)部才能獲得其輸 出;實(shí)施人員只能被動(dòng)地觀察軟件的運(yùn)行狀態(tài),而不能控制軟件的運(yùn)行,如暫停 執(zhí)行。鑒于此,本發(fā)明提供了一種基于JPDA的面向?qū)嵤┤藛T的軟件運(yùn)行控制方法。 由該方法實(shí)現(xiàn)的Java工具可以控制軟件的運(yùn)行,監(jiān)控軟件的運(yùn)行狀態(tài),同時(shí),軟 件運(yùn)行過程中的所有標(biāo)志性輸出也可以通過該Java工具由實(shí)施人員選擇性地直觀 地査看。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種基于JPDA的面向?qū)嵤┤藛T的軟件運(yùn)行控制方法。 該方法是利用Java調(diào)試接口 (JDI)實(shí)現(xiàn)一個(gè)Java工具,該Java工具通過 配置文件初始化軟件的斷點(diǎn)和狀態(tài)信息。接下來,該Java工具啟動(dòng)軟件的執(zhí)行或 者通過Socket連接到已啟動(dòng)的軟件,并獲得對(duì)軟件的JVM的引用。通過該引用設(shè) 定軟件的斷點(diǎn)和狀態(tài)信息。接下來,該Java工具通過其提供的事件監(jiān)聽機(jī)制,監(jiān) 聽斷點(diǎn)事件,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶執(zhí)行操作(繼續(xù)或暫停)。 該方法可以分為以下步驟
1)修改配置文件,定義該程序的運(yùn)行方式,選擇啟動(dòng)軟件的執(zhí)行還是通過Socket連接,如果是Socket連接,需要目的軟件的IP和端口;定義可選的斷點(diǎn) 以及斷點(diǎn)的說明,軟件的運(yùn)行狀態(tài)以及狀態(tài)的說明。
2) 啟動(dòng)該Java工具,獲得對(duì)目的軟件的JVM的引用。
3) 提供實(shí)施人員選擇設(shè)定的斷點(diǎn),并通過該JVM引用設(shè)定這些斷點(diǎn)以及軟件 的狀態(tài)。
4) 該Java工具將一直運(yùn)行,顯示軟件的輸出,直到一個(gè)已設(shè)定的斷點(diǎn)暫停 執(zhí)行,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶操作。
本發(fā)明的有益效果是通過該方法開發(fā)的Java工具,提供一個(gè)面向軟件開發(fā) 人員的配置接口,由軟件開發(fā)人員定義軟件的可選斷點(diǎn)、可選狀態(tài)以及對(duì)這些斷 點(diǎn)和狀態(tài)的說明,實(shí)施人員根據(jù)這些說明選擇設(shè)定斷點(diǎn),運(yùn)行該Java工具,監(jiān)控 軟件的運(yùn)行狀態(tài)。軟件運(yùn)行過程中的所有輸出也可以通過該Java工具由實(shí)施人員 選擇性地查看、控制軟件的運(yùn)行,監(jiān)控軟件的運(yùn)行狀態(tài),以做到幫助實(shí)施人員及 時(shí)、準(zhǔn)確地定位問題的目的。
具體實(shí)施例方式
本發(fā)明的方法是利用Java調(diào)試接口 JDI實(shí)現(xiàn)一個(gè)Java工具,該Java工具通 過配置文件初始化軟件的斷點(diǎn)和狀態(tài)信息,接下來,該Java工具啟動(dòng)軟件的執(zhí)行 或者通過Socket連接到己?jiǎn)?dòng)的軟件,并獲得對(duì)軟件的JVM的引用,通過該引用 設(shè)定軟件的斷點(diǎn)和狀態(tài)信息,接下來,該Java工具通過其提供的事件監(jiān)聽機(jī)制, 監(jiān)聽斷點(diǎn)事件,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶執(zhí)行操作包括繼續(xù)或暫停;
該方法分為以下步驟-
1) 修改配置文件,定義該程序的運(yùn)行方式,選擇啟動(dòng)軟件的執(zhí)行還是通過 Socket連接,是Socket連接,需要目的軟件的IP和端口 ;定義可選的斷點(diǎn)以及 斷點(diǎn)的說明軟件的運(yùn)行狀態(tài)以及狀態(tài)的說明;
2) 啟^該Java工具,獲得對(duì)目的軟件的JVM的引用;
3) 提供實(shí)施人員選擇設(shè)定的斷點(diǎn),并通過該JVM引用設(shè)定這些斷點(diǎn)以及軟件 的狀態(tài);
4) 該Java工具將一直運(yùn)行,顯示軟件的輸出,直到一個(gè)已設(shè)定的斷點(diǎn)暫停執(zhí) 行,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶操作。
本發(fā)明的方法包括兩種運(yùn)行方式, 一種是預(yù)先啟動(dòng)軟件,該Java工具通過 Socket連接該軟件;另一種是由該Java工具中啟動(dòng)軟件的運(yùn)行,在Java工具中 設(shè)置一個(gè)面向軟件開發(fā)人員的配置接口 ,由軟件開發(fā)人員定義軟件的可選斷點(diǎn)、 可選狀態(tài)以及對(duì)這些斷點(diǎn)和狀態(tài)的說明,實(shí)施人員根據(jù)這些說明選擇設(shè)定斷點(diǎn),運(yùn)行該Java工具,監(jiān)控軟件的運(yùn)行狀態(tài),軟件運(yùn)行過程中的所有輸出通過該Java 工具由實(shí)施人員選擇性地查看。
Java工具通過本地和遠(yuǎn)程兩種方式控制軟件的運(yùn)行,尤其對(duì)于集群系統(tǒng),在 局域網(wǎng)內(nèi)通過單一映像的方式對(duì)多臺(tái)服務(wù)器進(jìn)行控制,網(wǎng)絡(luò)條件允許,由軟件開 發(fā)人員進(jìn)行遠(yuǎn)程協(xié)助以避免由圖形協(xié)助方式所帶來的網(wǎng)速問題。
Java工具允許實(shí)施人員選擇設(shè)定斷點(diǎn),監(jiān)控軟件的運(yùn)行狀態(tài),Java工具將一 直運(yùn)行直到一個(gè)已設(shè)定的斷點(diǎn),此時(shí)實(shí)施人員通過監(jiān)控軟件的運(yùn)行狀態(tài),選擇退 出或者繼續(xù)運(yùn)行,Java工具將一直運(yùn)行直到下一個(gè)斷點(diǎn)。
軟件運(yùn)行過程中的所有輸出通過Java工具由實(shí)施人員選擇性地查看,做到了對(duì) 軟件本身提供的靜態(tài)輸出包括正確信息和錯(cuò)誤信息的支持。
實(shí)施例
該方法分為以下步驟
第一步
〃定義Java工具的運(yùn)行方式,false表示由該程序啟動(dòng)軟件的運(yùn)行 socket: false
〃Socket方式下,目的軟件的IP socket—ip: 10.152.11.61
〃Scoket方式下,目的軟件的端口號(hào) scoket一port: 37580
〃可選&斷點(diǎn)以及說明
breakpoint—method—1: com. langchao. Classl一methodl des—method—l:Classl的methodl方法 breakpoint_method_2: com. langchao. Classl_method2 des—method—2: Class2的method2方法 〃^件的狀i以及說明
breakpoint_field—1: com. langchao. Classl—fieldl
des—field—1: Classl的filedl狀態(tài)
帛二步
選擇"由該Java工具啟動(dòng)軟件的運(yùn)行"的方式。 LaunchingCormector connector = null; 〃對(duì)目的軟件的JVM的引用 VirtualMachine vm = null;
〃首先要獲得"由該Java工具啟動(dòng)軟件的執(zhí)行"所需要的連接 List〈Connector> list Bootstrap. pa'/^〃a7勸cAz'/7e胞/7a^eH). allConnectors (): Iterator<Connector> it = list, iterator(); while (it. hasNext())Connector obj = (Connector)it. next();
if (obj. name (). equals ("com. sun. jdi. CommandLineLaunch"))
connector = (LaunchingConnector)obj: break;
〃設(shè)置軟件的啟動(dòng)類
Map〈String, Connector. Argument> args = connector. defaultArguments0 Connector. Argument mainArg = (Connector. Argument)args. get("main"); mainArg. setValue(className); 〃獲得對(duì)目的軟件的JVM的引用 vm = connector, launch(args); 第三步
List<ReferenceType> list = vm. allClasses0; Iterator<ReferenceType> it = list, iterator(); ClassType ct = null: 〃捕獲類
while (it. hasNext 0)
ReferenceType rt = it. next 0; if(rt instanceof ClassType)
if(rt. name 0. equals("className")) rt = (ClassType)rt;
〃捕獲并激活已設(shè)定的斷點(diǎn)
List〈Method> listMethod = ct. methodsByName(〃methodName"); IteratoKMethod〉 itMethod = listMethod. iterator 0 ; Method m = itMethod. next 0 ; Location loc = m. location():
BreakpointRequest bpr = mgr. createBreakpointRequest(loc); bpr. enable ();〃激活斷點(diǎn) 第四步〃捕獲斷點(diǎn)。
void methodEntryEvent(MethodEntryEvent event)
println(event.method(). name()+ " event, method 0. declaringType 0 . name()); indent, append("| ");
〃獲得軟件的運(yùn)行狀態(tài),并請(qǐng)求用戶操作 void fieldWatchEvent(ModificationWatchpointEvent event)
Field field = event, field():
Value value 二 event. valueToBe0;
println(" " + field, name () + " = " + value);
BufferedReader br 二 new BufferedReader(new
I叩utStreamReader (System. _// )); try
System. oW. println(〃按任意鍵繼續(xù)"); br. read();
catch(IOExc印tion e)
e. printStackTrace0;
權(quán)利要求
1、一種基于JPDA的面向?qū)嵤┤藛T的軟件運(yùn)行控制方法,其特征在于,該方法是利用Java調(diào)試接口JDI實(shí)現(xiàn)一個(gè)Java工具,該Java工具通過配置文件初始化軟件的斷點(diǎn)和狀態(tài)信息,接下來,該Java工具啟動(dòng)軟件的執(zhí)行或者通過Socket連接到已啟動(dòng)的軟件,并獲得對(duì)軟件的JVM的引用,通過該引用設(shè)定軟件的斷點(diǎn)和狀態(tài)信息,接下來,該Java工具通過其提供的事件監(jiān)聽機(jī)制,監(jiān)聽斷點(diǎn)事件,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶執(zhí)行操作包括繼續(xù)或暫停;具體步驟如下 id="icf0001" file="A2009100168040002C1.tif" wi="1" he="3" top= "73" left = "28" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>1 id="icf0002" file="A2009100168040002C2.tif" wi="1" he="4" top= "73" left = "33" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>修改配置文件,定義該程序的運(yùn)行方式,選擇啟動(dòng)軟件的執(zhí)行還是通過Socket連接,是Socket連接,需要目的軟件的IP和端口;定義可選的斷點(diǎn)以及斷點(diǎn)的說明,軟件的運(yùn)行狀態(tài)以及狀態(tài)的說明; id="icf0003" file="A2009100168040002C3.tif" wi="1" he="4" top= "94" left = "28" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>2 id="icf0004" file="A2009100168040002C5.tif" wi="2" he="4" top= "95" left = "32" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>啟動(dòng)該Java工具,獲得對(duì)目的軟件的JVM的引用; id="icf0005" file="A2009100168040002C6.tif" wi="1" he="3" top= "103" left = "28" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>3 id="icf0006" file="A2009100168040002C7.tif" wi="1" he="3" top= "102" left = "33" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>提供實(shí)施人員選擇設(shè)定的斷點(diǎn),并通過該JVM引用設(shè)定這些斷點(diǎn)以及軟件的狀態(tài); id="icf0007" file="A2009100168040002C8.tif" wi="2" he="4" top= "117" left = "28" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>4 id="icf0008" file="A2009100168040002C9.tif" wi="1" he="4" top= "117" left = "33" img-content="drawing" img-format="tif" orientation="portrait" inline="yes"/>該Java工具將一直運(yùn)行,顯示軟件的輸出,直到一個(gè)已設(shè)定的斷點(diǎn)暫停執(zhí)行,顯示軟件的狀態(tài)信息,并請(qǐng)求用戶操作。
2、 根據(jù)權(quán)利要求1所述的方法,其特征在于,包括兩種運(yùn)行方式, 一種是預(yù) 先啟動(dòng)軟件,該Java工具通過Socket連接該軟件;另一種是由該Java工具中啟 動(dòng)軟件的運(yùn)行,在Java工具中設(shè)置一個(gè)面向軟件開發(fā)人員的配置接口,由軟件開 發(fā)人員定義軟件的可選斷點(diǎn)、可選狀態(tài)以及對(duì)這些斷點(diǎn)和狀態(tài)的說明,實(shí)施人員 根據(jù)這些說明選擇設(shè)定斷點(diǎn),運(yùn)行該Java工具,監(jiān)控軟件的運(yùn)行狀態(tài),軟件運(yùn)行 過程中的所有輸出通過該Java工具由實(shí)施人員選擇性地査看。
3、 根據(jù)權(quán)利要求1所述的方法,其特征在于,Java工具通過本地和遠(yuǎn)程兩 種方式控制軟件的運(yùn)行,尤其對(duì)于集群系統(tǒng),在局域網(wǎng)內(nèi)通過單一映像的方式對(duì) 多臺(tái)服務(wù)器進(jìn)行控制,網(wǎng)絡(luò)條件允許,由軟件開發(fā)人員進(jìn)行遠(yuǎn)程協(xié)助以避免由圖 形協(xié)助方式所帶來的網(wǎng)速問題。
4、 根據(jù)權(quán)利要求1所述的方法,其特征在于,Java工具允許實(shí)施人員選擇設(shè) 定斷點(diǎn),監(jiān)控軟件的運(yùn)行狀態(tài),Java工具將一直運(yùn)行直到一個(gè)已設(shè)定的斷點(diǎn),此 時(shí)實(shí)施人員通過監(jiān)控軟件的運(yùn)行狀態(tài),選擇退出或者繼續(xù)運(yùn)行,Java工具將一直 運(yùn)行直到下一個(gè)斷點(diǎn)。
5、根據(jù)權(quán)利要求1所述的方法,其特征在于,軟件運(yùn)行過程中的所有輸出通 過Java工具由實(shí)施人員選擇性地査看,做到了對(duì)軟件本身提供的靜態(tài)輸出包括正 確信息和錯(cuò)誤信息的支持。
全文摘要
本發(fā)明提供了一種基于JPDA的面向?qū)嵤┤藛T的軟件運(yùn)行控制方法,該方法基于JPDA技術(shù),面向基于Java開發(fā)的軟件。由該方法實(shí)現(xiàn)的java工具可以有兩種運(yùn)行方式,一種方式是基于java開發(fā)的軟件已經(jīng)啟動(dòng)運(yùn)行,該Java工具通過Socket連接該軟件,然后進(jìn)行軟件運(yùn)行控制;另一種方式是在該Java工具中執(zhí)行軟件的啟動(dòng)。通過該方法開發(fā)的Java工具,還提供一個(gè)面向軟件開發(fā)人員的配置接口,由軟件開發(fā)人員定義軟件的可選斷點(diǎn)、可選狀態(tài)以及對(duì)這些斷點(diǎn)和狀態(tài)的說明,實(shí)施人員根據(jù)這些說明選擇設(shè)定斷點(diǎn),運(yùn)行該Java工具,監(jiān)控軟件的運(yùn)行狀態(tài)。軟件運(yùn)行過程中的所有輸出也可以通過該Java工具由實(shí)施人員選擇性地查看。
文檔編號(hào)G06F11/36GK101599045SQ20091001680
公開日2009年12月9日 申請(qǐng)日期2009年7月7日 優(yōu)先權(quán)日2009年7月7日
發(fā)明者剛 李, 邸雙朋, 健 魏 申請(qǐng)人:浪潮電子信息產(chǎn)業(yè)股份有限公司