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

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

(0)

相关推荐

  • Python中使用PDB库调试程序

    Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的. 用pdb调试有多种方式可选: 1. 命令行启动目标程序,加上-m参数,这样调用myscript.py的话断点就是程序的执行第一行之前 复制代码 代码如下: python -m pdb myscript.py 2. 在Python交互环境中启用调试 复制代码 代码如下: >>> import pdb >>> import mymodule >>

  • Android开发笔记之:一分钟学会使用Logcat调试程序的详解

    这是个很简单的问题,但每次隔一段时间后使用起来总是会出点乱子.这里记录下Logcat的步骤:1,在Activity里申明tag变量(名字其实是随便的,如下:private static final String tag="yan";2,需要使用logcat输出信息时:Log.i(tag, "屏幕宽度:"+display.getWidth()+" 屏幕高度:"+display.getHeight());3, 双击Logcat,点击"+&q

  • C#中利用断点操作调试程序的步骤详解

    Visual Studio调试器调试 我们大家都知道,当代码不能正常运行时,可以通过调试定位错误.常用的程序调试操作包括设置断点.开始.中断和停止程序的执行.单步执行程序以及使程序运行到指定的位置.下面将对这几种常用的程序调试操作进行详细地介绍.话不多说了,来一起看看详细的介绍吧. 1.断点操作 断点通知调试器,使应用程序在某点上(暂停执行)或某情况发生时中断.发生中断时,称程序和调试器处于中断模式.进入中断模式并不会终止或结束程序的执行,所有元素(如函数.变量和对象)都保留在内存中.执行可以在

  • 用bat实现删除系统脚本调试程序

    删除一些危险的对象,从根本上解决问题.这些对象对普通用户是没什么用的. 1)禁用WSHShell对象,阻止运行程序. 删除或更名系统文件夹中的wshom.ocx 或删除注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B} 2)禁用FileSystem对象,阻止读写文件. 删除或更名系统文件夹中的scrrun.dll 或删除注册表项: HKEY_LOCAL_MACHINE\SOF

  • ubuntu用wifi连接android调试程序的步骤

    注:如果没有 root 权限也是可以试试,一般情况下,都需要 root 权限,才能连接成功. 1.需要确保你的开发 PC 和 Android 手机都连上了 wifi 并处于同一网段下:2.开启 usb 调试,且用 usb 将 Android 设备连接到开发 PC 上:3.进入到你的 Android SDK 的 platform-tools 目录下,执行如下命令来重启 Android 设备中的 adbd 后台程序重新侦听 TCP 的指定端口:$./adb tcpip 5555注:5555 是默认端

  • IOS 使用NSAssert()和NSParameterAssert调试程序

    IOS 使用NSAssert()和NSParameterAssert调试程序 NSAssert: NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异常描述.NSAssert()是这样定义的: #define NSAssert(condition, desc) condition是条件表达式,值为YES或NO:desc为异常描述,通常为NSStrin

  • asp下调试程序的debug类

    ASP中最头疼的就是调试程序的时候不方便,我想可能很多朋友都会用这样的方法"response.write ",然后输出相关的语句来看看是否正确.前几天写了一个千行的页面,里面大概有七八个SUB/FUNCTION,调试的时候用了有三十几个 response.write ,天,调试完后把这三十个一个个删除,累! 今天看到一个ASP中的Debug类(VBS),试用了一下,绝! 使用方法很简单: test.asp <!--#INCLUDE FILE="debuggingCons

  • Linux应用程序使用写文件调试程序的方法

    Linux,一切皆文件,那么在Android系统本身,也是Linux+java罢了,也是在Linux的运行环境下. 通常,我们在调试程序的都会使用printf. 在Android中,我们会去使用logcat,现在,给大家介绍一种常用的调试方法,debug写文件调试法. 在Android系统中,调试一个C应用程序可谓是极其不方便,为了保存log的完整性,于是,写文件调试法可以发挥重大的作用,下面给出一个例子: #include <stdio.h> FILE * wirte_debug_file=

  • asp:debug类调试程序

    ASP中最头疼的就是调试程序的时候不方便,我想可能很多朋友都会用这样的方法"response.write ",然后输出相关的语句来看看是否正确.前几天写了一个千行的页面,里面大概有七八个SUB/FUNCTION,调试的时候用了有三十几个 response.write ,天,调试完后把这三十个一个个删除,累! 今天看到一个ASP中的Debug类(VBS),试用了一下,绝! 使用方法很简单: test.asp <!--#INCLUDE FILE="debuggingCons

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

    本节尝试一下Java远程调试的东西,记录一遍简单入门的东西.也就算是使用记录吧! 写一个简单程序打成jar丢到远程服务器运行,模拟远程Server在运行.就拿Java调用shell脚本提交作业程序为例分析.源码如下(如下程序就是一个简单示例代码,不要在乎代码规范): import java.io.InputStream; public class JavaShell { public static void main(String[] args) throws Exception { try {

  • java程序员必会的远程debug教程

    目录 正文 启动添加参数 配置idea 点击 editConfigurations... 点击左上角的+号,选择Remote Jvm Debug 填写地址和端口号 启动debug模式 测试 正文 现在都是拆分的比较细的微服务了,当系统运行在测试环境出现问题的时候,就需要按照日志来分析出什么问题了.有的能看出来,要是年久失修的老项目,那么说不定连log都没有.纯纯的看源码找问题,效率就很低了. 其实这个时候还可以远程debug,来更精确的定位问题.效率也是高高滴. 这个之前在工作中其实一直在使用,

  • win10和win7下java开发环境配置教程

    本文为大家分享了java开发环境配置教程,供大家参考,具体内容如下 配置环境变量 win 7配置(win 10配置在下面): 1.安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置": 2.选择"高级"选项卡,点击"环境变量": 然后就会出现如下图所示的画面: 在"系统变量"中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击&qu

  • IDEA快速搭建Java开发环境的教程图解

    作为IntelliJ IDEA mac新手,IDEA如何快速搭建Java开发环境呢? 今天小编就给大家带来了IntelliJ IDEA mac使用教程,想知道IDEA如何快速搭建Java开发环境?那就一起来看看吧! 全局JDK(默认配置) 具体步骤:顶部工具栏 File ->Other Settins -> Default Project Structure -> SDKs -> JDK 示例: 根据下图步骤设置JDK目录,最后点击OK保存. 注:SDKs全称是Software D

  • java进行远程部署与调试及原理详解

    这篇文章主要介绍了java进行远程部署与调试及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系,本地的Java文件在远程JVM建立联系和通信.此篇是Intellij IDEA远程调试的教程汇总和原理解释,知其然而又知其所以然.

  • VScode 打造完美java开发环境最新教程

    vscode Java 开发环境配置 博客地址 VsCode官网教程 系统需安装jdk1.8,配置好环境变量JAVA_HOME 打开vscode,安装java相关插件 安装Java Extension Pack这个集成了一下插件: Language Support for Java™ by Red Hat Debugger for Java Java Test Runner Maven for Java Java Dependency Viewer 以上插件安装完成,就可以开始java开发了 个

  • Intellij IDEA远程debug教程实战和要点总结(推荐)

    远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系,本地的Java文件在远程JVM建立联系和通信.此篇是Intellij IDEA远程调试的教程汇总和原理解释,知其然而又知其所以然. 本机Intellij IDEA远程调试配置 1,打开Inteliij IDEA,顶部菜单栏选择Run-> Edit Configurations,进入下

  • Java之jpa入门教程讲解

    JPA快速入门介绍 一:什么是JPA JPA的英文全称是Java PersistenceAPI, 目的是给Java开发者提供对象关系映射工具用于在 Java应用程序开发中来管理关系数据(RDBMS).JavaPersistence 包含下面三个部分: Java持久化API JPA查询语言 对象关系映射元数据 二:JPA有哪些框架提供了的实现 当前JPA提供厂商有Hibernate, Apache, Eclipse Link等,Google云计算平台 AppEngine也使 用了JPA作为持久层.

  • java中TestNG使用教程详解

    目录 一.TestNG介绍 二.TestNG安装(基于eclipse+maven) 三.TestNG基本使用和运行 1.直接运行: 2.xml方式运行 四.注解说明 五.TestNG断言 六.TestNG预期异常测试 七.TestNG忽略测试 八.TestNG超时测试 九.分组测试 十.分suite测试 十一.依赖测试 十二.参数化测试 十三.XML配置文件说明 1.suite标签 2.test标签 3.group标签 4.其他 十四.TestNG报告 一.TestNG介绍 TestNG是Jav

  • Ubuntu下MySQL安装及配置远程登录教程

    本文实例为大家分享了MySQL安装及配置远程登录教程,供大家参考,具体内容如下 一.安装MySQL 一.安装MySQL 1. sudo apt-get install mysql-server 2. sudo apt-get install mysql-client 3. sudo apt-get install libmysqlclient-dev 注意:安装过程中会提示设置密码和确认密码.记住密码. 安装完成之后可以使用如下命令来检查是否安装成功: root@root:/# ps aux|g

随机推荐