本文将详细介绍在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文件,具体命令如下:
代码语言:javascript复制gdb --args ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test
进入GDB后,输入如下命令:
代码语言:javascript复制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 | 从某个位置开始打印存储单元的内容,全部当成字节来看, 而不区分哪个字节属于哪个变量 |
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目录。命令如下:
代码语言:javascript复制tar -zxvf eclipse-java-neon-3-linux-gtk-x86_64.tar.gz
在运行Eclispe之前还需要配置环境变量,如下:
代码语言:javascript复制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。命令如下:
代码语言:javascript复制./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文件,如下:
代码语言:javascript复制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”,添写相关的信息,如下图所示。
设置完成后单击“Finish”即可。
3.配置及调试源代码
在HotSpot项目上右击,选择Debug As -> Debug Configurations…,在弹出的Debug Configurations对话框中,选择C/C Application后,右击,在弹出的菜单中选择New Configuration后,在右侧的Main选项卡中配置相关的信息,如下图所示。
切换到Arguments选项卡, 在Program arguments文本框中输入虚拟机运行时的参数,这里运行之前的实例,具体参数如下:
代码语言:javascript复制com.test/Test
切换到Environment选项卡, 添加变量:
代码语言:javascript复制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文件,所有的配置都通过这个文件完成,笔者的配置文件详细内容如下:
代码语言:javascript复制{
"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”进行调试即可。