准备
本次实验仍是采用java debug wire protocol来满足同时在Idea中调试java代码和在CLion中调试openjdk的代码。
jar
准备java测试代码:
package com.saleson.jdk;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author saleson
* @date 2022-03-31 20:59
*/
public class Demo {
public static void main(String[] args) throws Exception {
int c = 0;
AtomicInteger ac = new AtomicInteger();
while (true) {
c++;
int d = ac.incrementAndGet();
System.out.println(String.format("c:%d, ac:%d", c, d));
System.out.println(System.currentTimeMillis());
Thread.sleep(2000);
}
}
}
在pom.xml 添加plugin
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.saleson.jdk.Demo</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行mvn命令编译生成jar包
mvn -DskipTests assembly:assembly
具体的步骤请看OpenJDK-调试 (CLion) #调试jar
CLion 和 Idea 调试参数
在CLion中新建 Custom Build Application
Field | Content | Describe |
---|---|---|
Target | 选择前面创建好的Custom Build Target | |
Executable | {openjdk}/build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java | 选择编译后的openjdk目录下的java命令 |
Propram arguments | -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080 personal-1.0-SNAPSHOT.jar | java 命令后面跟着的参数 |
Working directory | /Users/saleson/IdeaProjects/personal/target | jar所在的目录 |
在Idea中新建Remote类型的Debug Configuration
Field | Content | Describe |
---|---|---|
Host | localhost | 调试程序的ip |
Port | 8080 | jdwp开起的端口 |
Command line arguments for remote JVM | -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8080 | 调试远程JVM的命令参数 |
效果展示
先以debug方式运行CLion 中上面新建的Custom Build Application;
再以debug方式运行Idea中新建的Remote;
在CLion和Idea中分别设置断点,运行效果如下
CLion断点
Idea断点
CLion中的输出
远程调试参数说明
Field | Describe |
---|---|
-Xdebug | 通知JVM工作在debug模式下 |
-Xnoagent | 禁用默认sun.tools.debug调试器 |
-Djava.compiler=NONE | 禁止 JIT 编译器的加载 |
-Xrunjdwp | 通知JVM使用(java debug wire protocol)来运行调试环境;加载JDWP的JPDA参考执行实例 |
-Xrunjdwp 参数说明
Field | Describe |
---|---|
transport | 监听Socket端口连接方式(也可以dt_shmem共享内存方式,但限于windows机器,并且服务提供端和调试端只能位于同一台机) |
server | server=y表示当前是调试服务端,=n表示当前是调试客户端 |
suspend | suspend=n表示启动时不中断,一般用于设置主动连接;suspend=y表示启动时就进入调试模式,一般用于被动连接 |
参考
https://www.jianshu.com/p/ee7e9176632c
https://segmentfault.com/a/1190000040305260
https://blog.csdn.net/weixin_32010647/article/details/114567722