openjdk8 JVM源码阅读==windows&centos Clion debug openJDK8

确保已经在centos中编译好了openjdk8

编译openjdk8==centos7.9编译openjdk8_一个java开发的博客-CSDN博客

确保使用的是slowdebug

 centos安装可视化界面

centos安装idea并放到桌面快捷方式

打开IDEA,新建一个java项目,并将项目使用的jdk设置为编译好的JDK即可

 以上就可以使用编译出来的JDK了。

==========================================

debug JDK源码

1-直接在centos上debug

编写测试类:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("6666666");
    }
}

将测试类拷贝到JDK的bin目录下

编译测试代码

./javac -g HelloWorld.java 

开始用gdb调试:

gdb java

set args HelloWorld testjdk

start开始debug

next查看下一行

step进入方法内部

list查看当前debug到了源码的哪一行,然后打开源码查看对应的地方即可

=======================================================

2-在windows上使用clion进行debug

Windows 如何远程调试openjdk 源码 gdbserver gdb 老鸟们会了吗https://baijiahao.baidu.com/s?id=1726254596484068751&wfr=spider&for=pc

cd /opt/jdk

zip -r openjdk openjdk
rz

将整个openjdk目录压缩后从centos下载到windows上后,解压,然后用clion直接open整个openjdk文件夹

 然后在centos编译得到的文件的bin目录下新建测试类Test.java

public class Test {

public static void main(String[] args) {

System.out.println(">>>>>>>>>>>>>>>>"+Thread.currentThread().getName());

}

}

然后编译

./javac -g Test.java
然后启动server,需要保证1234s端口是开放的

gdbserver :1234 java Test

然后在windos上用clion 的configuration新建一个remote debug,连接到centos暴露的端口进行远程debug,

tcp:192.168.136.101:1234

/opt/jdk/openjdk

E:\openjdk

 然后在clion里找到main.c,路径是在jdk/src/share/bin/main.c,然后打上断点

 找到java.c打上断点,jdk/src/share/bin/java.c

 然后clion开始debug,就会发现clion自动卡在了main.c之前定义的断点处。

 同时centos上等待的server发现了来自远程的连接

 现在就可以在clion进行后续的debug了。

整个Test.java的代码都debug完了之后,clion中的degug会自动退出。

同时centos中的server也自动结束了。

更改Test.java的代码后,重新编译,然后启动gdb server,然后clion重新开启debug即可。

====================================

从启动测试类一直到执行main方法的整个路径大致为

jdk/src/share/bin/main.c:125

jdk/src/share/bin/java.c:304

jdk/src/share/bin/java.c:2007

jdk/src/solaris/bin/java_md_solinux.c:1032

pthread_create_百度百科

pthread_join_百度百科

jdk/src/share/bin/java.c:376

jdk/src/share/bin/java.c:1214

JNI_CreateJavaVM::result

hotspot/src/share/vm/runtime/thread.cpp:3307

hotspot/src/share/vm/runtime/thread.cpp:3389

hotspot/src/share/vm/runtime/thread.cpp:3401

hotspot/src/share/vm/runtime/thread.cpp:988

hotspot/src/os/linux/vm/os_linux.cpp:978

create_attached_thread::thread

hotspot/src/share/vm/runtime/thread.cpp:1040

JavaCalls::call_special(&result, thread_oop,
                                 klass,
                                 vmSymbols::object_initializer_name(),
                                 vmSymbols::threadgroup_string_void_signature(),
                                 thread_group,
                                 string,
                                 CHECK_NULL);

内核层面的线程→c++层面线程→java层面的main线程

实现了java所谓的线程和操作系统线程的一一绑定。这就是java跨平台的由来。

 jdk/src/share/bin/java.c:477

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值