脑袋抽筋了的我非要调试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


相关文章
|
17天前
|
缓存 分布式计算 算法
码农死磕这份Java高级开发文档,成功'挤'进一线大厂,这也太强了吧
拿到一份offer比什么都重要,所以笔者专门花了近一个月的时间整理好了一份专门为Java面试而生的总结,注意的是笔者仅仅对面试技术方面的题目进行的总结,至于如何去和面试官去聊,怎么聊,聊得嗨,这里笔者就不谈了,因为这方面并不是笔者擅长的。
|
17天前
|
算法 程序员
10年老程序员告诉大家什么时候该写什么样的代码
10年老程序员告诉大家什么时候该写什么样的代码
17 0
|
17天前
|
前端开发 JavaScript Java
童年回忆——捕鱼达人(内含源码inscode一键运行)
童年回忆——捕鱼达人(内含源码inscode一键运行)
|
8月前
|
安全 NoSQL 程序员
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
我就算跳出去死外边也不会学【实用调试技巧/程序员内功修炼】
26 1
|
消息中间件 JavaScript 小程序
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
以为很熟悉 CountDownLatch,万万没想到在生产环境翻车了.....
|
算法 NoSQL API
到底该不该看源码(懂这三点儿就够了)
1、不要为了看源码而看源码 2、代码积累到一定程度,遇到问题自然就去查源码了,然后你就看懂了 3、两年内不要刻意去看源码,可以点开简单了解一下就行,前两年疯狂做项目就行了,后期项目做的多了,你自己就会有疑问,每次写代码就会问自己为什么要这样写?底层的原理是什么?很自觉的带着问题就去看源码了,如果你没有这样的疑问,那说明你也不适合去看源码了,写写业务代码,了了一生
151 0
|
Java
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
102 0
Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了
|
JavaScript 前端开发 程序员
巧用NodeJs帮老板解决个人需求!老板娘直呼:"牛!niu!🐂!"
大家好,我是HoMeTown 继上次用Js+Css给Boss秀完肌肉💪🏻,打出组合拳之后,(#敢在我工位装摄像头?吃我一套JS ➕ CSS组合拳!!👊🏻),今天是老板奖励我连续工作的第7/31天,不过就在今天,这个糟糕的事情终于赢来了新的转机,老板有了一个大不大,小不小的个人需求想让我看能不能写一段脚本,帮他度过难关,听完之后,我觉得是时候拿回作为程序员的尊严!展示一把真正的肌肉💪🏻了(破音~~~!)。
136 0
|
设计模式 架构师 算法
程序人生 - 程序员:伤不起的30岁
程序人生 - 程序员:伤不起的30岁
103 0
|
程序员 区块链 Python
Python帮助万千程序员远离猝死悲剧
既然他人不关心程序员,我们只能学会自我关怀了。今天我们就用Python来帮助万千程序员远离猝死!那么,今天我们用Python开发一个久坐提醒小工具,让每个程序员都能合理休息,定时起身走动走动,远离猝死危害!
168 0