调试HotSpot源代码(配视频)

调试HotSpot源代码(配视频)

本文将详细介绍在Ubuntu16.04 LTS上对OpenJDK8进行编译,为了方便大家快速搭建起OpenJDK8的调试开发环境,我还录制了对应的视频放到了B站上,大家可以参考。 

视频地址:https://space.bilibili.com/27533329 

下面我们开始环境的搭建过程。 

之前的文章在Ubuntu 16.04上编译OpenJDK8的源代码 已经介绍过在Ubuntu上编译OpenJDK8的源代码,这一篇将介绍在Ubuntu上调试OpenJDK8源代码的2种方式。 

在Linux上常用GDB调试C/C++源代码。使用GDB运行如上实例生成的Class文件,具体命令如下:

gdb --args ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test

进入GDB后,输入如下命令: 

break java.c:JavaMain
continue

第一条命令表示在源文件java.c的JavaMain函数入口处设置断点;第二条命令表示让中断的程序继续运行,直到运行完程序后退出GDB,并在终端打印”Hello World!“信息。
下面介绍一些常用的GDB命令,如下表所示。 

命令

描述

backtrace(bt)

查看各级函数调用及参数

finish

连续运行到当前函数返回为止,然后停下来等待命令

frame(f) n

从当前栈帧移到到n栈帧

info(i) locals

查看当前栈帧局部变量的值

list(l)

列出源代码,接着上次的位置往下列,每次列10行ll

list(l)  行号

列出从指定行开始的源代码

list(l) 函数名

列出指定的函数的源代码

next(n)

执行下一行语句

print(p)

打印表达式的值,通过表达式可以修改变量的值或者调用函数

quit(q)

退出gdb调试环境

step(s)

执行下一行语句,如果有函数调用则进入到函数中

start

开始执行程序,停在main函数第一行语句前面等待命令

break(b) 行号

在指定行设置断点

break 函数名

在指定函数的开头设置断点

break … if …

设置条件断点

continue(c)

从当前位置开始连续运行程序

delete breakpoints 断点号

删除断点

display 变量名

跟踪查看指定变量名的变量,每次停下来都显示它的值

disable breakpoints 断点号

禁用断点

enable 断点号

启用断点

info(i) breakpoints

查看当前设置了哪些断点

run(r)

从头开始连续运行程序

undisplay 跟踪显示号

取消跟踪显示

watch

设置观察点

info(i) watchpoints

查看当前设置了哪些观察点

x

从某个位置开始打印存储单元的内容,全部当成字节来看,

而不区分哪个字节属于哪个变量

 

1.下载安装Eclipse并安装C/C++插件

在 https://www.eclipse.org/downloads 网站上下载支持Ubuntu 64位版本操作系统的Eclipse,笔者下载的压缩包名称为eclipse-java-neon-3-linux-gtk-x86_64.tar.gz,通过如下命令解压后得到eclipse目录。命令如下:​

tar -zxvf eclipse-java-neon-3-linux-gtk-x86_64.tar.gz

在运行Eclispe之前还需要配置环境变量,如下: 

export JAVA_HOME=/home/mazhi/workspace/jdk1.7.0_72
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib在

切换到eclipse目录后,运行如下命令启动Eclipse。命令如下: 

./eclipse &

启动Eclipse后,单击help菜单项,选择Eclipse Marketplace选项后,弹出Eclipse Marketplace对话框,搜索”c++”找到Eclipse C++ IDE..安装。安装完成后就可以创建及导入C/C++项目到Eclipse中了。

或者下载专门开发C/C++的Eclipse集成环境,例如笔者下载的压缩包名称为eclipse-cpp-helios-SR1-linux-gtk-x86_64.tar.gz,解压后以类似的方式启动。不过在启动Eclipse之前,需要指定JDK路径,编译安装目录下的eclipse.ini文件,如下: 

openFile
-vm
/home/mazhi/workspace/jdk1.7.0_72/bin
-vmargs
-Dosgi.requiredJavaVersion=1.5
-XX:MaxPermSize=256m
-Xms40m
-Xmx384m

在openFile和-vmargs之间配置-vm和/home/mazhi/workspace/jdk1.7.0_72/bin即可。不过通过eclipse-java-neon-3-linux-gtk-x86_64.tar.gz压缩包安装的Eclispe需要jdk1.8版本,只需要换个1.8的版本即可。

2.导入HotSpot源代码

单击help菜单项,选择new->Other…后,在弹出的New对话框中选择Makefile Project with Existing Code,然后单击“Next”,添写相关的信息,如下图所示。​

<span>调试HotSpot源代码(配视频)</span> 

设置完成后单击“Finish”即可。

3.配置及调试源代码

在HotSpot项目上右击,选择Debug As -> Debug Configurations…,在弹出的Debug Configurations对话框中,选择C/C++ Application后,右击,在弹出的菜单中选择New Configuration后,在右侧的Main选项卡中配置相关的信息,如下图所示。

<span>调试HotSpot源代码(配视频)</span>

 切换到Arguments选项卡, 在Program arguments文本框中输入虚拟机运行时的参数,这里运行之前的实例,具体参数如下:

com.test/Test

切换到Environment选项卡, 添加变量:​  

JAVA_HOME=/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/
CLASSPATH=.:/home/mazhi/workspace/project/bin

CLASSPATH指定Test.class文件所在的目录。设置完相关信息后,单击Apply进行保存。  

https://code.visualstudio.com官网上下载Visual Studio Code,笔者下载的是”code_1.51.0-1604600753_amd64.deb”版本。安装完成后通过单击File -> OpenFolder选项,选中hotspot文件夹,点击左侧导航栏中的Run(Ctrl+Shift+D)图标切换到对应选项栏,单击add configuration选项后选中c/c++: (gdb) 启动,修改lauch.json文件,所有的配置都通过这个文件完成,笔者的配置文件详细内容如下: 

{
    "version": "0.2.0",
    "configurations": [        
        {
            "name": "HotSpot Linux Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java",
            "args": ["com.test/Test"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [
                {"name":"JAVA_HOME","value":"/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk"},
                {"name":"CLASSPATH","value":".:/home/mazhi/workspace/projectjava/projectjava01/bin"}
            ],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

主要关注”configurations”中的”program”、”args”、”environment”配置项,这几个其实在Eclipse中都指定过,”program”就是指定C/C++应用程序的位置,而”environment”就是配置的环境变量,”args”是为虚拟机运行配置参数。 

可以在hotspot/src/share/vm/prims/jni.cpp文件下的JNI_CreateJavaVM()函数上打个断点,然后在run(Ctrl+Shift+D)选项栏中选中”HotSpot Linux Debug”进行调试即可。

推荐文章: 

1、在Ubuntu 16.04上编译OpenJDK8的源代码(配视频) 

搭建过程中如果有问题可直接评论留言或加作者微信mazhimazh。

作者持续维护的个人博客  classloading.com

关注公众号,有HotSpot源码剖析系列文章!

<span>调试HotSpot源代码(配视频)</span>   

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql 8.0 修改密码_一键清除锁屏密码

    mysql 8.0 修改密码_一键清除锁屏密码因为装的时间久了,密码不记得了,又不想重新装,怎么办呢?在程序管理器中将mysql服务停止,也就是直接停止mysqld。用mysql–shared-memory–skip-grant-tables启动mysql,但是这里发生错误:原因是没有设置数据路径,这里加上数据路径,并回车,启动mysqld。另启动一个cmd,执行mysql命令,启动客户端,输入FLUSHPRIVILEG…

    2022年10月15日
    2
  • Java打印带边框的乘法口诀表_Java 面试 – 打印九九乘法口诀表

    Java打印带边框的乘法口诀表_Java 面试 – 打印九九乘法口诀表在Java面试过程中,面试者经常会被要求手写代码或上机操作。一般来说,手写代码或上机操作,主要还是考察面试者的分析问题和解决问题的能力。打印九九乘法口诀无疑是非常基础的,那么如何实现呢?首先我们先来分析一下九九乘法口诀表内在的规律,然后再根据分析结果,选择适合的解决方案。九九乘法口诀表:1*1=11*2=22*2=41*3=32*3=63*3=91…

    2022年7月15日
    18
  • 如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]

    如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]如何从tushare获取股票历史数据写入自己的MySQL数据库点击https://tushare.pro/register?reg=414428,免费注册后,即可获取tushare的token,就可以下载金融数据了。1.tushare推荐方法如果你需要读取全部股票的历史数据,tushare给的建议是按“天”获取。因为tushareapi限制一次获取最高5000条记录,而A股市场目前有3000多只股票,提取一次数据不会超过api的限制记录数。代码如下:importtus

    2022年6月24日
    102
  • STL库 总览_stl库函数

    STL库 总览_stl库函数  STL库1泛型程序设计2STL标准模板库2.1STL库的基本组件2.1.1STL基本组件—-容器2.1.2STL基本组件—-迭代器2.1.3STL基本组件—-函数对象2.1.4STL基本组件—-算法3迭代器4容器的基本功能与分类4.1顺序容器  1泛型程序设计  泛型程序设计就是时候,将程序设计的尽量的通用。STL标准库就是泛型程序设计的一个很好的范例。  ◇编写不依赖具体数据类型的程序;  ◇将算法从特定的数据结构中抽象出来,成为通用的;  ◇

    2022年10月10日
    3
  • 使用DataBaseMetaData得到表的主键

    使用DataBaseMetaData得到表的主键try{   Stringuser=”ahcwtest”;   Stringpassword=”ahcwtest”;   Stringdriver=”oracle.jdbc.driver.OracleDriver”;   Stringurl=”jdbc:oracle:thin:@192.168.71.17:1521:orcl”;   Stringsql=”SEL

    2022年6月20日
    29
  • VM虚拟机安装教程_ghost手动安装教程

    VM虚拟机安装教程_ghost手动安装教程VMware最新官方下载与安装目录一、VMware官方下载二、虚拟机安装一、VMware官方下载首先我们访问官网地址https://www.vmware.com/cn.html注意:没有账号必须先注册才能下载。注册页面https://my.vmware.com/cn/web/vmware/registration注册完账号后进行以下步骤:如图,选择下载专…

    2022年10月1日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号