我们在使用 IDEA DEBUG调试代码的时候,常常见到控制台会输出一句这样的话:「Connected to the target VM, address: '127.0.0.1:62981', transport: 'socket'」,所以即使代码不在本地运行,只要JVM打开调试模式,并且网络能够用过 socket 连接到JVM,使用 Debug 协议通过 Socket 通信就可以传递调试指令和调试信息。

IDEA配置启动环境(远程Debug服务器)

打开Intellij IDEA,在顶部靠右的地方选择”Edit Configurations”,进去之后点击左上角的+号,选择”Remote”,见下图,其中Name填写名称,可以随便起一个名字,host是你要远程调试代码的机器ip/hostname,port是调试监听端口,如果远端服务器已经开启了远程调试端口就填远程端口,如果没开,那么先选默认的5005端口,Use Module classpath 是选择远程运行的代码模块是哪个模块下的。

在Command line arguments for remote JVM,右侧选择JDK版本,这个是根据你远程服务器上运行的JDK版本选的,我这里选择 JDK5-8,就会给你一条命令,我这里得到的是:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

这条命令就是启动远程调试的命令,有好奇的同学,咱们解释一下什么意思:

  • jdwp是Java Debug Wire Protocol的缩写
  • transport:有两种形式,分别是socket和shared memory,需要跨机器,只能用socket;
  • server:JVM是否需要作为调试服务器执行
  • suspend:是否调试客户端建立连接之后启动虚拟机。如果是y,则需要等调试端机器上的debugger开启后,程序才会开始运行。否则,程序启动时候不会挂起,直接运行。
  • address:监听端口5005作为调试端口

服务端调试环境

Jar包方式启动的程序

以Jar包方式启动的程序,例如SpringBoot,可以在启动的时候添加这个命令,例如:

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 web.jar 

Tomcat(war包)项目

以Tomcat(war包)运行的项目需要修改Tomcat启动脚本,Linux 的是 catalina.sh,Windows 的是 catalina.bat,将这个命令添加进去:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

服务器端的JVM参数添加好,等到程序启动,你就可以开始运行你电脑上的DEBUG了。如果连接失败,记得检查网络防火墙是否放行了端口。

探究原理

核心是JPDA(Java Platform Debugger Architecture)框架。IBM有非常详细的介绍:

  • https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/
  • https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/
  • https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/
  • https://www.ibm.com/developerworks/cn/java/j-lo-jpda4/

关键摘抄如下:

  • JPDA是JVM的调试标准,任何JDK都必须实现。
  • 调试Java程序,本质是向JVM请求当前状态。这需要对JVM发送一定指令,设置一定回调。
  • JPDA的三个层次:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。它们之间的角色图:
  • JVMTI(Java Virtual Machine Tool Interface):通向JVM的native的接口,处于体系最底层。所有的调试功能都需要该接口提供。是debug和profiler的接口,是线程分析、监听和代码覆盖率检查的基础。会有个紧耦合的Agent来实现JVMTI。该Agent的加载时间是出于JVM初始化早期或者运行时加载(对应于上文中的suspend参数)。
  • JDWP(Java Debug Wire Protocol):交互的通讯协议。定义了交互中的命令、回应数据和错误代码。不包含传输层具体实现。主要分为握手和应答两个阶段。
  • JDI(Java Debug Interface):对JDWP进行解析,为JDWP提供队列、缓存等服务。分为数据模块,将虚拟机上的所有数据、状态映射为Java的数据对象;链接模块,调试器向虚拟机发起链接,以获得各种状态,分为主动和被动形式。事件请求和处理模块。
  • 由于JVM神一般的存在,使得Java的运行是先天可控的,因此其调试程序的开发,也远容易与C++。
  • 类似工具:Apache harmony

idea 导出war包_使用IDEA实现远程代码DEBUG调试教程详解相关推荐

  1. 封装成jar包_通用源码阅读指导mybatis源码详解:io包

    io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...

  2. miui怎么用第三方图标包_空气能热水器怎么用?控制面板的图标详解来了

    与普通热水器不同,空气能热水器有着独立的线控器显示屏,在使用过程中也有着不同于一般热水器的操作步骤,很多消费者使用过程中找不到说明书了,这么多图标不知道啥意思怎么办?一起来了解一下空气能热水器的线控器 ...

  3. protobuf2和3同时安装_在 Ubuntu 上安装 Protobuf 3 的教程详解

    什么时候需要安装 如果使用 protoc 命令,遇到 Protoc not found,表示未安装.或者,执行时出现错误:This parser only recognizes "proto ...

  4. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法详解

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  5. mac外接显示器 竖屏 黑苹果_苹果Mac外接显示器的显示模式及设置教程详解

    很多使用Macbook Air或Pro的Mac用户在连接外接显示器或投影的时候会有许多问题,脚本之家小编之前有写过关于Mac如何连接外接显示器的设置教程(点击前往),今天为大家带来的是Mac外接显示器 ...

  6. python学法用法 自动刷分_微信跳一跳python辅助工具刷分教程详解

    随着身边不少小伙伴都加入了微信跳一跳挑战,朋友圈最近都被刷爆了,为了刷分,很多小伙伴都开始开挂了,Github大神wangshub分享了一个针对该游戏的开源项目,那微信跳一跳python怎么刷分呢,下 ...

  7. eclipse如何导出WAR包

    eclipse如何导出WAR包 WAR包是用于将java项目部署在中间件上的,例如部署在Tomcat,Weblogic,WebSphere等等,那么如何使用eclipse导出WAR包呢? 工具/原料 ...

  8. SpringBoot webmvc项目导出war包并在外部tomcat运行产生的诸多问题以及解决方案

    背景: 有需求要将原来的Spring(3.2.6) + Springmvc + Hibernate项目重构为Springboot(1.5.2)项目 描述: 记录重构过程,以及期间遇到的种种问题和对应的 ...

  9. Eclipse export导出war包报错(Module name is invalid.)

    出于设计模式的作业过程中遇到的问题,老师要求代码文件最后大家要导出war包,前两次还好好的,今天突然报错 这里来说一下原因,也就是web项目可以导出war包,而java项目是不可以的,下面的操作其实本 ...

最新文章

  1. SharePoint 2013 调用WCF服务简单示例
  2. sonar:查询全部项目的bug和漏洞总数(只查询阻断/严重/主要级别)
  3. 关于Ex010的改进
  4. LUT Utility for FCPX(Luts调色文件加载工具)支持M1
  5. Timus 1018 树形DP
  6. D-Wave的量子计算机,到底能不能进行量子计算?
  7. Java Web应用小案例:实现登录功能
  8. 60-10-015-集成-(kylin On Druid)-Build CUBE的时候每一步都做了什么
  9. IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8
  10. Ubuntu16.0.4 桌面美化 终端透明
  11. Java改良贪吃蛇小游戏
  12. 健身的基本知识(1)
  13. 透过上网管理 看看上班时间员工都在干啥?
  14. 《Linux操作系统-系统移植》第12章 5G模组移植-第1节 中移物联5G移植(PPP拨号)
  15. org.csource.common.MyException: item “tracker_server“ in null not found异常已解决
  16. python 加权随机算法_python的random模块及加权随机算法的python实现方法
  17. 最小二乘法、加权最小二乘法——直线拟合
  18. Neo4j 完整版安装——neo4j-3.5.6
  19. GDI泄漏问题:QWindowsBackingStore::flush:GetDC failed
  20. 系统发生无故卡死原因分析

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 7140-22T危急重症护理学(本) 参考试题
  2. 【渝粤教育】国家开放大学2018年春季 0004-22T有机合成单元反应 参考试题
  3. 【渝粤题库】陕西师范大学164104 网络财务管理 作业(高起专)
  4. 【渝粤教育】广东开放大学 Python基础与应用 形成性考核 (21)
  5. bloomfilter的java实现,BloomFilter(布隆过滤器)原理及实战详解
  6. 红米ac2100breed看模块_骁龙865加持,红米K30S至尊纪念版11日再开售
  7. centos 远程安装java程序_centos7远程服务器中redis的安装与java连接
  8. linux文件系统dentry_Linux文件系统(四)---三大缓冲区之inode缓冲区 (内存inode映像 )...
  9. console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章
  10. 微信小程序错误 Cloud API isn‘t enabled, please call wx.cloud.init first 解决