环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的jvm信息

关于环境:

本文中的实战都是在docker容器中进行的,容器的出处请参照《在docker上编译openjdk8》一文,里面详细的说明了如何构造镜像和启动容器。

在上一篇文章《修改,编译,GDB调试openjdk8源码(docker环境下)》中,我们分析了虚拟机启动的代码,在阅读JLI_Launch函数的时候,发现调用了InitLauncher函数,如下图红框部分:

这个InitLauncher函数有何作用?展开后发现里面调用了JLI_SetTraceLauncher函数,而JLI_SetTraceLauncher函数的源码如下:

很简单,如果环境变量”_JAVA_LAUNCHER_DEBUG”的值不等于0,就将_launcher_debug的值设置为1。

_launcher_debug有什么用呢?我们看看/usr/local/openjdk/jdk/src/share/bin/jli_util.c文件中的JLI_TraceLauncher方法:

原来如此,只要_launcher_debug等于1,JLI_TraceLauncher方法在执行的时候就不会提前返回,而是把入参的信息做格式化再打印出来,在openjdk目录下全局搜索JLI_TraceLauncher函数,发现调用的地方还真不少呢,如下图,9个文件里都有调用:

在容器中执行vi /etc/profile命令,在内容的最底部新增两行脚本:

_JAVA_LAUNCHER_DEBUG=1
export _JAVA_LAUNCHER_DEBUG

如下图:

在执行以下命令使配置生效:

source /etc/profile

现在回到目录/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin,执行./java -version,会发现输出的内容比以前丰富了很多,如下图,红框内是修改/etc/profile之前的输出,其他的全是新增的内容,这些新增的内容都是通过JLI_TraceLauncher输出的,以前由于没有环境变量_JAVA_LAUNCHER_DEBUG导致不输出,现在可以全部看到了:

虽然已通过设置环境变量_JAVA_LAUNCHER_DEBUG看到了更多的信息,但似乎意犹未尽,不如我们改一点openjdk源码,亲自调用一下JLI_TraceLauncher函数试试。

首先我们修改/usr/local/openjdk/jdk/src/share/bin/java.c,在JavaMain函数中,找到下面这一行:

在上面红框位置的下面增加一行代码JLI_TraceLauncher(“static main method execute success (from boling_cavalry)”);

这样代码的意思是在class类的main函数执行完毕后,输出一段文本信息“static main method execute success (from boling_cavalry)”

修改后如下图:

现在回到/usr/local/openjdk目录下,执行以下两个命令开始编译openjdk源码:

./configure --with-debug-level=slowdebug
make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=OK CONF=linux-x86_64-normal-server-slowdebug

jdk构建成功后,我们新建一个类Hello.java,在此位置新建:/usr/local/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin,这个类很简单:

public class Hello{
        public static void main(String[] args){
                System.out.println("hello world!");
        }
}

在这个目录下执行./javac Hello.java生成Hello.class文件,再执行./java Hello,得到的输出如下:

红框中就是class中的输出以及我们修改openjdk源码添加的输出,达到我们的预期目的了,现在自定义的日志再加上上一章的GDB断点,可以帮助我们可以更好的阅读和实践openjdk源码,探索神秘的JVM。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的Python

Python文件处理 - 专题笔记文件简介文件基础操作文件属性及OS模块使用文件练习

任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。掌握文件的基本概念、基本操作,了解文件属性、 linux 系统的文件管理机制及os模块对...

3456
来自专栏北京马哥教育

【基础拾遗】编辑器之神-VIM

在这天地间,流传这两大神器的故事:据说Emacs是神的编辑器,而Vim是编辑器之神。正所谓,工欲善其事,必先利其器。今天就和大家分享一下关于编辑器之神Vim的传...

2725
来自专栏DannyHoo的专栏

升级Xcode8后控制台输出警告

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

812
来自专栏菩提树下的杨过

vs.net的调试小技巧之#define debug(适合新手)

大多数情况下,vs.net中我们可以用断点来解决调试问题,但有些时候也可能手动需要输出一些信息做为调试的参考,你是否有过调试完成以后,忘记删除某条输出语句的经历...

1819
来自专栏SpiritLing

windows设置本地域名解析

1、首先找到host文件:C:\Windows\System32\drivers\etc 2、打开host文件: 1 # Copyright (c) 1993...

2893
来自专栏java学习

Linux 基础命令(收藏大全)

如果你是初学者,或者是自学者!你可以加小编微信(xxf960326)!小编可以给你学习上,工作上的一些建议以及可以给你(免费)提供学习资料!最重要我们还可以交个...

783
来自专栏应兆康的专栏

每天一个Linux命令(1)—— ls

ls ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。 语法 ls(选项)(参数) ...

35510
来自专栏章鱼的慢慢技术路

一步步使用Code::Blocks进行设置断点调试程序

1553
来自专栏Jerry的SAP技术分享

一个JSON字符串和文件处理的命令行神器jq,windows和linux都可用

这个命令行神器的下载地址:https://stedolan.github.io/jq/#

622
来自专栏cs

linux 学习笔记七

来自实验楼的学习笔记,文字基本复制,粘贴。 ? 下载了一个录制gif图的软件,还不错 参考与:在Linux(Ubuntu)下超好用的录屏gif软件!!...

3275

扫码关注云+社区