Java关于远程调试程序教程
本节尝试一下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关于远程调试程序教程的更多相关文章
- IntelliJ远程调试教程
概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的 ...
- Idea IntelliJ远程调试教程
总结 第一步:修改startup.sh 在倒第二行加上export JPDA_ADDRESS=8787 最后一行在start前面加上" jpda " 第二步:配置Idea, ...
- Java网络编程简明教程
Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算 ...
- 《Java程序设计与数据结构教程(第二版)》学习指导
<Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...
- paip. java resin 远程 调试 java resin remote debug
paip. java resin 远程 调试 java resin remote debug 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 ...
- Java SSH远程执行Shell脚本实现(转)
前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...
- java下载远程文件到本地
java下载远程文件到本地(转载:http://www.cnblogs.com/qqzy168/archive/2013/02/28/2936698.html) /** * 下载远程文 ...
- 在Eclipse中运行JAVA代码远程操作HBase的示例
在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...
- Java Web 远程调试
Java Web 远程 调试 Tomcat 下载压缩版服务器 环境:Tomcat.Eclipse,做远程调试我们并不需要其他特殊插件 1.配置Tomcat/bin/startup.bat 在前面增加代 ...
随机推荐
- js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行
js jq输入框中按回车触发提交事件,用户在页面输入后按回车(Enter键)进行 代码如下: <!DOCTYPE html> <html lang="en" xm ...
- PowerDesigner连接SqlServer数据库导出表结构
环境:PowerDesigner15 数据库sql server 2005 第一步.打开PowerDesigner ,建立一个物理数据模型,具体如下图: 第二步.新建成功之后,点击"Data ...
- angularjs学习第五天笔记(第二篇:表单验证升级篇)
您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...
- Spark的优势
首先了解一下Mapreduce 它最本质的两个过程就是Map和Reduce,Map的应用在于我们需要数据一对一的元素的映射转换,比如说进行截取,进行过滤,或者任何的转换操作,这些一对一的元素转换就称作 ...
- Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, ...
- Mybatis事务管理
一.Mybatis事务 1.事务管理方式 Mybatis中的事务管理方式有两种: 1.JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理 2.MANAGED的事务管理机制,Mybatis没 ...
- 微信服务号获取openid方法
public function tetst(){ if(!isset($_GET['code'])){ $APPID = $this->app_id; $ran = rand(1,100); / ...
- 使用Topshelf创建自宿主的Windows服务程序
在传统的Windows服务开发过程中,需要添加一个服务安装程序,里面写安装,启动和停止服务等逻辑.现在,使用TopSelf可以简化这个过程.具体请看官网说明: http://docs.topshelf ...
- mysql5.7 安装和多源复制实践
MySQL 5.7发布后,在复制方面有了很大的改进和提升.比如开始支持多源复制(multi-source)以及真正的支持多线程复制了.多源复制可以使用基于二进制日子的复制或者基于事务的复制.下面我们说 ...
- sass @function,@for,@mixin 的应用
项目前提: 不同的汽车显示不同的图片,一共9种汽车:每种汽车显示不同状态的图片,一共6种状态,所以一共会有54张图片 后台接口返回汽车种类分别为:1-9,汽车状态分别为:0-5 项目需求: 根据后台返 ...