Java关于远程调试程序教程(以Eclipse为例)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java关于远程调试程序教程(以Eclipse为例)
本节尝试⼀下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 piler=NONE -Xrunjdwp:transport=dt_socket,address=9999,server=y,suspend=y -jar JavaShell.jar
会发现程序阻塞,并等待debugger连接,此时我们可以使⽤eclipse进⾏远程调试:
点击debugger即可进⾏连接,跟踪源码运⾏:
远程有输出,证明远程程序正在跟踪debugger执⾏:
到此我们就完成了调试的过程。

接下来试⼀下参数suspend=n的情况:
复制代码代码如下:
java -Xdebug -Xnoagent piler=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调试器。

piler=NONE 禁⽌ JIT 编译器的加载。

-Xrunjdwp 加载JDWP的JPDA参考执⾏实例。

transport ⽤于在调试程序和 VM 使⽤的进程之间通讯。

dt_socket 套接字传输。

dt_shmem 共享内存传输,仅限于 Windows。

server=y/n VM 是否需要作为调试服务器执⾏。

address=3999 调试服务器的端⼝号,客户端⽤来连接服务器的端⼝号。

suspend=y/n 是否在调试客户端建⽴连接之后启动 VM 。

Eclipse debug快捷键:
F5 Step into
F6 Step over
F7 Step out
F8 continue to the next breakpoint
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

相关文档
最新文档