![25714291ca2d47bcbf0a4d78878acf1a.png](https://i-blog.csdnimg.cn/blog_migrate/995cfcd983e2a651ea35a5e3f0f42f27.jpeg)
继上篇文章 全网最新最简单的 OpenJDK13 代码编译 之后,我们有了自己编译后的 jdk 和 hotspot,如下图所示。接下来就来干一番事情。
![1ede5015336b3c2765f961a36b854e1a.png](https://i-blog.csdnimg.cn/blog_migrate/14f60363831c0fbe2677f0d589297020.jpeg)
搭建调试环境
1.下载 CLion 软件
Jetbrains 是一家非常牛逼的公司,咱 Java 里面用到的 IDEA 功能很强大,这公司也为 C/C++ 提供一个 IDE,名叫 https://www.jetbrains.com/clion/,咱需要下载这个 IDE 来调试 JVM 源码。
2.导入源码
安装完 CLion 之后,咱就可以先导入代码,下面简单记录一下操作步骤。
选择 New CMake Project from Sources。
![05abd93b4b4d9f6b42ef68a9d5bb3a27.png](https://i-blog.csdnimg.cn/blog_migrate/d766028e344f0de89a3a234514020cb6.jpeg)
打开我们下载 OpenJDK13 的目录,我的目录是 /opt/java/openjdk/jdk13。
![f734c87dda8e806e5f38ecb1d7e7f0d0.png](https://i-blog.csdnimg.cn/blog_migrate/7069153b65898a28139788fddc287ff5.jpeg)
接下来有弹框点击 Next 就行了,等待导入源码完成(需要几分钟,可以喝杯茶)。
3.启动配置
导完源码后,我们需要配置启动程序,这里有些配置需要重新指定,主要有下面 2 点。
- Executable 修改为咱们编译后的 java 程序。
![606404b947bc048163498d675444f169.png](https://i-blog.csdnimg.cn/blog_migrate/565cb3450ef154ecaea9866e6f1114ce.jpeg)
- Build 需要删除掉。
![cfb5c8d74b972eb9120c6a820138139e.png](https://i-blog.csdnimg.cn/blog_migrate/e8668329006d7ca27362c9721c32538e.jpeg)
4.打下断点
我们在 thread.cpp 代码的 Threads::create_vm 方法打下断点。
![1f86daca4ec768419df5bdd7119a3a01.png](https://i-blog.csdnimg.cn/blog_migrate/797a3d177da0e7d258ad74966f85f41f.jpeg)
5.开始 Debug
点击 Debug 按钮,开始调试我们的 JVM 代码。可以看到我们打的断点生效了,如下图所示。
![deff8bbfc0fc49490966042d37eadf00.png](https://i-blog.csdnimg.cn/blog_migrate/d5aea7c602286ed3c0cbef63e700b5a6.jpeg)
恭喜,我们成功调试 JVM 代码。不过发现了下面这个异常信息,解决它。
6.发现这个异常
按 F9 让程序继续跑,我们发现 Console 出现了下面红框的一行字。
![dd567e90518d2855bb70c1e5c5d310a0.png](https://i-blog.csdnimg.cn/blog_migrate/a8d4a6f687786a3cd8e9ddf20e57e3b1.jpeg)
这是 GDB 的异常信息,我们可以通过在我们的用户目录下添加配置来解决这个问题。创建 ~/.gdbinit 文件,添加如下配置。
handle SIGSEGV nostop noprint passhandle SIGBUS nostop noprint passhandle SIGFPE nostop noprint passhandle SIGPIPE nostop noprint passhandle 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。
![ab6a12e51e67a95bae36fb4604f9c809.png](https://i-blog.csdnimg.cn/blog_migrate/e4e593e879b446611500aa1c0f6f8f1d.jpeg)
结果就是我们的程序被运行了。
![a8732cd5481344151a270eb2ae35b6fd.png](https://i-blog.csdnimg.cn/blog_migrate/bccf84e0ca6134c3495250b900a63cf4.jpeg)
以上就是我们今天要讲的在 JVM 层面上调试我们自己写的程序。
总结
总结一下搭建这套 JVM 环境。搭建过程中其实没有很波折,官方文档写的很清晰(虽然都是英文的),这 2 篇文章也是尽最大的努力,把一些步骤简化,也截图保留下来,一方面给自己回顾的机会,一方面也是给有想要搭建这套环境的朋友们一个捷径。这套环境接下来的定义是:给自己深入了解 JVM 的机会,在遇到某些知识点不清晰,不明白原理的时候,就可以看一看源码,揪出源头的逻辑。
非常建议朋友们搭建这么一套环境,也不要怕 JVM 里面都是 C/C++ 代码,可能刚开始看的时候会很费劲,看多了就习惯了。
行为型模式:责任链模式
行为型模式:迭代器模式
创建型模式:单例模式
觉得文章有用帮忙转发&点赞,多谢朋友们!