美文网首页Java
脑袋抽筋了的我非要调试OpenJdk,且看他怎么虐我

脑袋抽筋了的我非要调试OpenJdk,且看他怎么虐我

作者: 马小莫QAQ | 来源:发表于2020-10-24 16:15 被阅读0次

前言

说来话长,最近又闲的无聊,在看JDK的源码,但是很多关键的地方都是native方法,这就导致需要在往深处看,也就是需要看openjdk源码了,但是c++代码又谈何容易,况且也不怎么会。

但是想来想去,决定还是要研究一下的,在以前的文章中已经编译过了openjdk11,虽然过程坎坷,但也是成功了,那么接下来就是导入openjdk源码到ide中,在下面会以clion作为示例,clion下载安装就不说了。

激动的心,颤抖的手,Deepin下成功编译OpenJdk11!!!

光这导入就花了我1天,毕竟openjdk很复杂,而且参考的文章有的说只导入hotspot目录,有的说导入openjdk\src目录,还有的说要导入根目录,导来导去,差点没放弃,但是放弃这1天就浪费了,所以瞎搞了一顿也不知道算不算成功,反正能正常调试了。

后面会使用到编译好的java程序(指的是bin下面的java),所以必须先编译openjdk。

导入openjdk

然后在"选择"对话框中选择openjdk的根目录,没错就是根目录,然后见到ok点ok,见到finish点finish。

导入后大概这个样子。

然后按照下面gif进行配置,注意Executable是选择编译好的java可执行程序,在bin目录下,也就你编译出来的,不能选在官网下载的。

记住如果在Before launch下有东西的话全部移除。

点击运行就能出来版本信息,这就是上步配置的-version参数起的作用。

运行java程序

但是需要运行我们写好的程序才行啊,不然图了个啥,所以先简单写一个:

publicclassMain{

    publicstaticvoidmain(String[] args){

        inta=12;

        intb=34;       

        System.out.println("a+b="+(a+b));

    }

    publicstaticvoidtest(String[] args){       

        System.out.println("test");

    }

}

我们知道java的程序是从main方法开始的,但是能不能不从main开始,当然可以,就需要我们修改openjdk源码,上面的test方法稍后会充当main方法运行。

先进行编译。

然后重新配置一下启动参数。

再次运行。

上面说了,我们能不能不从main开始,当然可以,回到openjdk源码,找到java.c文件,定位到JavaMain方法下,里面有一段是获取main方法的方法id,接着后面会调用这个方法,我们只需要修改GetStaticMethodID参数中的"main"即可,然后重新编译,这次编译只需要执行make就行,而且速度很快。

关于([Ljava/lang/String;)V的意思在以前分析class文件格式的时候也说过了,代表是一个String数组,并且方法是无返回值的。

恕我直言,这可能是你见过最详细的class文件结构分析

int JNICALL

JavaMain(void * _args){

mainID=(*env)->GetStaticMethodID(env, mainClass,"main","([Ljava/lang/String;)V"); 

(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

}

再次运行,可以看到,这次没执行main方法,而是执行了test方法。

剩下就是打断点进行调试,比如线程的start0方法,最终会调用操作系统的api启动线程,我们可以从中进行断点调试。

相关文章

  • 脑袋抽筋了的我非要调试OpenJdk,且看他怎么虐我

    前言 说来话长,最近又闲的无聊,在看JDK的源码,但是很多关键的地方都是native方法,这就导致需要在往深处看,...

  • OpenJDK调试

    https://segmentfault.com/a/1190000005082098

  • OpenJDK GDB调试

    共享库 该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。debug目录主要是一些jvm...

  • 我的抽筋消失了

    谈到腿抽筋,那个难受劲真无法形容。我最长一次腿抽筋,持续时间大约在五分绅,不仅浑身是虚汗,而且中间还产生过...

  • Java虚拟机(JVM源码):搭建OpenJDK(10)源码调试

    Java虚拟机(JVM源码):搭建OpenJDK(10)源码调试环境

  • 我是怎么了,脑袋空空的

    有时候感觉灵感饱满,连续几日笔耕不辍,写的文档里满满的。 可有时候会感觉灵感枯竭,不知道写点什么,脑袋里面空空的,...

  • OpenJDK Eclipse调试设置

    Main设置 参数设置 Eclipse环境变量 断点 hotspot/src/share/vm/runtime/t...

  • 我的脑袋502了

    本篇纯粹是为了记录一段今天我个人的意识片段,打开的好友请不要往下看了。 如果非要看,你就当看了一篇意识流微型小说....

  • 铠甲是你,软肋也是你

    我没有铠甲也没有软肋。如果非要抽筋扒皮,你会看到我心底的铠甲是你,软肋也是你。

  • 请为我点赞

    晚上睡觉,突然小腿抽筋,我不禁叫了起来!小女看到了,急忙问:妈妈怎么了? 我告诉她脚抽筋了,疼,医生说我要常按按小...

网友评论

    本文标题:脑袋抽筋了的我非要调试OpenJdk,且看他怎么虐我

    本文链接:https://www.haomeiwen.com/subject/uetwmktx.html