之前的文章在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进行保存。  

关注个人博客www.classloading.com或公众号,有HotSpot源码剖析系列文章!

调试HotSpot源代码的更多相关文章

  1. 调试HotSpot源代码(配视频)

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

  2. 在ASP.NET 5项目中使用和调试外部源代码包

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于在ASP.NET 5中,项目依赖都是通过"包"来引用,所以使用 ...

  3. 调试 ms 源代码

    如果需要调试 WPF 源代码或框架源代码,那么需要使用 DotPeek. 首先需要下载 dotPeek ,可以到官网下载 dotPeek: Free .NET Decompiler & Ass ...

  4. 调试Java源代码时变量的值无法追踪怎么办?

    问题:调试Java源代码时,只能看到源代码,却无法查看源代码中的变量的即时值 原因:jre为了节省空间,在打包时去掉了class文件中的调试信息. 思路:使用jdk里的src.zip源码重新编译生成完 ...

  5. C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案

    C#调试含有源代码的动态链接库遇见there is no source code available for the current location提示时的解决方案: 1.首先试最常规的方法:Cle ...

  6. 编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤

    编绎整个OpenJDK要很久,而且有很多东西是不需要的.研究HotSpot的话,其实只要下HotSpot部分的代码就可以了. 下面简单记录下编绎调试HotSpot一些步骤. 一.编绎 进入hotsop ...

  7. 调试 Hadoop 源代码

    环境是 64bit Ubuntu 14.04 系统, jdk 1.7 以及 Eclipse Mars (4.5) 这里介绍两种调试 Hadoop 源代码的方法: 利用 Eclipse 远程调试工具和打 ...

  8. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  9. 调试JDK源代码-一步一步看HashMap怎么Hash和扩容

    调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...

随机推荐

  1. python—列表,元组,字典

    ——列表:(中括号括起来:逗号分隔每个元素:列表中的元素可以是数字,字符串,列表,布尔值等等) (列表元素可以被修改)  list(类)    (有序的) [1]索引取值:切片取值:for循环:whi ...

  2. gitee+picgo搭建个人博客图床

    gitee+picgo搭建个人博客图床 准备 首先需要去码云注册一个账号,并新建一个仓库.接着下载PicGO并安装好. 过程 点击左下方的插件设置. image 在搜索框中输入gitee搜索插件,安装 ...

  3. 2 个步骤为 VSCode 配置工程头文件路径!

    我用 VSCode 来 Coding,这个编辑器需要自己配置头文件路径,就是自动建立一个 c_cpp_properties.json 文件来管理头文件路径,然后需要用哪些库就手动加上即可,方法很简单, ...

  4. protected关键字对父子成员变量的影响

    include<iostream> #include<string> using namespace std; class parent{ protected: int mv; ...

  5. java.net.URISyntaxException 问题解决

    先上代码: Properties pro = PropertyUtil.getPropertiesInfo("xxx.properties"); String url = pro. ...

  6. Lombok介绍和使用

    1 Lombok背景介绍 官方介绍如下: Project Lombok makes java a spicier language by adding 'handlers' that know how ...

  7. 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?

    题目: 现在有1000瓶药水,其中一瓶有毒,一只老鼠喝了在24h后会准时死亡,药水无色无味,如何用最少的老鼠在24h内找出毒药? 分析: 时间限制为24h,说明我们只有一次喂老鼠的机会,需要一波找出来 ...

  8. flink实时数仓从入门到实战

    第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...

  9. (五)POI-设置单元格的对齐方式

    原文链接:https://blog.csdn.net/class157/article/details/92817149 package com.java.poi; import org.apache ...

  10. sourcetree 安装破解注册方法

    1.下载sourcetree安装包 2.点击安装到下图步骤 3.在网盘中下载accounts.json  文件,( 链接:https://pan.baidu.com/s/1tJd_xCh-B-oOwd ...