Java关于远程调试程序教程
?
本節(jié)嘗試一下Java遠(yuǎn)程調(diào)試的東西,記錄一遍簡(jiǎn)單入門的東西。也就算是使用記錄吧!
寫一個(gè)簡(jiǎn)單程序打成jar丟到遠(yuǎn)程服務(wù)器運(yùn)行,模擬遠(yuǎn)程Server在運(yùn)行。就拿Java調(diào)用shell腳本提交作業(yè)程序?yàn)槔治?。源碼如下(如下程序就是一個(gè)簡(jiǎn)單示例代碼,不要在乎代碼規(guī)范):
import java.io.InputStream;public class JavaShell {public static void main(String[] args) throws Exception {try {String grant = "chmod u+x submit-job.sh";Runtime runtime = Runtime.getRuntime();Process grantProc = runtime.exec(grant);int resultCode = grantProc.waitFor();System.out.println(resultCode);grantProc = runtime.exec("./submit-job.sh");resultCode = grantProc.waitFor();System.out.println(resultCode);InputStream in = grantProc.getInputStream();byte[] buffer = new byte[1024];int code;while ((code = in.read(buffer, 0, buffer.length)) != -1) {System.out.print(new String(buffer, 0, code));}/*** 死循環(huán)阻止debugger沒(méi)有連接上之前程序退出(測(cè)試suspend參數(shù)功能) */System.out.println("shell腳本執(zhí)行完畢,接下來(lái)開(kāi)始進(jìn)行定時(shí)打印任務(wù)!");int i = 0;while (true) {Thread.sleep(2000);System.out.println("這是第" + (++i) + "次循環(huán)!");}} catch (Exception e) {System.out.println("this is a excption !");} finally {}}}打成Jar包提交到遠(yuǎn)程服務(wù)器之后運(yùn)行:
java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=y -jar JavaShell.jar?
會(huì)發(fā)現(xiàn)程序阻塞,并等待debugger連接,此時(shí)我們可以使用eclipse進(jìn)行遠(yuǎn)程調(diào)試:
點(diǎn)擊debugger即可進(jìn)行連接,跟蹤源碼運(yùn)行:
?
?遠(yuǎn)程有輸出,證明遠(yuǎn)程程序正在跟蹤debugger執(zhí)行:
?
?到此我們就完成了調(diào)試的過(guò)程。接下來(lái)試一下參數(shù)suspend=n的情況:
java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n -jar JavaShell.jar此時(shí)會(huì)發(fā)現(xiàn)遠(yuǎn)程程序并沒(méi)有阻塞等待調(diào)試器debugger連接,而是程序正常執(zhí)行:
?
?此時(shí)我們可以使用eclipse的遠(yuǎn)程debugger進(jìn)行遠(yuǎn)程調(diào)試,但是需要注意:此時(shí)我們本地的斷點(diǎn)只能打在遠(yuǎn)程還沒(méi)有執(zhí)行的代碼處或者正在執(zhí)行的代碼位置,例如我們就可以在死循環(huán)中打斷點(diǎn)(死循環(huán)是一直正在執(zhí)行的代碼):
?
?然后啟動(dòng)debugger之后:
停留在斷點(diǎn)處。然后跟著斷點(diǎn)位置繼續(xù)我們的debug工作。到此就應(yīng)該可以知道suspend參數(shù)的作用了:
在JVM DEBUG參數(shù)中,有一個(gè)參數(shù)叫"suspend",它的取值有兩個(gè),“y”或者“n”。
如果您剛開(kāi)始就想調(diào)試的話,將參數(shù)設(shè)置為"suspend=y",這樣Eclipse會(huì)遠(yuǎn)程連接Java應(yīng)用程序。
如果你想先運(yùn)行項(xiàng)目,然后連接Eclipse,那么可以將參數(shù)設(shè)置為"suspend=n",這樣的話,Java應(yīng)用程序會(huì)正常運(yùn)行,之后Eclipse會(huì)開(kāi)始遠(yuǎn)程連接。
?
更多參數(shù)細(xì)節(jié):
-XDebug?????????????? 啟用調(diào)試。
-Xnoagent???????????? 禁用默認(rèn)sun.tools.debug調(diào)試器。
-Djava.compiler=NONE? 禁止 JIT 編譯器的加載。
-Xrunjdwp???????????? 加載JDWP的JPDA參考執(zhí)行實(shí)例。
transport???????????? 用于在調(diào)試程序和 VM 使用的進(jìn)程之間通訊。
dt_socket???????????? 套接字傳輸。
dt_shmem????????????? 共享內(nèi)存?zhèn)鬏?#xff0c;僅限于 Windows。
server=y/n??????????? VM 是否需要作為調(diào)試服務(wù)器執(zhí)行。
address=3999????????? 調(diào)試服務(wù)器的端口號(hào),客戶端用來(lái)連接服務(wù)器的端口號(hào)。
suspend=y/n?????????? 是否在調(diào)試客戶端建立連接之后啟動(dòng) VM 。
?
參考:http://calvinliu.iteye.com/blog/876009
?
轉(zhuǎn)載于:https://www.cnblogs.com/leodaxin/p/7678524.html
總結(jié)
以上是生活随笔為你收集整理的Java关于远程调试程序教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现在的位置就是对的啊,意思就是当鼠标放上
- 下一篇: 网页编写的注意点