之前的文章在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命令,如下表所示。
命令 |
描述 |
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目录。命令如下:
tar -zxvf eclipse-java-neon-3-linux-gtk-x86_64.tar.gz
切换到eclipse目录后,运行如下命令启动Eclipse。命令如下:
./eclipse &
启动Eclipse后,单击help菜单项,选择Eclipse Marketplace选项后,弹出Eclipse Marketplace对话框,搜索"c++"找到Eclipse C++ IDE..安装。安装完成后就可以创建及导入C/C++项目到Eclipse中了。
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文本框中输入虚拟机运行时的参数,这里运行之前的实例,具体参数如下:
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进行保存。
相关文章的链接如下:
1、在Ubuntu 16.04上编译OpenJDK8的源代码
关注公众号,有HotSpot源码剖析系列文章!