JVM 反汇编动态运行代码

Java HotSpot(TM) Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: dontinline *GenericClass.*
Could not load hsdis-i386.so; library not loadable; PrintAssembly is disabled

 

//尝试 输出动态的反汇编Code时 ,提示上面的错误。 没有hsdir这个可加载的反汇编的插件(an externally loadable disassembler plugin) 。

对该插件的阐述如下

写道
Sun HotSpot需要一个反汇编插件才可以使用-XX:+PrintAssembly参数来打印JIT编译生成的代码。该插件有一组通用接口,本来是可以用任意反汇编器套个适配器就行。官方提供了一个现成的版本(hsdis)是基于gnu as的

 

 

对该插件的安装等详细参考 http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/9ad1548c6b63/src/share/tools/hsdis/README

 

安装过程中需要 binutils这个软件,这个软件版本至少是2.17 , 如果是编译为windows 平台下的dll 则版本至少是2.19。

    我采用了当前最新版本。下载地址:http://directory.fsf.org/project/binutils/

下载完加压在 build/目录下,目录结构如下图:


开始编译 ,提供的编译很几种,查看Makefile文件或者README文件可知如下几种:

1, make all

2, make both

3, make demo

4, make clean

(不解释,阴文你懂的)

我选择make all 。

第一编译,得到一个 Warning : 提醒没有安装makeinfo。然后出现该死的Error

OK,安装makeinfo

  // sudo apt-get install makeinfo

 

第二次编译 得到如下错误


没有找到 sysdep.h文件 。

// 查找

find -name sysdep.h

//output

./build/binutils/bfd/sysdep.h
./build/binutils/binutils/sysdep.h
./build/binutils/ld/sysdep.h
./build/binutils/opcodes/sysdep.h

 

而上面错误提示中编译时 头文件查找路径是

写道
-I/home/hyvi/下载/software-source/hotspot/src/share/tools/hsdis/build/binutils/include -I/bfd -Ibuild/linux-i586/bfd

 -I/bfd  这是根路径下啊!

 

查看Makefile 代码 121行。 

CPPFLAGS    += -I$(BINUTILSDIR)/include -I$(BINUTILS)/bfd -I$(TARGET_DIR)/bfd

 以及关于 BINUTILS 值

ifeq            ($(BINUTILS),)
# Pop all the way out of the workspace to look for binutils.
# ...You probably want to override this setting.
BINUTILSDIR = $(shell cd build/binutils;pwd)
else
BINUTILSDIR = $(shell cd $(BINUTILS);pwd)
endif

如果未指定 BINUTILS 的话,即 BINUTILS为空, BINUTILSDIR 为 build/binutils

而我编译的时候未指定 BINUTILS ,所以为空。 所以出现 “-I/bfd ”

 

纠正办法:

1,修改Makefile , (我使用)

-I$(BINUTILS)/bfd 

改成

-I$(BINUTILSDIR)/bfd 

 

2 ,编译的时候 加上 参数 BINUTILS = "build/binutils" (未测试)

 

第三次编译 ,通过。在 bulid/Linux-i586/目录下生成了 hsdis-i386.so

 

最后,安装.so文件了。方法有二 :

 

1, Copy  hsdis-i386.so 到 java虚拟机安装目录的 jre/lib/i386/client/ 或者 (或和) jre/lib/i386/server/ 下 (跟libjvm.so同一目录)。

 

2, 将 hsdis-i386.so 添加到 LD_LIBRARY_PATH 里。

   vim ~/.bashrc

// 最后一行添加

#HotSpot support hsdis 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:....(省略)hsdis/build/linux-i586

source ~/.bashrc 

 

测试 :

 

java -Xcomp -XX:CompileCommand=dontinline,*GenericClass.*
 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Z > comp.log
 

生成 comp.log , 里面6万多行。如果要做比较,只能用diff工具。

 

补上参考:

http://hllvm.group.iteye.com/group/topic/21769    X86 asm代码 是怎么才能看到?

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly  PrintAssembly使用

http://directory.fsf.org/project/binutils/    Binutils工具 

http://hllvm.group.iteye.com/group/topic/25910#183635  Java泛型的性能损耗

http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/  hsdis 工具

http://kenai.com/projects/base-hsdis/lists/dev/archive/2009-11/message/0  类似编译问题

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值