JVM | 使用 CLION 调试 OpenJDK11 源码

本贴最后更新于 1769 天前,其中的信息可能已经东海扬尘

开头说两句

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: Java 技术大本营
java_subscribe

导入源码到 CLION

打开 CLION -> New CMake Project from Sources

然后选择 JDK 源码目录,然后按默认勾选,点 OK,如下图所示:

ODd7DO

调整 CMakeList.txt

如果直接按默认的 CMakeList.txt 来, 会发现任意打开一个代码, 都是全面飘红。

保留下来的 CMakeList.txt 主要有两部分:

一。include_directories

这个是为了构建代码索引, 在 Clion 中看起来不是全面飘红

二。add_executable

这个是为了能在 Clion 中创建执行程序, 可以直接执行我们的 Java 程序

然后原有的 test 目录都删除掉

完整的 CMakeList.txt 因为大长,就不复制,可前进 GitHub 查看:

https://github.com/xiaodaojava/openjkd11-CmakeList

开始调试

在右上角,和 idea 一样的位置,创建一个 Cmake Application

9evWyK

然后我们把断点打到 jdk11/src/java.base/share/native/libjli/java.c 394 行

如下图所示:

q5bQZU

然后点击 debug 运行:

可以看到进入断点,并且在 Debug 面板可以看到我们传入的 -version 参数

ZCVwYy

在调试过程中,会遇到 error: No current target; cannot handle signals until you have a valid target and process. 这个错, 先不管, 直接继续运行

最终会在控制台看到如下输出:

Jzz94U

LLDB 的 Signal: SIGSEGV (signal SIGSEGV)

解决上面出现的 LLDB 异常暂停的错误,需要我们在入口断点处也就是进入到 394 行时就输入如下命令

process handle --pass true --stop false SIGSEGV
process handle --pass true --stop false SIGBUS

如下图所示:

zv2zkz

然后放过断点继续运行,可以看到, 这次程序没有意外暂停, 而且在控制台输出

v4uefX

总结

开始的调试并不麻烦,也只传了一个 -version 参数做测试。 后面我们要编写 Java 程序, 并且观察虚拟机是如何执行我们的 Java 代码,大家一起加油!

  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...