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

简介: 前言说来话长,最近又闲的无聊,在看JDK的源码,但是很多关键的地方都是native方法,这就导致需要在往深处看,也就是需要看openjdk源码了,但是c++代码又谈何容易,况且也不怎么会。但是想来想去,决定还是要研究一下的,在以前的文章中已经编译过了openjdk11,虽然过程坎坷,但也是成功了,那么接下来就是导入openjdk源码到ide中,在下面会以clion作为示例,clion下载安装就不说了。激动的心,颤抖的手,Deepin下成功编译OpenJdk11!!!光这导入就花了我1天,毕竟openjdk很复杂,而且参考的文章有的说只导入hotspot目录,有的说导入openjd

前言


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

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

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

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

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

分割线.jpg

导入openjdk


image.png

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

image.png

导入后大概这个样子。

image.png

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

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

image.png

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

image.png

运行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方法运行。

先进行编译。

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

image.png

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

image.png

再次运行。

image.png

上面说了,我们能不能不从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方法。

image.png

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

image.png


相关文章
|
7月前
|
缓存 分布式计算 算法
码农死磕这份Java高级开发文档,成功'挤'进一线大厂,这也太强了吧
拿到一份offer比什么都重要,所以笔者专门花了近一个月的时间整理好了一份专门为Java面试而生的总结,注意的是笔者仅仅对面试技术方面的题目进行的总结,至于如何去和面试官去聊,怎么聊,聊得嗨,这里笔者就不谈了,因为这方面并不是笔者擅长的。
|
Go
腥风血雨中,这招救了我的代码!
腥风血雨中,这招救了我的代码!
64 0
|
安全 NoSQL 程序员
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
41 1
|
SQL 人工智能 Java
程序员:你见过哪些要命的奇葩代码?
程序员:你见过哪些要命的奇葩代码?
121 0
|
消息中间件 JavaScript 小程序
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
|
Java
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
140 0
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
|
SQL 存储 监控
聊聊那些年遇到过的奇葩代码
无论是开发新需求还是维护旧平台,在工作的过程中我们都会接触到各种样式的代码,有时候会碰到一些优秀的代码心中不免肃然起敬,但是更多的时候我们会遇到很多奇葩代码,有的时候骂骂咧咧的吐槽一段奇葩代码后定睛一看作者,居然是几个月以前自己的写的,心中难免浮现曹操的那句名言:不可能,绝对不可能。
聊聊那些年遇到过的奇葩代码
|
小程序 Linux 网络安全
崎岖坎坷小程序
0基础大三学生的小程序摸索之路。
崎岖坎坷小程序
|
程序员 区块链 Python
Python帮助万千程序员远离猝死悲剧
既然他人不关心程序员,我们只能学会自我关怀了。今天我们就用Python来帮助万千程序员远离猝死!那么,今天我们用Python开发一个久坐提醒小工具,让每个程序员都能合理休息,定时起身走动走动,远离猝死危害!
205 0
|
设计模式 架构师 算法
程序人生 - 程序员:伤不起的30岁
程序人生 - 程序员:伤不起的30岁
127 0

相关实验场景

更多