![4c1be6fe180192fb322cd7272bb56a4f.png](https://i-blog.csdnimg.cn/blog_migrate/869dcde76ab94f370b1769b26f506595.jpeg)
![9660c211091b45431f307fdaa27749fb.png](https://i-blog.csdnimg.cn/blog_migrate/d59cdfb1be362da923208fa22b1d9104.jpeg)
# 搭建调试环境
## 1.下载 CLion 软件
Jetbrains 是一家非常牛逼的公司,咱 Java 里面用到的 IDEA 功能很强大,这公司也为 C/C++ 提供一个 IDE,名叫 CLion,咱需要下载这个 IDE 来调试 JVM 源码。
# 2.导入源码
安装完 CLion 之后,咱就可以先导入代码,下面简单记录一下操作步骤。
选择 New CMake Project from Sources。
![7481a62fbc1f12aad0ce04f69aa8e8f5.png](https://i-blog.csdnimg.cn/blog_migrate/13b985d7d7f56bbfe19d09d19b139f82.jpeg)
打开我们下载 OpenJDK13 的目录,我的目录是 /opt/java/openjdk/jdk13。
![cbf43ab062be6d128366e04eb553ecc3.png](https://i-blog.csdnimg.cn/blog_migrate/b268911692c7cac5bfccdff4ed68e78e.jpeg)
接下来有弹框点击 Next 就行了,等待导入源码完成(需要几分钟,可以喝杯茶)。
# 3.启动配置
导完源码后,我们需要配置启动程序,这里有些配置需要重新指定,主要有下面 2 点。
- Executable 修改为咱们编译后的 java 程序。
![71d13f6a3560d09193ba4e2a024e520a.png](https://i-blog.csdnimg.cn/blog_migrate/307adfc88b55a6b14788fbf1aef89ace.jpeg)
- Build 需要删除掉。
![c90c839ade4c477e560f002667d2710e.png](https://i-blog.csdnimg.cn/blog_migrate/d0f76db24d43af58238c9cdf974d56b0.jpeg)
# 4.打下断点
我们在 thread.cpp 代码的 Threads::create_vm 方法打下断点。
![e0a2cc063746cb913d8df665e1f679c4.png](https://i-blog.csdnimg.cn/blog_migrate/88e8f99139669f85c215e095be395e8b.jpeg)
# 5.开始 Debug
点击 Debug 按钮,开始调试我们的 JVM 代码。可以看到我们打的断点生效了,如下图所示。
![d39b1ecbef3a265b80a758a22698aebb.png](https://i-blog.csdnimg.cn/blog_migrate/d7d7bda715a181d41eeaf7c3660465ec.jpeg)
恭喜,我们成功调试 JVM 代码。不过发现了下面这个异常信息,解决它。
# 6.发现这个异常
按 F9 让程序继续跑,我们发现 Console 出现了下面红框的一行字。
![196814b7ef1f3722766790ad058da123.png](https://i-blog.csdnimg.cn/blog_migrate/d3e703986c2e862323f41a5c035af024.jpeg)
这是 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。
![2595a9de5ff01f11110ca38a5fdecfa6.png](https://i-blog.csdnimg.cn/blog_migrate/98cb0eadc5653a045226a5df3aa203aa.jpeg)
结果就是我们的程序被运行了。
![b2853300b432c4b6f42f461b127846a5.png](https://i-blog.csdnimg.cn/blog_migrate/3b4f96bfa3decc11dbdacb61cb8b5d28.jpeg)
以上就是我们今天要讲的在 JVM 层面上调试我们自己写的程序。
# 总结
总结一下搭建这套 JVM 环境。搭建过程中其实没有很波折,官方文档写的很清晰(虽然都是英文的),把一些步骤简化,也截图保留下来,一方面给自己回顾的机会,一方面也是给有想要搭建这套环境的朋友们一个捷径。这套环境接下来的定义是:给自己深入了解 JVM 的机会,在遇到某些知识点不清晰,不明白原理的时候,就可以看一看源码,揪出源头的逻辑。
最后:
![3c4ac092b43103e7f44f59a0ce9c42b2.png](https://i-blog.csdnimg.cn/blog_migrate/56c86656e5aab2a13caed2ad3ca5e7b5.jpeg)
上面都是自己整理好的!我就把资料贡献出来给有需要的人!顺便求一波关注。
学习我们是认真的,拿大厂offer是势在必得的。java(想了解更多点一下哦)
原文链接:https://juejin.im/post/5e493696e51d45270d53060d