专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
芋道源码  ·  Cloudflare ... ·  21 小时前  
Java编程精选  ·  WebSocket 的 6 ... ·  昨天  
芋道源码  ·  Hutool中的这些工具类,太实用了! ·  昨天  
芋道源码  ·  某公司新招了个牛逼的架构师后... ·  3 天前  
51好读  ›  专栏  ›  ImportNew

编绎调试 HotSpot JVM 及在 Eclipse 里调试

ImportNew  · 公众号  · Java  · 2017-01-28 22:40

正文

(点击 上方公众号 ,可快速关注)


来源:hengyunabc,

blog.csdn.net/hengyunabc/article/details/16912775

如有好文章投稿,请点击 → 这里了解详情


编绎整个OpenJDK要很久,而且有很多东西是不需要的。研究HotSpot的话,其实只要下HotSpot部分的代码就可以了。


下面简单记录下编绎调试HotSpot一些步骤。


一、编绎


进入hotsopt的make目录下:


cd code/cpp/openjdk/hotspot/make/


用make help可以看到有很多有用的信息。当然查看Makefile文件,里面也有很多有用的注释。


make help会输出当前的一些环境变量的设置,如果不对,自然编绎不过去。


设置环境变量:


unset JAVA_HOME

export ARCH_DATA_MODEL=64

export JDK_IMPORT_PATH=/usr/lib/jvm/java-7-oracle

export ALT_BOOTDIR=/usr/lib/jvm/java-7-oracle

export ZIP_DEBUGINFO_FILES=0                      //这个貌似不起作用。。这些变量的定义貌似都在def.make文件里。还有一个这样的参数:FULL_DEBUG_SYMBOLS


用make all_beug来编绎。


编绎后好,到目录下openjdk/hotspot/build/Linux/linux_amd64_compiler2/jvmg,执行 unzip libjvm.diz,解压得到调试信息文件。


这个算是个坑,默认情况下,会压缩调试信息文件,这样用gdb调试时,就会出现下面的提示:


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 的程序。


+ 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的了:


init_gdb() {

# Create a gdb script in case we should run inside gdb







请到「今天看啥」查看全文