使用Eclipse远程调试及原理

今天定位Linux Server端的Java应用程序的问题,使用了 Eclipse 远程调试 Java 应用程序,这恐怕是定位Server端最常见也是最根本的方法,居然至少有两位有好几年开发经验的同事都不知道这个方法,我也感觉十分诧异。

本文在介绍使用Eclipse远程调试Java应用程序之外,着重解析了远程调试的原理。

JVM原理

众所周知,Java由于引入了虚拟机JVM,拥有了很好的跨平台和安全性,.java文件由Javac编译成.class文件也叫字节码文件,字节码文件由JVM执行,并由翻译器翻译成各个机器认识的不同的机器码(0101010010101),这样,JVM支持了Java 的跨平台性。

远程调试的应用场景

远程调试很有用,特别是当你的开发环境在Window,又在远端Linux Server或者移动平台上运行Java应用程序,Java提供了一系列的接口和协议让本地Java文件于远端JVM建立联系和通信。

调试器架构

根据 Sun 的 JPDA 规范,用于调试的程序常常被称为debugger, 而被调试的程序称为 debuggee,下面图1给出了调试器的架构。

             Components                      Debugger Interfaces

                 /    |--------------|
                /     |     VM       |
 debuggee -----(      |--------------|  <---- JVMTI - Java VM Tool Interface
                \     |   back-end   |
                 \    |--------------|
                 /           |
 comm channel --(            |  <------------ JDWP - Java Debug Wire Protocol
                 \           |
                 /    |--------------|
                /     |  front-end   |
 debugger -----(      |--------------|  <---- JDI - Java Debug Interface
                \     |      UI      |
                 \    |--------------|

图1. Java 调试器架构

这个架构从下往上读,大致可以解读为: 用于调试的程序使用UI,通过Protocol,调用远端JVM进程。

其实质还是JVM,因此,只要确保本地Java 源代码与目标应用程序一致,本地的Java源码就可以用socket连接到远端的JVM,进而执行调试。因此在这种Socket Attach模式(下文介绍)下,本地只需要有源码,Java应用程序根本不用启动。

两种方式进行远程调试

图2描述了远程调试的两种方式 - 上面的表示Eclipse配置为Socket Listen方式,下面的是Socket Attach方式

图2. 远程调试的两种方式

使用Eclipse远程调试Java

Eclipse配置: 菜单(Eclipse): Run-->Debug Configurations 打开调试配置面板,如图配置

注意,如果 Java 源代码与目标应用程序不匹配,调试特性将不能正常工作。

选择 Allow termination of remote VM 选项 可以在应用程序调试期间终止连接,如下图:

这样远程调试连接上之后,就可以像在本地调试Java程序一样来调试远端的Java应用程序。

结束语

将以上Socket Attach远程debug 方法多用于实际项目中,使用过程中多思考一下其中的原理,这样很多次实践之后便会对此功能有自己的理解了 :)

时间: 2024-10-23 21:23:55

使用Eclipse远程调试及原理的相关文章

Eclipse远程调试Tomcat

最近,一直在研究Tomcat的工作内幕,主要的方法就是参考<How Tomcat Works> 这本书和Tomcat 5.5.26的源代码. Tomcat的代码结构还是比较清晰的,注释也比较全.但是代码毕竟是静态的,难以彻底弄清类与类之间的协作关系,以及运行时对象的交互关系. 如果能对Tomcat的启动.处理请求和停止的过程进行断点调试,看清Tomcat的每一步行踪,那么就能解决上面的问题了. 于是,又一个问题出来了:如何使用Eclipse远程调试Tomcat ? 上网查了一些资料,相关的文章

Eclipse远程调试应用程序

第一步,在应用程序的配置文件run.xml中加入下面的配置项,启动应用程序: <target name="run" depends="checkBuilderFailedLogExist">  <!--ant antfile="../DBSchema/main.xml" target="run-all" /-->   <java classname="com.raisecom.nms.c

Linux下使用Eclipse 远程调试

1 开启端口 修改/apache-tomcat-7.0.40/bin/catalina.sh 在合适的位置(请自行判断,只要有JAVA_OPTS的设定前后即可)插入下面的设定:UI_DEBUG="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8899"CATALINA_OPTS="$CATALINA_OPTS $UI

Eclipse远程调试(远程服务器端监听)

前提:远程服务器上运行的WEB项目class对应的源码与本地项目中必须保持一致,也就是远程tomcat部署的项目就是本机项目打包过去的,而本机项目没有发生变动. 远程服务器端 服务器端配置eclipse调试器监听端口,有两种方式,任选其一 第一种方式: 环境变量 export JPDA_ADDRESS=9999 启动tomcat 使用sh catalina.sh jpda start启动 注意:不要用startup.sh 通过这条命令启动tomcat,会监听JPDA_ADDRESS设置的端口,等

eclipse远程调试Hadoop

环境需求: 系统:window 10 eclipse版本:Mars Hadoop版本:2.6.0 资源需求:解压后的Hadoop-2.6.0,原压缩包自行下载:下载地址 丑话前头说: 以下的操作中,eclipse的启动均需要右键“管理员运行”! 在创建MapReduce的Project那块需要配置log4j(级别是debug),否则打印不出一些调试的信息,从而不好找出错的原因.配置这个log4j很简单,大家可以在网上搜索一下,应该可以找得到相关的配置. 1)首先需要利用ant编译自己的Hadoo

eclipse 远程调试hadoop代码

zxxJPDA 简介 Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构,使您能够在各种环境中轻松调试 Java 应用程序.JPDA 由两个接口(分别是 JVM Tool Interface 和 JDI).一个协议(Java Debug Wire Protocol)和两个用于合并它们的软件组件(后端和前端)组成.它的设计目的是让调试人员在任何环境中都可以进行调试. 更详细的介绍,您可以参考使用 Eclips

CloudStack 4.3 源码部署+eclipse远程调试

CloudStack 4.3 源码部署 系统环境 vmware workstation 下创建一个虚拟机 装有Centos6.5  64bit 安装软件 1.yum install git mysql mysql-server mkisofs gcc python MySQL-python openssh-clients wget 2.下载maven 并解压到 /root/maven 目录 3.下载ant 并解压到 /root/ant 目录 4.下载sun jdk 7 并解压到 /root/jd

tomcat启动debug模式,使用eclipse远程调试

生产环境和测试环境可以将tomcat启动设置为debug模式,开始远程监听端口,然后在本地的eclipse中对项目远程调试,即可对指定的服务器中的tomcat进行远程调试. 一.打开tomcat/bin/Catalina.bat文件,在下面位置输入:SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=800

使用Eclipse远程调试Tomcat

有些时候,调试不得不用外网,比如说做支付宝的支付接口,服务器后台通 知就不得不用外网的ip.无奈,只能扔到服务器远程调试了. 网上讲关于远程调试tomcat的倒是蛮多,基本都是将改啥catalina.sh,startup.sh的,操作还是复杂点.下面这篇就只针对于 linux下的tomcat远程调试,不用改啥文件,简单而又没啥副作用.本人在tomcat6 的情况下远程调试成功. 相信很 多J2EE的开发者都是在Windows上面开发程序,然后把程序上传到Linux下运行的吧.可是有时候在自己机器