码迷,mamicode.com
首页 > 编程语言 > 详细

Java关于远程调试程序教程

时间:2017-10-16 21:56:31      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:jpda   run   put   for   编译器   import   runtime   xdebug   exce   

 

本节尝试一下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

 

Java关于远程调试程序教程

标签:jpda   run   put   for   编译器   import   runtime   xdebug   exce   

原文地址:http://www.cnblogs.com/leodaxin/p/7678524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!