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

 更新时间:2018年06月28日 11:04:19   作者:leodaxin  
这篇文章主要介绍了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 -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 。

Eclipse debug快捷键:

F5 Step into
F6 Step over
F7 Step out
F8 continue to the next breakpoint

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • protobuf与json转换小结

    protobuf与json转换小结

    protobuf对象不能直接使用jsonlib去转,因为protobuf生成的对象的get方法返回的类型有byte[],而只有String类型可以作为json的key,protobuf提供方法进行转换
    2017-07-07
  • Java的ConcurrentHashMap原理深入分析

    Java的ConcurrentHashMap原理深入分析

    这篇文章主要介绍了Java的ConcurrentHashMap原理深入分析,集合是编程中最常用的数据结构,而谈到并发,几乎总是离不开集合这类高级数据结构的支持,需要的朋友可以参考下
    2023-07-07
  • 关于RestTemplate中的Get请求

    关于RestTemplate中的Get请求

    这篇文章主要介绍了关于RestTemplate中的Get请求,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection 上传和下载文件的方法

    这篇文章主要介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,非常具有实用价值,需要的朋友可以参考下
    2017-09-09
  • 基于java开发之系统托盘的应用

    基于java开发之系统托盘的应用

    本篇文章介绍了,基于java开发之系统托盘的应用。需要的朋友参考下
    2013-05-05
  • 利用Java计算某个日期是星期几

    利用Java计算某个日期是星期几

    不知道大家有没有遇到过同样的问题,谁谁的生日又要到了,看看是星期几?每年都要遇到好几次,所以想索性利用Java写个小工具,一次查询某具体日期在n年中分别是星期几。这样不就方便了吗?本文里给出了详细的示例代码,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • Eclipse查看开发包jar里源代码的方法

    Eclipse查看开发包jar里源代码的方法

    这篇文章主要介绍了Eclipse查看开发包jar里源代码的方法的相关资料,需要的朋友可以参考下
    2017-07-07
  • Spring Cloud Data Flow初体验以Local模式运行

    Spring Cloud Data Flow初体验以Local模式运行

    这篇文章主要介绍了Spring Cloud Data Flow初体验以Local模式运行,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java 中实现随机无重复数字的方法

    Java 中实现随机无重复数字的方法

    为了更好地理解这个题意,我们先来看下具体内容:生成一个1-100 的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元素不能重复
    2013-03-03
  • MyBatis Generator介绍及使用方法

    MyBatis Generator介绍及使用方法

    MyBatis Generator 是一款针对 MyBatis 或 iBATIS 设计的代码生成器,由 MyBatis 官方提供,这篇文章主要介绍了MyBatis Generator介绍及使用方法,需要的朋友可以参考下
    2023-06-06

最新评论