转载地址:使用 Eclipse 远程调试 Java 应用程序

远程调试对应用程序开发十分有用。例如,为不能托管开发平台的低端机器开发程序,或在专用的机器上(比如服务不能中断的 Web 服务器)调试程序。其他情况包括:运行在内存小或 CUP 性能低的设备上的 Java 应用程序(比如移动设备),或者开发人员想要将应用程序和开发环境分开,等等。

先决条件

启动配置类型

启动配置 保存一组用于启动程序的属性。启动配置类型是一种可以在 Eclipse 平台上启动的独特程序。

如果您还没安装该程序,请下载 Eclipse V3.4(Ganymede)。在 Ganymede 中,套接字(socket)监听连接器被添加到 Remote Java Application 启动配置类型。Eclipse 最新的套接字监听连接器允许您打开 Java 调试器,它能够监听特定套接字上的连接。可以从命令行选项打开被调试的程序,并将其连接到调试器。在 Ganymede 发布之前,仅有一个连接套接字的连接器,被调试的程序所在的机器必须是一个与调试器相连的调试主机。由于受到内存和 CPU 不足的限制,要想让移动设备充当主机是不现实的。

为了进行远程调试,必须使用 Java Virtual Machine (JVM) V5.0 或更新版本,比如 IBM® J9 或 Sun Microsystem 的 Java SE Development Kit(JDK)。本文主要讨论远程调试,而不是每个 Eclipse 调试特性的细节。查看 参考资料 获得更多关于使用 Eclipse 进行调试的信息,并且可以找到上面提到的软件。

JPDA 简介

常用缩写词

  • JDI— Java 调试接口(Java Debug Interface)
  • JDT— Java 开发工具(Java Development Tools)
  • JDWP— Java 调试网络协议(Java Debug Wire Protocol)
  • JPDA— Java 平台调试器架构(Java Platform Debugger Architecture)
  • JVM— Java 虚拟机(Java Virtual Machine)
  • JVMDI— JVM 调试接口(JVM Debug Interface)
  • JVMTI— JVM 工具接口(JVM Tool Interface)
  • VM— 虚拟机(Virtual Machine)

Sun Microsystem 的 Java Platform Debugger Architecture (JPDA) 技术是一个多层架构,使您能够在各种环境中轻松调试 Java 应用程序。JPDA 由两个接口(分别是 JVM Tool Interface 和 JDI)、一个协议(Java Debug Wire Protocol)和两个用于合并它们的软件组件(后端和前端)组成。它的设计目的是让调试人员在任何环境中都可以进行调试。JPDA 不仅能够用于桌面系统,而且能够在嵌入式系统上很好地工作。

JVM Tool Interface (JVMTI) 规定必须为调试提供 VM(编辑注:从 Java V5 开始,将用 JVMTI 代替 Java V1.4 中的 JVMDI)。Java Debug Wire Protocol (JDWP) 描述调试信息的格式,以及在被调试的进程和调试器前端之间传输的请求,调试器前端实现 JDI,比如 Eclipse、Borland JBuilder 等。根据 Sun 的 JPDA 规范,被调试的程序常常称为 debuggee。JDI 是一个高级的接口,它定义用于远程调试的信息和请求。下面给出了调试器的架构。

清单 1. Java 平台调试器架构
             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      |\    |--------------|

因此,任何第三方工具和基于 JPDA 的 VM 应该都能协调工作。通过这个客户机-服务器架构,您可以从运行该平台的本地工作站调试 Java 程序,甚至还可以通过网络进行远程调试。

在讨论调试场景之前,我们先了解 JPDA 规范中的两个术语:连接器和传输。连接器是一个 JDI 抽象,用来在调试器应用程序和目标 VM 之间建立连接。传输定义应用程序如何进行访问,以及数据如何在前端和后端之间传输。连接器 “映射” 到可用的传输类型和连接模式。在 Sun 的 JPDA 参考实现中,为 Microsoft® Windows® 提供了两个传输机制:套接字传输和共享内存传输。可用的连接器:

  • 连接套接字连接器
  • 连接共享内存连接器
  • 监听套接字连接器
  • 监听共享内存连接器
  • 启动命令行连接器

在调试器应用程序和目标 VM 之间建立连接时,有一端将用作服务器并监听连接。随后,另一端将连接到监听器并建立一个连接。通过连接,调试器应用程序或目标 VM 都可以充当服务器。进程之间的通信可以在同一个机器或不同的机器上运行。

要远程调试 Java 程序,难点不是在调试器的前端,而是远程 Java 后端。不幸的是,Eclipse 帮助系统中为这方面提供的信息并不多。事实上,JDI 和 JVMTI 是分别由 Eclipse 和 Java 运行时环境实现的。我们仅需要考虑 JDMP,因为它包含与 JVMTI 和 JDI 进行通信所需的信息。JDWP 包含许多参数,用于为远程 Java 应用程序调用所需的程序。以下是本文用到的一些参数。

-Xdebug
启用调试特性。
-Xrunjdwp:<sub-options>
在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。

从 Java V5 开始,您可以使用 -agentlib:jdwp 选项,而不是 -Xdebug 和 -Xrunjdwp。但如果连接到 V5 以前的 VM,只能选择 -Xdebug 和 -Xrunjdwp。下面简单描述 -Xrunjdwp 子选项。

transport
这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。
server
如果值为  y,目标应用程序监听将要连接的调试器应用程序。否则,它将连接到特定地址上的调试器应用程序。
address
这是连接的传输地址。如果服务器为  n,将尝试连接到该地址上的调试器应用程序。否则,将在这个端口监听连接。
suspend
如果值为  y,目标 VM 将暂停,直到调试器应用程序进行连接。

要获得每个调试设置的详细解释,请参考 JPDA 文档(参见 参考资料)。

清单 2 是一个示例,显示如何在调试模式下启动 VM 并监听端口 8765 的套接字连接。

清单 2. 作为调试服务器的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765

清单 3 显示如何使用位于 8000 端口的主机 127.0.0.1 上的套接字连接运行中的调试器应用程序。

清单 3. 作为调试客户机的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000

回页首

Eclipse 中的远程调试特性

Eclipse 是一个图形化 Java 调试器前端。JDI 在 org.eclipse.jdt.debug 包中实现。本文不详细讨论 JDI 实现。参见 参考资料 获得关于 Eclipse JDT 和 Java JDI 技术的信息。

我们首先应该知道要使用哪个 Eclipse 连接器。要了解 Eclipse 提供的远程连接类型,您可以转到 Eclipse 菜单并选择 Run > Debug Configurations...,在 Remote Java Application 中添加一个启动配置,然后从下拉列表中选择连接器。在 Ganymede 中共有两个连接器:

  • Socket Attach
  • Socket Listen

对于监听套接字的连接器,Eclipse VM 将是与远程 Java 应用程序连接的主机。对于连接套接字的连接器,目标 VM 将作为主机。这两种连接器对应用程序调试没有影响,用户可以任意选择。但根据经验,需要使用速度更快、更强大的计算机作为 VM 调试主机,因为需要计算的资源很多。

在调试 Java 应用程序之前,需要确保已经为远程应用程序启用所有调试选项。如果选项信息不可用,您将收到一个错误信息,比如 “Debug information is not available” 或 “Unable to install breakpoint due to missing line number”。您可以通过更改 Eclipse 菜单上的 Window > Preferences > Java > Compiler 来修改设置。

图 1. Eclipse 中的调试选项

回页首

远程调试应用程序

现在,我们已经准备好远程调试应用程序。我们分步执行:

1. 使用简单类创建一个 Java 项目
我们为调试创建一个简单类。清单 4 给出了示例代码。
清单 4. 调试示例代码
package com.ibm.developerWorks.debugtest;public class test {public static void main(String[] args) {
System.out.println("This is a test.");
}
}

2. 设置一个断点
在代码中设置一个断点。在这个例子中,我们在  System.out.println("This is a test."); 这行中设置断点。
图 2. 在 Eclipse 中设置断点

3. 从本地调试应用程序
在调试应用程序之前,确保已经为项目启用图 1 中描述的调试选项。从本地调试应用程序是没有必要的,但是这可以确保是否所有调试信息都可用。右键单击 Java 项目,并选择  Debug As,然后选择  Java Application(参见图 3)。如果应用程序在断点处停止执行,则表明调试信息正确显示。这时,可以继续使用这些调试特性,比如显示调试堆栈、变量或断点管理等等。
图 3. 从本地调试应用程序

4. 导出 Java 项目
我们将使用这个应用程序作为调试目标。右键单击 Java 项目,选择  Export,然后选择  Java,最后选择  JAR file 或  Runnable JAR file 导出项目。将在指定的位置生成 JAR 文件。注意,如果 Java 源代码与目标应用程序不匹配,调试特性将不能正常工作。
5. 手动运行 Java 应用程序
打开控制台手动启动应用程序,确保正确配置了 Java 运行时环境。
清单 5. 调用 Java 应用程序的示例
java -jar test.jar

6. 远程调试应用程序
将 JAR 文件复制到远程计算机或同一台计算机上的适当位置,调用调试服务器,然后为它添加一个客户机。简单的 Java 应用程序就可以充当调试服务器或客户机。您可以在 Eclipse 中选择  Socket Attach 或  Socket Listen 连接类型,这取决于特定的配置。接下来的两个小节将学习如何将应用程序作为服务器或客户机运行。

作为调试服务器的目标 VM

下面这个示例远程调用 Java 应用程序作为调试服务器,并在端口 8000 监听套接字连接。目标 VM 将暂停,直到调试器连接。

清单 6. Eclipse 连接套接字模式下的 VM 调用示例
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar test.jar

使用远程启动配置启动 Eclipse,并指定远程应用程序的目标 VM 地址。为此,单击 Run > Debug Configurations,然后在 Eclipse 菜单中双击Remote Java Application。从最新创建的启动配置中为目标应用程序指定 IP 和端口。为了在同一台机器上运行远程应用程序,仅需将主机 IP 指定为 localhost 或 127.0.0.1。

图 4. 连接套接字连接的配置

选择 Allow termination of remote VM 选项终止在应用程序调试期间连接的 VM。

图 5. Eclipse 中的 Terminate 按钮

作为调试客户机的目标 VM

第二个示例使用一个简单的 Java 应用程序作为调试客户机,并且调试器前端作为调试服务器。Eclipse 使用套接字监听模式连接类型进行监听。必须先启动调试前端来监听特定的端口。图 6 给出一个用于设置监听的示例配置。

图 6. 监听套接字连接的配置

单击 Eclipse Debug 按钮,状态栏将显示消息 “waiting for vm to connect at port 8000...”。看到这个消息后,启动远程应用程序。清单 7 显示了如何将 Java 应用程序作为调试客户机并调用它,然后使用端口 8000 上的主机 127.0.0.1 的套接字将其连接到一个正在运行的调试器应用程序。

清单 7. Eclipse 监听套接字连接模式中的 VM 调用示例
    java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8000,suspend=y -jar test.jar

如果一切进行顺利,将会显示一个调试透视图帮助调试应用程序,并且远程 Java 应用程序将正常停止。这类似于步骤 3 中的本地调试(参见图 3)。在这里,您可以使用标准的调试特性,比如设置断点和值、单步执行等。

回页首

结束语

本文演示如何使用 Eclipse 内置的远程 Java 应用程序配置类型对应用程序执行远程调试。介绍了如何设置 Java 应用程序以调用远程调试,并帮助您理解 Eclipse 提供的连接器。最后,您还学习了如何将这些技术应用到项目中。

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
  • “Eclipse Ganymede 先睹为快” 概述了几个 Ganymede 项目,并提供相关的资源。
  • 要初步了解如何在 Eclipse 平台上进行调试,请参阅 “使用 Eclipse 平台进行调试 -- 使用 Eclipse 平台调试您的软件项目”。
  • 查看 Eclipse Debugging Resources 丰富您的 Eclipse 调试知识。
  • 更多地了解 Sun Microsystems 提供的 Java Platform Debugger Architecture。
  • 阅读 Java Platform Debugger Architecture 文档 更多地了解 JPDA。
  • 阅读 Java Debug Interface documentation 更多地了解 JDI。
  • JDT 项目 提供的工具插件可以实现 支持任何 Java 应用程序开发的 Java IDE,包括 Eclipse 插件。
  • 查看 “推荐 Eclipse 阅读清单”。
  • 在 developerWorks 上浏览所有的 Eclipse 内容。
  • 您是 Eclipse 新手吗?阅读 developerWorks 文章 “Eclipse 平台入门” 以了解它的起源和架构,以及如何用插件扩展 Eclipse。
  • 查看 IBM developerWorks 的 Eclipse 项目资源 提高您的 Eclipse 技巧。
  • 要收听针对软件开发人员的有趣访谈和讨论,请访问 developerWorks podcasts。
  • 随时关注 developerWorks 的 技术活动和网络广播。
  • 查看免费的 developerWorks On demand demos 体验并了解 IBM 和开放源码技术及产品功能。
  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他活动。
  • 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。

获得产品和技术

  • 从 Sun Microsystems 可以获得 Java 2 Standard Edition V5 或更新版本。
  • 在 IBM alphaWorks 上查看最新的 Eclipse 技术下载。
  • 从 Eclipse Foundation 下载 Eclipse Platform 和其他项目。
  • 下载 IBM 产品评估版,使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
  • 使用 IBM 试用软件 改进您的下一个开源开发项目,可以下载或从 DVD 获得。

讨论

  • Eclipse Platform 新闻组 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。
  • Eclipse 新闻组 为对使用和扩展 Eclipse 感兴趣的人员提供了许多参考资料。
  • 参与 developerWorks blogs 并加入 developerWorks 社区。
  • 我自己的实践:

java -Xdebug -Xrunjdwp:transport=dt_socket,address=172.18.2.40:80777,server=y,suspend=y -jar remote_debug.jar

[hadoop@bgsbtsp0032-lap remote_debug]$ cat remote_debug.sh
java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:80777,server=y,suspend=y -jar remote_debug.jar
[hadoop@bgsbtsp0032-lap remote_debug]$ sh remote_debug.sh
Listening for transport dt_socket at address: 15241

然后eclipse的访问:

点击debug就可以了

使用 Eclipse 远程调试 Java 应用程序相关推荐

  1. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  2. eclipse远程调试Java程序

    远程调试tomcat服务 配置tomcat在catalina.sh中添加如下 CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler ...

  3. 04-20.eri-test GKE(Google K8S Engine)上的Intellij远程调试Java应用程序

    Prepare the docker image 为了调试Java应用程序,我们需要向远程应用程序添加一些命令行参数. 在kubernetes部署有效负载中设置参数 DEBUG_OPTIONS=&qu ...

  4. idea远程调试Java应用程序

    在启动的程序中加入参数 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8087 例:java -jar -Xdebu ...

  5. eclipse 远程调试java_Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  6. intellij远程调试_IntelliJ中的远程调试Wildfly应用程序

    intellij远程调试 远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序. Java开箱即-agentlib:jdwp[=options]支持远程调试:目标应用程序必须使用-a ...

  7. IntelliJ中的远程调试Wildfly应用程序

    远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序. Java开箱即-agentlib:jdwp[=options]支持远程调试:目标应用程序必须使用-agentlib:jdwp[ ...

  8. IDEA远程部署调试Java应用程序

    IDEA远程部署调试Java应用程序 文章目录 IDEA远程部署调试Java应用程序 基本概述 准备工作 远程服务器准备 安装JDK 配置JAVA_HOME 项目准备 创建一个SpringBoot项目 ...

  9. 用Eclipse远程调试部署在Tomcat下的Web应用程序

    今天同事告诉了我一个用Eclipse远程调试部署在Tomcat下的Web应用程序的方法: 安装解压版本的Tomcat,因为现在好像Tomcat的Windows安装版目录下没有catalina.sh(. ...

最新文章

  1. 4句话让你明白什么是AI
  2. Apache设置多网站
  3. Python虚拟环境virtualenv的安装与使用详解(转)
  4. C#语法精髓之常用的操作符
  5. 《Python Cookbook 3rd》笔记(5.13):读写压缩文件
  6. ip变更会影响账号登陆吗_【教程】PUBG账号被盗导致封禁申诉解封教程
  7. JavaScript中的const
  8. 【坐在马桶上看算法】算法3:最常用的排序——快速排序
  9. Ant for Vue - input、select组件placeholder无法显示
  10. information_schema.profiling学习
  11. HTML5学完就去浪迹天涯的我...
  12. 18-HTML标签的居中
  13. .NET 开发从入门到精通
  14. 初学RabbitMQ(三),了解回调函数,并手动确认消息进行消费
  15. 笔记本电脑启动无法打开计算机,笔记本电脑开机没反应(详细教程教您怎么解决)...
  16. C++ Bayer图像格式,使用GDAL进行格式转换。
  17. php mtrand 范围,PHP mt_rand()函数
  18. 基于 Vue3.0 和 Ant Design Vue ,高颜值管理后台UI框架vue-vben-admin运行
  19. 系列之 H5+js 游戏 遍历象棋(待更新)
  20. no input file specified 三种解决办法

热门文章

  1. C++ P0003--孪生素数
  2. virtualbox安装windows7
  3. 一种能有效缓解环境噪声对音频质量干扰的方案
  4. echarts 仪表盘 label 如何随径向展示
  5. Qt Quik是什么?
  6. 记录一下,关于查考勤的脚本
  7. 大一学了C语言有什么用,写个拼图小游戏表白女神,快学起来吧
  8. 做副业赚钱,这几个热门自媒体平台收益超多
  9. C++代码编译失败: 错误:程序中有游离的‘\200’,‘\343’
  10. 多线程使用不当导致的 OOM