1. 问题描述
在IDEA跑一段代码:
public class Hello {
public static void main(String[] args) {
System.out.println("hello world");
}
}
使用Run的时,正常执行:
hello world
Process finished with exit code 0
使用Debug时,控制台报错:
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_LOAD(196)
ERROR: transport library not found: dt_socket
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509)
JDWP exit error AGENT_ERROR_TRANSPORT_LOAD(196): No transports initialized [debugInit.c:750]
Process finished with exit code 1

2. 常规排查
通常这个问题出自于 IDEA 的配置错误。
排查步骤如下:
2.1. 配置JDK
打开Project Structure:File -> Project Structure。


2.2. JDK 完整性排查
若配置正确,依然不对,那就要怀疑是不是 JDK 本身的问题了。检查 JDK 是否存在以下文件:
dir “%JAVA_HOME%\jre\bin\jdwp.dll”
dir “%JAVA_HOME%\jre\bin\dt_socket.dll”
如果 JDK 确定有问题,或者高度怀疑 JDK 有损坏,那么换一个新的 JDK。
2.3. 检查系统环境变量
这里环境变量配置的 JDK,和 IDEA 里配置的保持一致。
环境变量的问题不关键,毕竟在 IDEA 里可以配置多个 JDK,IDEA 是会自己去找 JDK 路径的。不过为了排查问题,姑且把环境变量指向的 JDK 和 IDEA 里配置的 JDK 对齐。


2.4. 总结
常规检查的思路就是,从 IDEA 到 JDK 这条路径,每个节点都排查一遍,大概率出问题在某个节点上,节点排查完毕一般就能解决。
3. 深度排查
当我做完常规排查,依然没解决。
3.1. 控制台调试
在控制台上执行 java 文件
E:\leetCode\leetcode\editor\cn>javac Hello.java
E:\leetCode\leetcode\editor\cn>java Hello
hello world
从以上代码看来 JDK 可以正常运行。
E:\leetCode\leetcode\editor\cn>java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp . Hello
ERROR: transport library not found: dt_socket
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509)
JDWP exit error AGENT_ERROR_TRANSPORT_LOAD(196): No transports initialized [debugInit.c:750]
FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_LOAD(196)
当我在控制台上使用调试排查时,也出现了错误。调试命令如下:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -cp . Hello
由此可以排除 IDEA 的问题。
至此,我们需要确定,2.2 和 2.3 排查是否正确。重新排查 JDK 和环境变量。
3.2. 问题定位
查看 java 和 JAVA_HOME 信息:
where java
java -version
echo %JAVA_HOME%
E:\leetCode\leetcode\editor\cn>where java
D:\开发软件\Java\jdk1.8.0_181\bin\java.exe
E:\leetCode\leetcode\editor\cn>java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
E:\leetCode\leetcode\editor\cn>echo %JAVA_HOME%
D:\开发软件\Java\jdk1.8.0_181
其中包含了中文目录名 开发软件。Java 加载 JNI 本地库时,有时会在包含中文路径的情况下出现加载失败的问题。
3.3. 问题修复
当我把路径改为纯英文名路径后,问题修复。
问题复现:
我再次把 jdk 放到中文名目录下,问题出现。由此可以确定是这个中文名路径导致。
4. PS 感想
其实中间还走了很多弯路。
一开始是怀疑 IDEA 有问题,因为我的 JDK 是官网下载的完整版,环境变量也检查过数次,都是没问题的。而 IDEA 是使用的破解版,恰好近期破解版出了点问题。于是卸载安装了数次,用了个社区版。
当我用了社区版,明明是新安装的,却有很多设置,比如有近期项目。于是就去 C:\Users[用户名]\AppData\Roaming\JetBrains\ 下把对应版本的设置全删了,再重新安装,然而结果可想而知,并没有解决问题。
然后我开始怀疑是不是新安装的 docker 导致。
当没有思路的时候,就会到处乱撞。
于是我回到本源来排查。在控制台上跑 Java 文件,在控制台上做调试。发现控制台也出错。于是可以彻底把 IDEA 的问题排除。专注在 JDK 这一端的排查。既然 JDK 没问题,那可能就是路径的问题了。于是才找到问题根源。
windows 还是不要用中文目录了好,即便现在我用了 windows11,还是逃不过编码魔咒。
1160

被折叠的 条评论
为什么被折叠?



