本节尝试一下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关于远程调试程序教程的更多相关文章

  1. IntelliJ远程调试教程

    概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...

  2. Idea IntelliJ远程调试教程

    总结 第一步:修改startup.sh 在倒第二行加上export JPDA_ADDRESS=8787 最后一行在start前面加上"   jpda   " 第二步:配置Idea, ...

  3. Java网络编程简明教程

    Java网络编程简明教程 网络编程  计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算 ...

  4. 《Java程序设计与数据结构教程(第二版)》学习指导

    <Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...

  5. paip. java resin 远程 调试 java resin remote debug

    paip. java resin 远程 调试 java resin remote debug 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 ...

  6. Java SSH远程执行Shell脚本实现(转)

    前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...

  7. java下载远程文件到本地

    java下载远程文件到本地(转载:http://www.cnblogs.com/qqzy168/archive/2013/02/28/2936698.html)   /**       * 下载远程文 ...

  8. 在Eclipse中运行JAVA代码远程操作HBase的示例

    在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...

  9. Java Web 远程调试

    Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...

随机推荐

  1. Algolia使用教程 , 超详细傻子看都会

    框架描述 发现网上Algolia这块的资料较少,就花了点时间从官网上整理了下,总结了几项常用的功能用法. 现在比较有名的Algolia提供了云搜索的服务.具体办法是我们将数据库的信息以JSON的格式上 ...

  2. FFmpeg封装格式处理4-转封装例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  3. numpy使用指南

    numpy.array numpy.array是numpy中用于处理n阶数组的对象,是其类族中的重要基类. numpy.array可以表示任意维的数组,可以使用构造函数初始化: arr = numpy ...

  4. [java]我的数据在哪里?——数据的内存模型

    在编写程序时,我们也许会有这样一个问题,我们编写的程序中的数据运行时,会保存在哪里呢?简单直接的回答可能是——内存.这个回答在多数情况下可能都是对的,但事实上并不准确,我们都知道内存,即随机访问存储器 ...

  5. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  6. [android] 调用系统照相机和摄像机

    查看系统照相机源码,找到清单文件查看 查看意图过滤器,action是android.media.action.IMAGE_CAPTURE category是android.intent.categor ...

  7. PPT文件流转为图片,并压缩成ZIP文件输出到指定目录

    实现流程: 接收InputStream流->复制流->InputStream流转为PPT->PPT转为图片->所有图片压缩到一个压缩文件下 注意: 1.PPT文件分为2003和 ...

  8. Mybatis事务管理

    一.Mybatis事务 1.事务管理方式 Mybatis中的事务管理方式有两种: 1.JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理 2.MANAGED的事务管理机制,Mybatis没 ...

  9. Tomcat意外宕机分析

    之前在网上看过一篇文章,是讲Tomcat进程意外退出的,我看完感觉好奇,自己也测试了下,果然是有这种问题,所以自己也借此总结一下. 先简单说下测试过程,先创建一个web服务启动 test.sh,内容如 ...

  10. git 出现gnome-ssh-askpass:32737

    今天在git push origin master时,竟然出现了错误 (gnome-ssh-askpass:32737): Gtk-WARNING **: cannot open display: e ...