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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM