继上篇文章 原创 | 全网最新最简单的 openjdk13 代码编译 https://mp.weixin.qq.com/s/5gO0YJZB7huG9cOByH5Qow 之后, 我们有了自己编译后的 jdk 和 hotspot, 如下图所示. 接下来就来干一番事情.
搭建调试环境
1. 下载 CLion 软件
Jetbrains 是一家非常牛逼的公司, 咱 Java 里面用到的 IDEA 功能很强大, 这公司也为 C/C 提供一个 IDE, 名叫 CLion https://www.jetbrains.com/clion/ , 咱需要下载这个 IDE 来调试 JVM 源码.
2. 导入源码
安装完 CLion 之后, 咱就可以先导入代码, 下面简单记录一下操作步骤.
选择 New CMake Project from Sources.
打开我们下载 OpenJDK13 的目录, 我的目录是 /opt/java/openjdk/jdk13.
接下来有弹框点击 Next 就行了, 等待导入源码完成 (需要几分钟, 可以喝杯茶).
3. 启动配置
导完源码后, 我们需要配置启动程序, 这里有些配置需要重新指定, 主要有下面 2 点.
Executable 修改为咱们编译后的 java 程序.
Build 需要删除掉.
4. 打下断点
我们在 thread.cpp 代码的 Threads::create_vm 方法打下断点.
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 代码, 可能刚开始看的时候会很费劲, 看多了就习惯了.
来源: https://www.cnblogs.com/liebrother/p/11660116.html