首页 > 其他分享 >使用IDEA远程Debug调试(详细)

使用IDEA远程Debug调试(详细)

时间:2023-05-10 09:47:10浏览次数:38  
标签:端口 IDEA 调试 JVM Debug 远程 服务端 客户端

一:前言

  记得刚工作那会写代码,遇到线上奇怪问题时,就会在可能出现问题的地方大量打log,然后重新打包部署,再对打印的log进行分析;往往这一套流程下来,基本上1个小时左右的时间就这么白白浪费,但要log打的不合理,那么就嘿嘿了,我们要不停的修改代码打log、不停的打包部署。这是何等的浪费时间呀。

1:什么是远程调试

  远程调试(对应IDEA功能:Remote JVM Debug)。远程调试使开发人员能够直接诊断服务器或其它线上进程上的问题,它提供了跟踪线上运行时错误并确定性能瓶颈和问题根源的方法,让你能够像在本地调试一样 Debug 远程服务器。

2:IDEA远程调试原理及说明

Ⅰ:Java的远程调试机制:
    Java虚拟机提供了远程调试机制,只需要在服务端启动时通过添加JVM参数开启调试服务端口,并且在客户端使用调试器连接到这个服务
    端口,就可以实现对远程JVM上程序的调试。
Ⅱ:IntelliJ IDEA远程调试的实现方式:
    IDEA利用Java的远程调试机制,在目标JVM上启用调试服务端口,并在IDEA上创建远程调试配置,连接到目标JVM上的调试服务端口,
    实现对远程程序的调试和控制。
Ⅲ:远程调试协议:
    在远程调试时,客户端和服务端之间通过远程调试协议进行通信。客户端会发送调试命令和断点信息到服务端口,服务端会执行调试命令
    并返回相应的结果,通过协议来实现客户端与服务端的交互。
Ⅳ:远程调试的工作原理:
    远程调试流程包括以下步骤:
        ①:启动远程 JVM 并配置调试服务端口;
        ②:在客户端创建远程调试配置,并连接到目标 JVM 上的调试服务端口;
        ③:在客户端设置断点和调试命令,并通过远程调试协议发送到服务端口;
        ④:服务端接收到命令后执行,并返回结果;
        ⑤:客户端收到结果后,根据调试命令和状态更新调试器界面。
Ⅴ:远程调试的优劣势:
    优势:可以直接在目标环境上调试代码,同时也可避免因操作系统等差异导致的问题;
    劣势:需要在目标环境上(服务端)开启调试服务端口,同时还需要在客户端设置调试器进行连接,非常繁琐。

二:使用远程调试(物理机部署)

1:服务端添加远程通道

要让远程服务器运行的代码支持远程调试,则服务端启动的时候必须加上特定的 JVM 参数,这些参数是:
    不同的JDK版本需要设置不同的配置:
        JDK 9 or later
            -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:9999
        JDK 5-8
            -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999
        JDK 1.4.x
            -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999
        JDK 1.3.x or earlier
            -Xnoagent -Djava.compiler=NONE -Xdebug
            -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999

这里的9999则是服务端开放的端口,后期客户端IDEA需要连接当前端口进行远程交互和调试。
但是我们需要注意的是,这个9999端口在服务端一定要放开防火墙或者安全组;
具体端口看项目需求;运行服务端jar包程序则如下(JDK 5-8版本):
    java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999 ./SwaggerDemo-0.0.1-SNAPSHOT.jar > app.log &

2:客户端连接远程通道

  设置Edit Configurations来配置信息

注:远程代码和本地代码一定要一致,否则打断点会打偏或者压根无法打断点,

标签:端口,IDEA,调试,JVM,Debug,远程,服务端,客户端
From: https://www.cnblogs.com/antLaddie/p/17385438.html

相关文章

  • Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式
    共享内存就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案。这里的调试分为了两种,一种是调试模式,一种是开发者模式。需要这两种模式的原因也很简单:1.在远程调试的时候,我可能需要程序从头开始进入调试,这就要求程序一直卡在开头的某个位......
  • 如何进行MySQL源码调试(一条select语句的执行流程)
    一、背景MySQL是当今世上最受欢迎的使用最广泛的开源数据库,它的繁荣离不开它的开源特性。放在过去商业数据库的时代,大家都没有机会接触到数据库的源代码,但在如今开源数据库的时代,越来越多的人开始研究数据库的源码,并给社区贡献代码,MySQL官方每次发布新版本都要感谢一些在社区上贡......
  • idea进入和创建web项目
    我真的服了,以往一直Add添加项目,但是今天突然失败了我搞了好久都没搞出来,服了之后去问了我nb的舍友,他帮我搞好了!!!#记录,如何创建web项目第一步,创建项目在pom.xml文件里面使用web打包,并且转一下第二步,打开这个界面双击红色文字,点击ok第三步,点击上个图片上面的AddAppli......
  • 使用 shell 脚本自动申请进京证 (六环外) —— debug 过程
    问题现象用shell脚本写了一个自动办理六环外进京证的工具《使用shell脚本自动申请进京证(六环外)》,然而运行这个脚本总是返回以下错误信息:{"msg":"目前办理业务人数较多,请稍后再试。","code":500}咨询woodheader/jjz项目的作者,了解到问题就是出在请求头或参数......
  • Unable to open debugger port (127.0.0.11774) java.net.BindException Address alre
    解决intellijIDEA启动项目报错:Unabletoopendebuggerport(127.0.0.1:1774):java.net.BindException"Addressalreadyinuse:bind"cause(原因)端口被占用❗resolve(解决)netstat-aon|findstr"端口号"taskkill-f-pid进程号参考博客解决idea启动项目报错:U......
  • Android Studio中使用断点调试程序
    1.设置断点在希望中断的位置左边label一下,设置一个断点。例如下方图片所示在ActivityResultRegistry类中的第147行设置了一个断点,以及在365行dispatchResult()方法处设置了一个断点。设置好断点后,可以在菜单栏依次点击Run->ViewBreakpoints查看所设置的全部的断点,并进行删减......
  • httprunner 4.x学习 - 6.debugtalk辅助函数的使用
    前言httprunner4.x可以支持go语言和python语言写辅助函数,本篇主要介绍python语言写辅助函数。debugtalk辅助函数在项目根目录新建debugtalk.py文件写辅助函数可以实现自动化生成动态参数。如下生成时间戳和随机字符串示例#debugtalk.pyimporttimeimportuuidde......
  • KaiOS 2.5.X 使用 WebIDE 安装以及调试第三方应用程序
    本教程将展示使用WaterfoxClassic安装为KaiOS2.5.x设计的应用,同时我们也非常推荐使用它来进行安装和调试应用。本教程本身不会对手机产生任何损害,但请注意,你必须信任你所安装的应用是安全、无任何威胁的,WebIDE不会验证应用的安全性,MomoTrace不对因使用WebIDE安装恶意应......
  • 使用IDEA创建第一个SpringBoot项目并进行一些基础配置的详细教程
    1.打开IDEA,新建newproject,填写项目信息。 2.如上图所示,设置serverURL为阿里云服务器为:https://start.aliyun.com/下面的Java版本选择必须和ProjectSDK版本相对应,不然不能进行下一步。3.选择springboot版本和开发会使用到的组件,最后点finish即可。 4.等待IDEA创建并......
  • idea实现远程debug
    nohupjava-Xmx256m-Xms128m-Xmx256m-Xms128m-Dspring.cloud.nacos.discovery.ip=150.158.28.239-Xdebug-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jar./love-user-management-1.0-SNAPSHOT.jar>/dev/null2>&1&其实......