微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Intellij IDEA 远程调试技巧

      远程调试,特别是当你在本地开发的时候,需要调试服务器上的程序时,远程调试就显的非常有用。知其然知其所以然,首先,为什么可以进行远程调试,背后的原理是什么?

      Java程序执行过程可以分为一下几个步骤:Java文件--->编译生成文件(class文件)-->JVM加载类文件-->JVM运行类字节码文件-->JVM翻译成各个机器认识的不同的机器码。

      远程调试原理

    我们知道Java程序是运行在Java虚拟机(JVM)上的,具有良好的跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信,另外需要注意:被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,则会造成断点无法进入的问题。

这个架构实质还是JVM,只要确保本地的Java源代码与目标应用程序一致,本地的Java的源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式下,本地只需要有源码,本地的Java的应用程序根本不用启动。

传输方式,认为Socket ;

套接字:MACOS,Linux的系统使用此种传输方式;

共享内存:WINDOWS系统使用此种传输方式。

调试模式,认为Attach ;

Attach :此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;

Socket :此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。

准备启动脚本

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 remote-debug-1.0-SNAPSHOT.jar
  1. 使用 java -jar 的方式启动程序,并且添加了一串特殊的参数,这是我们能够开启远程 debug 的关键,以 - 开头的参数是 jvm 的标准启动参数,关于 jvm 启动参数相关的知识可以先去其他博客了解。

  2. -agentlib:libname[=options], 用于装载本地 lib 包。在这条指令中便是加载了 jdwp(Java Debug Wire Protocol) 这个用于远程调试 java 的扩展包。而 transport=dt_socket,server=y,suspend=n,address=5005 这些便是 jdwp 装载时的定制参数,详细的参数作用可以搜索 jdwp 进行了解。我们需要关心的只有 address=5005这个参数选项,本地调试程序使用 5005端口与其通信,从而远程调试。

idea远程调试的配置

1.进入你的项目,找到Run这个菜单项,鼠标左键单击,弹出二级菜单,找到Edit Configurations并选择

2.以上操作会出现如下界面,如图所示,其中该界面的左侧为我们远程调试配置界面功能项,如果没有我们看接下里的操作,

在此界面,找到一个+号,点击弹出一个选项框,选择remote选项即可

如此,我们配置远程调试参数的界面如下所示,其中需要注意的是,远程调试的前提条件是需要在远程调试服务器端开启一个可以提供远程调试的端口

服务器端开启调试模式,增加JVM启动参数,以支持远程调试。

IDEA 配置

  1. 与脚本中的指令完全一致

  2. 远程 jar 包运行的 host,由于我的 jar 运行在本地,所以使用的是 localhost,一般线上环境自然是修改为线上的地址

  3. 与远程 jar 包进行交互的端口号,idea 会根据指令自动帮我们输入

  4. 选择与远程 jar 包一致的本地代码

请务必保证远程 jar 包的代码与本地代码一致!!!

先执行脚本让远程的 jar 包跑起来,再在 IDEA 中运行 remote模式中设置的项目。

验证

程序上打上断点,运行模式选远程,点击运行。调用服务器端运行的系统程序,系统自动进入断点

前提是本机有项目的源代码 ,在需要的地方打个断点,然后访问一个远程的url试试,断点就会停下来,便可以开始远程调试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐