日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java关于远程调试程序教程

發布時間:2025/4/9 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java关于远程调试程序教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

本節嘗試一下Java遠程調試的東西,記錄一遍簡單入門的東西。也就算是使用記錄吧!

寫一個簡單程序打成jar丟到遠程服務器運行,模擬遠程Server在運行。就拿Java調用shell腳本提交作業程序為例分析。源碼如下(如下程序就是一個簡單示例代碼,不要在乎代碼規范):

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));}/*** 死循環阻止debugger沒有連接上之前程序退出(測試suspend參數功能) */System.out.println("shell腳本執行完畢,接下來開始進行定時打印任務!");int i = 0;while (true) {Thread.sleep(2000);System.out.println("這是第" + (++i) + "次循環!");}} catch (Exception e) {System.out.println("this is a excption !");} finally {}}}

打成Jar包提交到遠程服務器之后運行:

java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=y -jar JavaShell.jar

?

會發現程序阻塞,并等待debugger連接,此時我們可以使用eclipse進行遠程調試:

點擊debugger即可進行連接,跟蹤源碼運行:

?

?遠程有輸出,證明遠程程序正在跟蹤debugger執行:

?

?到此我們就完成了調試的過程。接下來試一下參數suspend=n的情況:

java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=n -jar JavaShell.jar

此時會發現遠程程序并沒有阻塞等待調試器debugger連接,而是程序正常執行:

?

?此時我們可以使用eclipse的遠程debugger進行遠程調試,但是需要注意:此時我們本地的斷點只能打在遠程還沒有執行的代碼處或者正在執行的代碼位置,例如我們就可以在死循環中打斷點(死循環是一直正在執行的代碼):

?

?然后啟動debugger之后:

停留在斷點處。然后跟著斷點位置繼續我們的debug工作。到此就應該可以知道suspend參數的作用了:

在JVM DEBUG參數中,有一個參數叫"suspend",它的取值有兩個,“y”或者“n”。

如果您剛開始就想調試的話,將參數設置為"suspend=y",這樣Eclipse會遠程連接Java應用程序。

如果你想先運行項目,然后連接Eclipse,那么可以將參數設置為"suspend=n",這樣的話,Java應用程序會正常運行,之后Eclipse會開始遠程連接。

?

更多參數細節:

-XDebug?????????????? 啟用調試。
-Xnoagent???????????? 禁用默認sun.tools.debug調試器。
-Djava.compiler=NONE? 禁止 JIT 編譯器的加載。
-Xrunjdwp???????????? 加載JDWP的JPDA參考執行實例。
transport???????????? 用于在調試程序和 VM 使用的進程之間通訊。
dt_socket???????????? 套接字傳輸。
dt_shmem????????????? 共享內存傳輸,僅限于 Windows。
server=y/n??????????? VM 是否需要作為調試服務器執行。
address=3999????????? 調試服務器的端口號,客戶端用來連接服務器的端口號。
suspend=y/n?????????? 是否在調試客戶端建立連接之后啟動 VM 。

?

參考:http://calvinliu.iteye.com/blog/876009

?

轉載于:https://www.cnblogs.com/leodaxin/p/7678524.html

總結

以上是生活随笔為你收集整理的Java关于远程调试程序教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。