OpenJDK源码调试图文教程

首先需要明确的是,OpenJDK的源码调试需要借助GDB来实现,具体步骤如下:

步骤一:下载OpenJDK源码

可以到OpenJDK的官网(https://jdk.java.net/16/)下载源码压缩包,选择源码版本为当前使用的JDK版本对应的源码版本。下载后解压缩。

步骤二:为OpenJDK编译符号表

使用如下命令编译OpenJDK:

bash configure --disable-warnings-as-errors --with-debug-level=slowdebug
make LANG=C bash

编译完成后,以openjdk为例,可以在$OPENJDK/build/linux-x86_64-server-slowdebug/hotspot/outputdir/libjvm.so文件所在目录下找到符号表文件libjvm.gdb下文的命令将需要用到此文件。

步骤三:在GDB中加载OpenJDK

运行GDB,并在其中加载需要调试的进程,以openjdk为例:

gdb openjdk
(gdb) target remote :9091
(gdb) symbol-file $OPENJDK/build/linux-x86_64-server-slowdebug/hotspot/outputdir/libjvm.so

其中9091是本机的端口号,可以用java命令启动程序时设置,用来和GDB进行远程调试连接。

步骤四:使用GDB进行调试

在GDB中使用set breakpoint和continue命令对程序进行调试,例如,对于HelloWorld程序,可以在main函数处设断点,然后让程序继续运行。

(gdb) break main
(gdb) continue

程序在断点处停下后,可以使用如下命令查看程序的堆栈:

(gdb) bt

另外可以使用print命令输出变量的值,例如:

(gdb) print i
$1 = 123

以上就是使用GDB调试OpenJDK源码的完整步骤。

两条示例说明:

示例一:调试HashMap的实现过程

我们可以使用如下命令打开HashMap.java文件:

vim src/java.base/share/classes/java/util/HashMap.java 

然后可以在源码中加入一些打印信息,来定位到问题所在,例如,在put方法中添加打印语句:

System.out.println("adding key=" + key + ", value=" + value);

然后按照以上步骤进行调试,就可以看到具体异常产生的过程。

示例二:调试JVM的内存泄漏问题

我们可以使用如下命令开启JVM的内存泄漏检测工具:

jmap -histo:live <pid> | head -n 30

然后按照以上步骤进行调试,在GDB中查看堆栈信息,通过定位到具体的GC导致OOM等问题。

总之,OpenJDK源码调试需要结合具体问题和场景进行调整,但以上步骤和示例可供参考。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenJDK源码调试图文教程 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Sprint Boot @Profile使用方法详解

    Spring Boot的@Profile注解 在Spring Boot中,@Profile注解用于指定在不同的环境中使用不同的配置。通过使用@Profile注解,可以轻松地在不同的环境中切换配置,例如开发环境、测试环境和生产环境。 @Profile注解的使用方法 以下是@Profile注解的使用方法: 在配置类或配置方法上添加@Profile注解,并指定环境…

    Java 2023年5月5日
    00
  • java连接HBase,连接不上报错can not resolve问题及解决

    当我们使用Java连接HBase时,常常会遇到“can not resolve”这样的连接错误。这种错误通常是由于缺少Hadoop类库或者Hadoop类库版本不兼容的问题。 以下是解决这个问题的完整攻略: 确定Java运行环境和Hadoop版本号是否兼容。需要注意的是,在使用Java程序连接HBase时,需要将Hadoop类库和HBase类库一并打入程序中。…

    Java 2023年5月20日
    00
  • Java10新特性解读

    Java10新特性解读 Java10是Java语言的最新版本,自2018年3月正式发布以来,引入了不少新特性和改进。本文将详细解析Java10的新特性,并给出一些相应的示例。 局部变量类型推断 在Java10中,引入了一项新特性:局部变量类型推断。这意味着,当我们声明局部变量时,可以使用var关键字代替显式类型声明。编译器将根据变量的初始值来自动推断其类型。…

    Java 2023年5月19日
    00
  • 关于微信小程序实现云支付那些事儿

    下面我来详细讲解“关于微信小程序实现云支付那些事儿”的完整攻略。 1. 前置准备 要实现微信小程序的云支付,你需要确保已经完成以下前置准备: 注册了微信商户账号,并通过微信支付的认证审核; 在小程序中开通了支付权限。 如果以上准备工作已完成,接下来就可以开始和云服务对接了。 2. 云开发 微信小程序提供了一套完善的云开发体系,其中包含了云函数和数据库。我们可…

    Java 2023年5月23日
    00
  • JSP连接MySQL数据库详细步骤

    下面为您详细讲解JSP连接MySQL数据库的步骤。 1. 准备工作 在开始连接MySQL数据库之前,需要先进行准备工作: 安装MySQL数据库 下载MySQL的Java Connector(JDBC)驱动 2. 导入JDBC驱动包 将下载好的JDBC驱动包(.jar文件)导入到您的web项目中。您可以将该驱动包放置在WEB-INF/lib文件夹下,或者添加到…

    Java 2023年5月20日
    00
  • 使用java生成json时产生栈溢出错误问题及解决方案

    使用Java生成JSON时如果数据量较大、层次较深,容易出现栈溢出错误。本文将介绍栈溢出的原因及两种解决方案。 问题原因 生成JSON时,Java使用递归方式遍历数据结构,将其转换为JSON格式。如果数据量很大,层次较深,那么递归将产生很多层次的调用,导致栈空间不足,产生栈溢出错误。 解决方案1:调整栈空间大小 Java虚拟机中,栈大小默认为1MB,可通过设…

    Java 2023年5月20日
    00
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析是一篇旨在帮助Java开发者理解Java日志体系和集成jar包的文章。本文将围绕Java日志体系的问题、集成jar包的例子、分析Java日志框架的实现等多方面展开讲解。 一、Java日志体系的问题 在Java开发过程中,我们经常需要使用日志来帮助我们进行调试。但是,Java日志体系却十分混乱,不同的日志框架都有着自…

    Java 2023年5月19日
    00
  • JSP Session超时设置的实现方法

    JSP Session超时设置是指当用户在一段时间内没有活动,Session将被自动销毁。下面我将为你详细讲解JSP Session超时设置的实现方法: 步骤一:设置web.xml文件 在web.xml文件中设置Session超时时间,可以使用以下步骤: 在web.xml文件中加入以下代码: <session-config> <sessio…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部