确保已经在centos中编译好了openjdk8
编译openjdk8==centos7.9编译openjdk8_一个java开发的博客-CSDN博客
确保使用的是slowdebug
centos安装可视化界面
centos安装idea并放到桌面快捷方式
打开IDEA,新建一个java项目,并将项目使用的jdk设置为编译好的JDK即可
以上就可以使用编译出来的JDK了。
==========================================
编写测试类:
- 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到了源码的哪一行,然后打开源码查看对应的地方即可
=======================================================
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
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