-
IntelliJ远程Debug,找问题不要只会看日志了
- 网站名称:IntelliJ远程Debug,找问题不要只会看日志了
- 网站分类:技术文章
- 收录时间:2025-08-27 19:26
- 网站地址:
“IntelliJ远程Debug,找问题不要只会看日志了” 网站介绍
1 前言
我们习惯于在本地开发的时候debug,能快速定位与解决问题,那部署在服务器上是不是就没有办法了呢?只能通过查看日志来定位?
不是的,在远端的服务器上,我们一样可以debug。
2 IDEA的debug
我们先来看一下在IntelliJ IDEA直接debug是怎样的。
先准备一个简单的Java程序:
package com.pkslow.basic;
import java.util.Map;
public class RemoteDebug {
public static void main(String[] args) {
System.out.println("------------------start------------------");
System.out.println("get all the system environment");
Map<String, String> envs = System.getenv();
System.out.println("\nprint out the contains `HOME`");
System.out.println("------env HOME------");
envs.entrySet().stream()
.filter(env -> env.getKey().contains("HOME"))
.forEach(env -> {
System.out.println(env.getKey() + ":" + env.getValue());
});
System.out.println("------------------end------------------");
}
}
功能很简单,获取所有系统环境变量,并打印出含有HOME字段的。
Debug很简单,直接点击以下按钮就可以:
相信大家都知道这一点,但应该很多人都不会注意,IDEA究竟做了什么,为什么就可以调试了呢?我们看一下控制台的日志就明白了:
/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n -javaagent:/Users/pkslow/Library/Caches/IntelliJIdea2019.3/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/charsets.jar:" com.pkslow.basic.RemoteDebug
Connected to the target VM, address: '127.0.0.1:59313', transport: 'socket'
简化一下,不重要的参数去掉:
java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n com.pkslow.basic.RemoteDebug
这就是可以Debug的原因,利用了Java Agent原理。这个功能很强大,类似一个AOP,代理了Java程序,可以利用它进行调试、热部署等。
3 调试本地程序
我们先试试如何可以调试本地程序,不是直接在IDEA上调试。先要编译出class文件RemoteDebug.class,然后按package结构放好。我通过mvn clean compile来编译。
启动程序,在target/classes/目录执行:
nbsp;java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50050,suspend=y,server=y com.pkslow.basic.RemoteDebug
Listening for transport dt_socket at address: 50050
然后程序就会等待调试客户端的连接,不会往下执行。
配置IDEA以进行调试:
配置完成保存后,点击debug就可以了:
程序已经进入debug模式:
我们已经执行到了其中一行,现在看看服务端:
与IDEA是同步的,并且确实已经控制了服务端Java的执行。
4 远程调试Linux Java程序
先把程序部署在Linux上:
nbsp;scp -P 22 ./com/pkslow/basic/RemoteDebug.class root@xxx.xx.xx.xxx:/root/remoteDebug/com/pkslow/basic/
RemoteDebug.class 100% 2572 282.5KB/s 00:00
通过以下命令在服务端启动程序,这里调试端口改为9999,因为部分端口在远程服务器并没有开启:
java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug
本地电脑IDEA配置如下:
开始debug,正常控制了远程服务端的Java:
服务端的实时执行情况:
让程序执行完如下:
nbsp;java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug
Listening for transport dt_socket at address: 9999
------------------start------------------
get all the system environment
print out the contains `HOME`
------env HOME------
JAVA_HOME:/root/jdk1.8.0_131
HOME:/root
------------------end------------------
5 总结
本文一步步探索如何进行调试远程的服务器,这在出现问题时定位还是非常有用的。毕竟可以实时看到服务端运行环境。
多读书,多分享;多写作,多整理。
更多相关网站
- 微服务架构全景:从分布式配置到高并发秒杀全链路精讲
- 内存溢出OutOfMemoryError科普系列一
- 三天学会使用MyBatis,绝对干货,只实战,不学究
- Hadoop(一、环境搭建)_hadoop的搭建
- 深入解析 Java OutOfMemoryError_深入解析巴以冲突的根源与原因
- 一个关于 Java 的堆内存的小探索_java堆内存和栈内存图解
- 6 款 Java 8 自带工具,轻松分析定位 JVM 问题
- 推荐一款单机10W+的可用即时通讯工具
- 建议收藏!深入理解Java虚拟机:JVM垃圾回收算法+垃圾收集器
- JVM 参数调优_jvm参数调优的目标
- Win10系统安装JDK8与环境配置指导教程
- Spring boot——Actuator 详解_spring boot 介绍
- 做开发这么久了,还不会搭建服务器Maven私有仓库?这也太Low了吧
- 阿里巴巴开源的Java诊断工具Arthas最佳实践
- TestNG自动化测试框架实战详解_自动化测试框架工具
- 0748-5.14.4-Kafka的扩容和缩容_kafka扩partition
- 资深测试必备技能!TestNG自动化测试框架实战详解
- 从原理和源码梳理Springboot FatJar 的机制
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- 兔兔工程量计算软件下载 (27)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- segoe ui是什么字体 (27)
- head first java电子版 (32)
- clickhouse中文文档 (28)
- jdk-8u181-linux-x64.tar.gz (32)
- 计算机网络自顶向下pdf (34)
- -dfile.encoding=utf-8 (33)
- jdk1.9下载 (32)