java远程教学_Java关于远程调试程序教程

本节尝试一下Java远程调试的东西,记录一遍简单入门的东西。也就算是使用记录吧!

写一个简单程序打成jar丢到远程服务器运行,模拟远程Server在运行。就拿Java调用shell脚本提交作业程序为例分析。源码如下(如下程序就是一个简单示例代码,不要在乎代码规范):

importjava.io.InputStream;public classJavaShell {public static void main(String[] args) throwsException {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];intcode;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

c7a2f2ba3677be1b0e2a3d081a37e673.png

会发现程序阻塞,并等待debugger连接,此时我们可以使用eclipse进行远程调试:

6f2d98ebbf1b5edde2fb3236fd0cdbda.png

点击debugger即可进行连接,跟踪源码运行:

f288a9080148e0bb8e96490f822af89f.png

远程有输出,证明远程程序正在跟踪debugger执行:

549a233f84250e075e4956bf654c5b57.png

到此我们就完成了调试的过程。接下来试一下参数suspend=n的情况:

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

此时会发现远程程序并没有阻塞等待调试器debugger连接,而是程序正常执行:

2d42fc175824ecd77a03602be0c146b6.png

此时我们可以使用eclipse的远程debugger进行远程调试,但是需要注意:此时我们本地的断点只能打在远程还没有执行的代码处或者正在执行的代码位置,例如我们就可以在死循环中打断点(死循环是一直正在执行的代码):

0d85cb391de93aecf770c976bb2205d5.png

然后启动debugger之后:

7ff78552a9069ca81ee28d188fdb9472.png

停留在断点处。然后跟着断点位置继续我们的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值