詳情:nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=0928,server=y,suspend=y -Xms4096m -Xmx4096m -classpath /mvtech/work/isms.jar com.mvtech.app.main.StartServer 2>error.log&
1、在遠(yuǎn)程機(jī)上運(yùn)行程序
在遠(yuǎn)程主機(jī)(該例中使用的是一個(gè)Solaris機(jī)器)的適當(dāng)位置創(chuàng)建一個(gè)文件夾,這里在用戶目錄下創(chuàng)建了temp目錄及子目錄helloantworld,將你在本地編譯生成的lib目錄(其中包括兩個(gè)jar文件:HelloAntWorld.jar,ojdbc6.jar)通過ftp目錄傳至新建的~/temp/helloantworld下。
有~/temp/helloantworld下新建shell腳本文件exec.sh,包含以下內(nèi)容:
#!/bin/sh
echo start to run HelloAntWorld
java -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y -jar lib/HelloAntWorld.jar
關(guān)于這個(gè)exec.sh文件,≈Windows上的batch文件。第一個(gè)應(yīng)該是注釋,第二行的echo即回顯命令,可以打印一行話。第三行是重點(diǎn),我們知道如果僅僅是執(zhí)行這個(gè)HelloAntWorld.jar,可以寫成:java -jar lib/HelloAntWorld.jar
而中間這些參數(shù)正是為了Remote debug而設(shè):
-XDebug啟用調(diào)試
-Xrunjdwp加載JDWP的JPDA參考執(zhí)行實(shí)例。
transport用于在調(diào)試程序和VM使用的進(jìn)程之間通訊。
dt_socket套接字傳輸。
server=y/n???????????????????????????? VM是否需要作為調(diào)試服務(wù)器執(zhí)行。
address=9527調(diào)試服務(wù)器監(jiān)聽的端口號。
suspend=y/n是否在調(diào)試客戶端建立連接之后啟動VM。
關(guān)于suspend多說一句,如果設(shè)置為y,它會阻塞程序運(yùn)行,直到有客戶端連接到對應(yīng)的監(jiān)聽端口(這里是9527),程序才真正開始執(zhí)行。我們有時(shí)候會抱怨程序一閃而過,還沒來得及在本地加載上代碼程序就執(zhí)行完了,這種情況就可以使用suspend參數(shù)。
還有一個(gè)細(xì)節(jié)是-jar參數(shù)不能寫到-Xdebug參數(shù)前,像這樣無法啟用調(diào)試:
java -jar lib/HelloAntWorld.jar -Xdebug -Xrunjdwp:transport=dt_socket,address=9527,server=y,suspend=y
2.開始調(diào)試
在~/temp/helloantworld目錄下執(zhí)行exec.sh,可以看到輸出,
start to run HelloAntWorld
Listening for transport dt_socket at address: 9527
在本地的eclipse里,預(yù)先在代碼里打上斷點(diǎn),然后debug/debug configurations/Remote Java Application,在Host中輸入遠(yuǎn)程主機(jī)的IP,在Port中輸入遠(yuǎn)程主機(jī)的監(jiān)聽端口,這里是9527,然后點(diǎn)Debug,如果不出意外代碼將走到斷點(diǎn)。
如果代碼未走到斷點(diǎn)處并且提示“缺乏行號信息,無法設(shè)置斷點(diǎn)”(Unable to install breakpoint in … due to missing line number attributes. Modify compiler options to generate line number attributes),請檢查以下設(shè)置:
1)eclipse Window/Preferences/Java/Compiler/Classfile Generation: "add line number attributes to generated class file"是否已選中。
2)如果已經(jīng)選中,檢查你使用的Ant build.xml文件,對javac是否已經(jīng)設(shè)置了參數(shù)debug=”true”。
實(shí)例:
#!/bin/sh
echo created by meter @copyright 2017
ps -ef|grep /mvtech/work/isms.jar|grep StartServer|awk '{print $2}'|xargs kill -9
a=$?
b=0
if [ $a == $b ]
then
echo stop isms.jar success
rm -rf /mvtech/work/error.log
echo error.log removed.
rm -rf /mvtech/work/nohup.out
echo nohup.out removed
rm -rf /mvtech/work/ismslog/*
echo ismslog.txt removed.
echo log files was removed.
else
echo stop error.Mayby isms.jar is not running
fi
sleep 3s
echo start now:
echo java running in debug....
nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=0928,server=y,suspend=y -Xms4096m -Xmx4096m -classpath /mvtech/work/isms.jar com.mvtech.app.main.StartServer 2>error.log&
echo listining port 0928
echo started .