编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤
编绎整个OpenJDK要很久,而且有很多东西是不需要的。研究HotSpot的话,其实只要下HotSpot部分的代码就可以了。
下面简单记录下编绎调试HotSpot一些步骤。
一、编绎
进入hotsopt的make目录下:
|
1
|
cd code/cpp/openjdk/hotspot/make/ |
用make help可以看到有很多有用的信息。当然查看Makefile文件,里面也有很多有用的注释。
make help会输出当前的一些环境变量的设置,如果不对,自然编绎不过去。
设置环境变量:
|
1
2
3
4
5
|
unset JAVA_HOMEexport ARCH_DATA_MODEL=64export JDK_IMPORT_PATH=/usr/lib/jvm/java-7-oracleexport ALT_BOOTDIR=/usr/lib/jvm/java-7-oracleexport ZIP_DEBUGINFO_FILES=0 //这个貌似不起作用。。这些变量的定义貌似都在def.make文件里。还有一个这样的参数:FULL_DEBUG_SYMBOLS |
用make all_beug来编绎。
编绎后好,到目录下openjdk/hotspot/build/Linux/linux_amd64_compiler2/jvmg,执行 unzip libjvm.diz,解压得到调试信息文件。
这个算是个坑,默认情况下,会压缩调试信息文件,这样用gdb调试时,就会出现下面的提示:
|
1
|
no debugging symbols found |
从编绎的输出信息来看,是有一个ZIP_DEBUGINFO_FILES的参数,但是设置了环境变量却不起效。
二、调试
在 openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg 目录下,有一个hotspot的脚本,只要执行这个脚本,就可以启动Java进程了。
用 ./hotspot -gdb 就会自动进入gdb调试,并停在main函数入口。
后面还可以加一些jvm的启动参数等。
这个./hotsopt 脚本是怎么工作的?
用 sh -x ./hotspot 来查看这个脚本的执行过程,可以发现实际上是设置了 LD_LIBRARY_PATH的环境变量,再调用了一个./gamma 的程序。
|
1
2
3
4
5
6
7
8
9
10
|
+ LD_LIBRARY_PATH=/home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg:/usr/lib/jvm/java-7-oracle/jre/lib/amd64+ export LD_LIBRARY_PATH+ JPARMS= + LAUNCHER=/home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma+ [ ! -x /home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma ]+ GDBSRCDIR=/home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg+ cd /home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/../../..+ pwd+ BASEDIR=/home/hengyunabc/code/cpp/openjdk/hotspot/build+ LD_PRELOAD= exec /home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma |
实际上是通过设置LD_LIBRARY_PATH 环境变量,去优先加载编绎好的libjvm.so。hotsopt jvm的代码都编绎链接在libjvm.so这个文件里。
查看./hotspot里的这个函数init_gdb,就知道它是怎么启动并设置好gdb的了:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
init_gdb() {# Create a gdb script in case we should run inside gdb GDBSCR=/tmp/hsl.$$ rm -f $GDBSCR cat >>$GDBSCR <<EOFcd `pwd`handle SIGUSR1 nostop noprinthandle SIGUSR2 nostop noprintset args $JPARMSfile $LAUNCHERdirectory $GDBSRCDIR# Get us to a point where we can set breakpoints in libjvm.sobreak InitializeJVMrun# Stop in InitializeJVMdelete 1# We can now set breakpoints wherever we likeEOF} |
所以,其实也可以这样开始调试。
|
1
2
|
export LD_LIBRARY_PATH=/home/hengyunabc/code/cpp/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg:/usr/lib/jvm/java-7-Oracle/jre/lib/amd64gdb |
在gdb里执行file ./gamma,然后就可以调试了。
三、使用Eclipse来调试
尽管gdb功能强大,命令丰富,但是在查看调试的变量时,十分的不方便。特别是hotsopt里,很多东西都是用指针来存放的,有时要跳转好几层才能查看到想要的信息。
下载Eclipse的CDT版,新视觉影院6080或者安装CDT的插件。
导入Eclipse工程:
“File”, “Import”, “C/C++”, “Existing Code as Makefile Project”:

先择Linux GCC:

然后,就可以把项目导到Eclipse里了。会有很多错误提示,但是不影响我们的调试。
在Eclipse里调试:
首先,要设置要调试的文件的路径:

设置LD_LIBRARY_PATH:

然后就可以调试了。还有一个地方比较重要:
想在运行时输入gdb指令,可以在console view,在右边的下拉里,可以发现有一个gbd的console,还有一个gdb trace的console。
四、一些有用的东东
jvmg1目录下是O1优化下的,fastdebug目录下是O3优化的。
java 进程的main入口在:openjdk/hotspot/src/share/tools/launcher/java.c 文件里。
在gdb里,用info sharedlibrary 命令查看实际使用到的是哪些so文件。
用file命令来判断一个可执行文件,so是32位的还是64位的。
查看一个so文件是否包含调试信息,可以用readelf -S xxx.so 命令来查看是否有debug相关的段。这个方法不一定准确,因为调试信息有可能放在外部文件里。
编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤的更多相关文章
- windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)
最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...
- 怎么在eclipse里调试WebDriver的源代码(转)
当你看完WebDriver的工作原理这篇博客以后,是不是也跃跃欲试想印证文章里的理论是不是正确,想自己也看下webdriver的源代码,并且调试下,通过代码来更深入的了解WebDriver的工作原理. ...
- 怎么在eclipse里调试WebDriver的源代码
当你看完WebDriver的工作原理这篇博客以后,是不是也跃跃欲试想印证文章里的理论是不是正确,想自己也看下webdriver的源代码,并且调试下,通过代码来更深入的了解WebDriver的工作原理. ...
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- HotSpot JVM常用参数设置
转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...
- HotSpot JVM常用参数(选项)设置
本文讨论的选项是针对HotSpot虚拟机的. 1.选项分类及语法 HotspotJVM提供以下三大类选项: 1.1.标准选项 这类选项的功能是很稳定的,在后续版本中也不太会发生变化. 运行java或者 ...
- HotSpot JVM 常用配置设置
本文讨论的选项是针对HotSpot虚拟机的. 1.选项分类及语法 HotspotJVM提供以下三大类选项: 1.1.标准选项 这类选项的功能是很稳定的,在后续版本中也不太会发生变化. 运行java或者 ...
- JVM源码分析-JVM源码编译与调试
要分析JVM的源码,结合资料直接阅读是一种方式,但是遇到一些想不通的场景,必须要结合调试,查看执行路径以及参数具体的值,才能搞得明白.所以我们先来把JVM的源码进行编译,并能够使用GDB进行调试. 编 ...
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
随机推荐
- Ionic 2 中添加图表
有问题请加入马画藤群:181596813,也强烈欢迎各类建议和需求:Ionic 2 实例开发 今日更新新增章节——Ionic 2 中添加图表: Chart.js是一个在HTML5的<canvas ...
- Linux系统日志分析
Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 / ...
- Python3+Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记12(js操作应用:滚动条 日历 内嵌div)'''from ...
- NVM for Windows下载与安装
下载NVM for Windows https://github.com/coreybutler/nvm-windows/releases nvm-noinstall.zip: 这个是绿色免安装版本, ...
- 【TensorFlow入门完全指南】模型篇·最近邻模型
最近邻模型,更为常见的是k-最近邻模型,是一种常见的机器学习模型,原理如下: KNN算法的前提是存在一个样本的数据集,每一个样本都有自己的标签,表明自己的类型.现在有一个新的未知的数据,需要判断它的类 ...
- Memcached笔记之分布式算法
1.根据余数进行分散:离散度高,但是增加或者移除服务器的时候,缓存充足的代价非常大.添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而音像缓存的命中率. 2.Consistent ...
- jQuery如何获取选中单选按钮radio的值
使用jquery获取radio的值,最重要的是掌握jquery选择器的使用,在一个表单中我们通常是要获取被选中的那个radio项的值,所以要加checked来筛选,比如有以下的一些radio项: 1. ...
- c#中的自定义泛型类、泛型方法和泛型接口
泛型的产生其中一个原因就是为了解决原来集合类中元素的装箱和拆箱问题: 一.泛型类: /// <summary> /// 返回前台的消息 /// </summary> ...
- Bootstrap 页面标题(Page Header)
Bootstrap页面标题(PageHeader)是个不错功能,它会网页的标题的四周添加适当的间距,当一个网页中有多个标题并且每个标题之间需要添加一定适当的间距,使用页面标题是非常有用的.如果需要使用 ...
- Linux运维笔记--第三部
第三部 3. Linux系统文件重要知识初步讲解 # ls -lhi (i: inode,每个文件前的数字代表文件身份ID:h: human 人类可读) 显示:25091 -rw-r--r-- ...