继上篇文章 全网最新最简单的 OpenJDK13 代码编译 之后,我们有了自己编译后的 jdk 和 hotspot,如下图所示。接下来就来干一番事情。

搭建调试环境

1.下载 CLion 软件

Jetbrains 是一家非常牛逼的公司,咱 Java 里面用到的 IDEA 功能很强大,这公司也为 C/C++ 提供一个 IDE,名叫 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 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。

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

以上就是我们今天要讲的在 JVM 层面上调试我们自己写的程序。

总结

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

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

行为型模式:责任链模式

行为型模式:迭代器模式

创建型模式:单例模式

觉得文章有用帮忙转发&点赞,多谢朋友们!

javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了相关推荐

  1. 用java代码怎样打开网址_写了一段打开网页java代码报错: 求大神解救

    报错内容:Exceptioninthread"main"org.openqa.selenium.WebDriverException:Unabletobindtolockingpo ...

  2. java实现读者写者问题_读写者问题-java实现

    读者-写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题.计算机系统中的数据(文件.记录)常被多个进程共享,但其中某些进程可能只要求读数 ...

  3. java代码删除文件夹_删除文件夹的java类

    /** * @author www.nwu.edu.cn MiniRice * @author darkrice@gmail.com * @version    1.2 * */ http://www ...

  4. java中execution的作用_一文初步了解Java虚拟机

    大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...

  5. java webservice报文过长_工作1-5年的Java程序猿到底需要怎样的一个技术栈?

    工作1-5年的Java程序猿到底需要怎样的一个技术栈? 前言: 具有1-5年开发经验的程序员 需要学习的内容其实还有很多很多. 今天跟大家交流一下希望分享出来的对大家能够有帮助,这是我这些年总结出的一 ...

  6. java异常没有catch住_今天才真正了解Java的异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常发生的原因有很多,通常包含以下几大类: 1.用户输入了非法数据. 2.要打开的文件不存在. 3.网络通信时连接中断 ...

  7. java实现次方的运算_【技术干货】Java 面试宝典:Java 基础部分(1)

    海牛学院的 | 第 616 期 本文预计阅读 |18 分钟 Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法, ...

  8. java定义一个eat方法_小黄鸭系列java基础知识 | java中的方法

    前言 今天我们要探讨的问题,是java基础语法的最后一个问题,也就是java中的方法,今天主要从以下几个方面来介绍: 方法是什么(定义) 方法的分类 方法的调用 应该说,学完今天的知识,你至少应该看懂 ...

  9. java源码聊天软件_【原创】基于Java NIO的多人在线聊天工具源码实现(登录,单聊,群聊)...

    近来在学习Java NIO网络开发知识,写了一个基于Java NIO的多人在线聊天工具MyChat练练手.源码公开在Coding上: 编写一个基于Java NIO的多人在线聊天工具,需要以下几方面的知 ...

  10. java注释还能运行_老师,你确定Java注释不会被执行吗?

    之前在博客上分享过一篇文章,涉及到 Java 中的注释,就信誓旦旦地写了一句话:"注释是不会被执行的!"结果,有小伙伴留言说,"老师,你确定吗?" 我这个人一直 ...

最新文章

  1. 电脑画画软件_手绘、板绘、还有用pad画画都有啥区别?
  2. 学术圈竞赛圈大讨论,深度学习真的比不过GBDT模型吗?
  3. LocalDateTime、OffsetDateTime、ZonedDateTime互转,这一篇绝对喂饱你
  4. pyqt5中信号与槽的认识
  5. 有服务器风扇声音对胎儿有影响吗,大噪音对胎儿的影响
  6. Linux学习-仅执行一次的工作排程
  7. Hulu直播服务难点解析(二):系统设计与实现
  8. 前端信息查询与显示_中国商标网查询显示的信息都是正确的吗
  9. 大数据|意不意外?今年卖得最好的月饼是这个馅的……
  10. HTML创建几个边框,使用HTML5创建多个边框
  11. 教你如何认识各种光纤接口类型
  12. 海外服务器IP为什么被封以及解决方案
  13. linux 传真 邮件,基于Linux的传真系统(转)
  14. MATLAB实现遥感图像分类——K均值算法
  15. 计算机管理无法格式化硬盘,sd无法格式化怎么解决_电脑无法格式化sd卡怎么办-win7之家...
  16. Excel如何来绘制不同函数的图像;不同数学符号可以在word中打处理;
  17. dss nginx 403 forbidden
  18. 期刊、会议水平查询网站 声纳图像处理可以投稿的期刊和会议记录
  19. Android HDMI audio设备插拔事件
  20. 熊孩子乱敲键盘攻破linux桌面,“熊孩子”乱敲键盘就攻破了 Linux 桌面,大神:17 年前我就警告过你们...

热门文章

  1. KMP模式匹配的next数组
  2. 超声主瓣,旁瓣,栅瓣概念解析
  3. 24种设计模式与6大原则
  4. 【aspnetcore】模拟中间件处理请求的管道
  5. 数据结构开发(11):双向循环链表的实现
  6. Vue学习笔记之Vue学习前的准备工作
  7. 5.hbase表新增数据同步之add_peer
  8. 虚拟机单一网卡设置两个IP
  9. Silverlight概要
  10. 搞科研身体才是革命的本钱。