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

Posted 蚂蚁小哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用IDEA远程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远程调试

IDEA 远程调试,像运行本地代码一样调试远程主机上的程序,以排查远程程序的BUG或代码执行流程。

概述

原理:本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息。
被调试程序的远程虚拟机:作为 Debug 服务端,监听 Debug 调试指令。jdwp是Java Debug Wire Protocol的缩写。
调试程序的本地虚拟机:IDEA 中配置的 Remote Server,指定 Debug 服务器的Host:Port,以供 Debug 客户端程序连接。

build tar包

如果有太多警告,可以直接用命令行 gradle -x test clean build,这样不用 test了,build成功会生成***/build/libs/***.jar。

如果gradle出问题(比如都找不到gradle窗口或者gradle只有目录没有子目录),可以重新设置gradle user home[java环境配置:安装jdk和集成开发环境],apply后就会出现gradle import页面,重新import一下。

如果命令出错,可以尝试直接点gradle窗口中的

上传tar包

专业版idea才能用上传jar包

Tools > HTTP Client > Test RESTful Web Service > 弹出窗口中点击顶部提示中的convert request to the new format

POST http://1.1.1.1:12345/load
Content-Type: multipart/form-data; boundary=WebAppBoundary

--WebAppBoundary
Content-Disposition: form-data; name="jarFile"; filename="scene_abc@***.jar"

< ./***/build/libs/common_scene@common_solution.jar
--WebAppBoundary--

注意修改端口和filename。

是否上传成功需要看“success”:true。

如果debug时断点没有打勾,也可能是jar包没上传成功

debug设置

2.1 IDEA 中指定 Debug 服务器
点击主窗口菜单 Run / Edit Configurations,打开“Run/Debug Configurations”窗口;
点击工具栏上的“+”按钮,下拉菜单中选择“Remote”;
设置 Host 为远程服务器的域名或IP(与jar包上传地址相同),设置Port,如5005;
会生成命令行参数形如 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

复制命令行参数


2.2 远程服务中开启 Debug 服务
2.2.1 对于 SpringBoot
命令行添加选项,并重启:

## 注意新参数必须在 -jar 之前
jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test.jar
2.2.2 对于 Tomcat
启动脚本中添加选项,并重启:

## sudo vim $CATALINA_HOME/bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
2.3 远程服务器防火墙端口放行
### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT
### 重启生效: sudo systemctl restart iptables
3 开始调试
要求:双方代码一致,否则远程调试无法启动;
本地启动刚刚配置的 Remote Server,正常时会看到日志: Connected to the target VM, address: 'xxx:5005', transport: 'socket'
本地 IDEA 代码中设置断点
浏览器或手机 HTTP 访问服务器
IDEA 即可在断点暂停并跟踪
4 关闭调试
服务器上多开放个端口是不安全的,调试完毕后可恢复防火墙设置。
而 Java 服务器开启 Debug 服务器的功能可以保留,以便之后再次调试。

解决断点debug卡顿问题

1.把toString关掉
点开设置,搜索toString 把下图中红框勾掉。
解决:走了第一个断点,走到下一个断点很慢的问题。


2.断点设置为线程级别
勾选Thread 并点击右侧的   Make Default。
解决:断点一个op,其他op也被暂停执行导致的各种超时问题。


 
3.不要在Method上设置断点
断点设置在代码上,不要在方法上打断点。
解决:设置断点之后运行特别慢的问题(第一个断点都慢)。

 

from: IDEA远程调试_-柚子皮-的博客-CSDN博客_idea远程调试
ref: IDEA 远程断点调试_Destiny_zz的博客-CSDN博客_idea远程断点调试

以上是关于使用IDEA远程Debug调试(详细)的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat使用IDEA远程Debug调试

使用IDEA远程调试(一篇懂所有)

Java Remote Debug(idea远程调试)

IDEA远程调试

IDEA远程调试

IDEA远程调试