5

认识HotSpot虚拟机第2篇-调试HotSpot源代码(配视频)

 3 years ago
source link: https://club.perfma.com/article/2395294
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
鸠摩3天前

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

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

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

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

1、GDB调试源代码

在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命令,如下表所示。
image.png
image.png

2、在Eclipse中调试源代码

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”,添写相关的信息,如下图所示。​
image.png
设置完成后单击“Finish”即可。

3.配置及调试源代码

在HotSpot项目上右击,选择Debug As -> Debug Configurations…,在弹出的Debug Configurations对话框中,选择C/C++ Application后,右击,在弹出的菜单中选择New Configuration后,在右侧的Main选项卡中配置相关的信息,如下图所示。
image.png
切换到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进行保存。

3、在Visual Studio Code中调试源代码

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"进行调试即可。
搭建过程中如果有问题可直接评论留言或加作者微信mazhimazh。
作者持续维护的个人博客 classloading.com


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK