写了那么多年 Java 代码,终于 debug 到 JVM 了

继上篇文章 原创 | 全网最新最简单的 openjdk13 代码编译 以后,咱们有了本身编译后的 jdk 和 hotspot,以下图所示。接下来就来干一番事情。java

搭建调试环境

1.下载 CLion 软件

Jetbrains 是一家很是牛逼的公司,咱 Java 里面用到的 IDEA 功能很强大,这公司也为 C/C++ 提供一个 IDE,名叫 CLion,咱须要下载这个 IDE 来调试 JVM 源码。linux

2.导入源码

安装完 CLion 以后,咱就能够先导入代码,下面简单记录一下操做步骤。设计模式

选择 New CMake Project from Sources并发

打开咱们下载 OpenJDK13 的目录,个人目录是 /opt/java/openjdk/jdk13异步

接下来有弹框点击 Next 就好了,等待导入源码完成(须要几分钟,能够喝杯茶)。jvm

3.启动配置

导完源码后,咱们须要配置启动程序,这里有些配置须要从新指定,主要有下面 2 点。ui

  • Executable 修改成我们编译后的 java 程序。

  • Build 须要删除掉。

4.打下断点

咱们在 thread.cpp 代码的 Threads::create_vm 方法打下断点。spa

5.开始 Debug

点击 Debug 按钮,开始调试咱们的 JVM 代码。能够看到咱们打的断点生效了,以下图所示。操作系统

恭喜,咱们成功调试 JVM 代码。不过发现了下面这个异常信息,解决它。线程

6.发现这个异常

按 F9 让程序继续跑,咱们发现 Console 出现了下面红框的一行字。

这是 GDB 的异常信息,咱们能够经过在咱们的用户目录下添加配置来解决这个问题。建立 ~/.gdbinit 文件,添加以下配置。

handle SIGSEGV nostop noprint pass
handle SIGBUS nostop noprint pass
handle SIGFPE nostop noprint pass
handle SIGPIPE nostop noprint pass
handle SIGILL nostop noprint pass复制代码

再运行就不会有这个异常信息了。

调试本身的代码

上面已经调通了咱们编译的 JVM 源码,有同窗可能想知道,那要调试本身写的代码得怎么操做呢?咱们上面已经看到 Debug 到 JVM 源码了,咱们本身的代码则能够经过咱们编译后的 JDK 来编译,而后在程序执行参数那里指定。下面举个例子。

1.编写 Test 代码

咱们编写一个简单的 Hello JVM 程序,代码以下。

public class Test {

    public static void main(String[] args) {
        System.out.println("hello jvm");
    }
}复制代码

2.javac 编译

经过咱们编译后的 JDK 命令 javac Test.java 来编译。

liebrother@liebrother:/opt/java/openjdk/jdk13/build/linux-x86_64-server-release/jdk/bin$ ./javac Test.java复制代码

3.配置启动参数

而后在 Clion 程序启动配置那里指定咱们的类 Test。

结果就是咱们的程序被运行了。

以上就是咱们今天要讲的在 JVM 层面上调试咱们本身写的程序。

总结

总结一下搭建这套 JVM 环境。搭建过程当中其实没有很波折,官方文档写的很清晰(虽然都是英文的),这 2 篇文章也是尽最大的努力,把一些步骤简化,也截图保留下来,一方面给本身回顾的机会,一方面也是给有想要搭建这套环境的朋友们一个捷径。这套环境接下来的定义是:给本身深刻了解 JVM 的机会,在遇到某些知识点不清晰,不明白原理的时候,就能够看一看源码,揪出源头的逻辑

很是建议朋友们搭建这么一套环境,也不要怕 JVM 里面都是 C/C++ 代码,可能刚开始看的时候会很费劲,看多了就习惯了。

推荐阅读

写了那么多年 Java 代码,终于 debug 到 JVM 了

全网最新最简单的 openjdk13 代码编译

了解Java线程优先级,更要知道对应操做系统的优先级,否则会踩坑

线程最最基础的知识

老板叫你别阻塞了

吃个快餐都能学到串行、并行、并发

泡一杯茶,学一学同异步

进程知多少?

设计模式看了又忘,忘了又看?

后台回复『设计模式』能够获取《一故事一设计模式》电子书

以为文章有用帮忙转发&点赞,多谢朋友们!LieBrother

相关文章
相关标签/搜索