使用 JDWP 进行远程调试

简介: 对于调试Java程序来说,Java Debug Wire Protocol (JDWP, Java调试线协议)是不可多得的好东西。使用JDWP调试应用程序的步骤如下:1. 打开命令行,并将 jdk 安装路径下的 bin 目录添加到 PATH 环境变量。

对于调试Java程序来说,Java Debug Wire Protocol (JDWP, Java调试线协议)是不可多得的好东西。

使用JDWP调试应用程序的步骤如下:

1. 打开命令行,并将 jdk 安装路径下的 bin 目录添加到 PATH 环境变量。

2. 通过以下命令来启动想要调试的程序(本例中假设为Test):

  • 在Windows上:

    java -Xdebug -Xrunjdwp:transport=dt_shmem,address=debug,server=y,suspend=y Test
    
  • 在Oracle Solaris 和/或 Linux操作系统上:

    java -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=y Test
    

通过这些启动参数, Test 类将运行在调试模式下, 并等待调试器连接到JVM的调试地址: 在Windows上是 debug, 在Oracle Solaris 或 Linux操作系统上是 8888端口 。

3. 新开一个命令行窗口, 并使用以下命令来启动 “jdb” 并将它连接到正在运行的调试服务器:

  • 在Windows上:

    jdb -attach 'debug'
    
  • 在Oracle Solaris和Linux操作系统上:

    jdb -attach 8888
    

当 jdb初始化并连接到 Test 之后, 就可以进行 Java代码级(Java-level)的调试。

4. 设置断点,并运行应用程序。例如, 在 Testmain 方法开始位置设置断点, 可以执行以下命令:

stop in Test.main run

jdb 工具执行到断点时, 就可以探查程序的当前上下文,以判断程序是否按预期正常运行。

5。(可选) 要进行 native-level 的调试, 请在运行JDWP的Java进程上附加 native debuggers 。

在 Oracle Solaris上, 可以使用 dbx 工具, 在 Linux 上, 可以使用 gdb 工具。

在Windows上, 则可以使用 Visual Studio, 进行 native-level 调试的步骤如下:

  1. 打开 Visual Studio。
  2. 点击 Debug 菜单, 选择 Attach to Process。然后选择运行JDWP的Java进程。
  3. 点击 Project 菜单, 选择 Settings 项,然后打开 Debug 标签(tab). 在 Category 下拉列表中, 选择 Additional DLLs, 并添加您想要调试的 native DLL (例如, Test.dll)。
  4. 打开 Test.dll 的源文件(一个或多个),并设置断点。
  5. jdb 窗口输入 cont, 则进程将在 Visual Studio 中设置的断点处暂停。

示例

在 Linux 下启动Tomcat的脚本中,可以使用:

export JAVA_OPTS="-Xms1024m -Xmx1024m
-verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails 
-Xloggc:$CATALINA_BASE/logs/gc.log -server
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=12346"

相关参数的含义可以参考: http://calvinliu.iteye.com/blog/876009

idea调试相关配图:

1. 打开idea窗口,确保本地有相关的代码。

2. 进入配置:

配置编辑

3. 添加 Remote:

添加 Remote

4. 设置 ip 与 端口号:

设置 ip 与 端口号

5. 完成配置:

完成配置

此时, 点击debug的那个按钮即可启动远程调试。

当然,记得加断点或者条件断点。

关于 Idea 如何进行远程调试,请参考: http://www.cnphp6.com/archives/33956

原文链接: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/introclientissues005.html

目录
相关文章
|
Arthas 监控 NoSQL
web服务性能监控方案
web服务性能监控方案
|
9月前
|
人工智能 分布式计算 数据中心
毅硕HPC | NVIDIA DGX Spark 万字硬核评测:将AI超级工厂带上桌面
作为全球首款基于NVIDIA Grace Blackwell架构的个人AI超级计算机,DGX Spark将工业级的AI性能带入您的私人工作空间,让您从原型设计到大规模部署,实现真正的无缝衔接。
1790 0
毅硕HPC | NVIDIA DGX Spark 万字硬核评测:将AI超级工厂带上桌面
|
Ubuntu Linux Docker
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门
27660 4
|
网络协议 Linux Docker
在Linux中,如何指定dns服务器,来解析某个域名?
在Linux中,如何指定dns服务器,来解析某个域名?
|
人工智能 安全 网络安全
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
699 4
Burp Suite Professional 2025.5 for Windows x64 - 领先的 Web 渗透测试软件
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
731 11
|
机器学习/深度学习 算法 Python
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
【Python】已解决:ModuleNotFoundError: No module named ‘sklearn‘
10842 10
|
机器学习/深度学习 异构计算
【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络
【保姆级教程|YOLOv8改进】【5】精度与速度双提升,使用FasterNet替换主干网络
|
安全 网络协议 Linux
【Windows】已解决:修改本地host文件异常的正确解决方法
【Windows】已解决:修改本地host文件异常的正确解决方法
3707 0
|
资源调度 JavaScript 前端开发
VUE开发环境搭建
本文旨在为VUE前端入门人员提供环境搭建参考
8195 1