编译openJDK
参考我的上一遍文章,在macOS上编译openJDK12
导入项目
如果想在Clion上编译和调试openJDK12,需要把它的CMakeLists.txt修好,什么是CMakeLists.txt?我们从头了解。
- gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。
- 当你的程序只有一个源文件时,直接就可以用gcc命令编译它。
- 但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
所以出现了make工具 - make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
- makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。
- makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。 - 这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
- 可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
- 到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。 - make是一个简单的通过文件时间戳控制自动过程、处理依赖关系的软件,这个自动过程可以是编译一个项目。
CLion 生产的 CMakeLists.txt 有问题,为了解决这个问题JetBrains官方提供了一种方法利用Compilation Database
什么是Compilation Database,编译数据库是一个名为compile_commands.json的JSON格式的文件,其中包含有关项目中每个编译单元的结构化数据。
生成Compilation Database
在openjdk的根目录执行
make CONF=macosx-x86_64-server-slowdebug compile-commands
执行完该命令,就会在 ${source_root}/build/macosx-x86_64-server-slowdebug 下生成 compile_commands.json 文件。
配置Toolchains
这一步Clion会自动从系统中找到toolchains并填充。
import
通过File->open功能选中我们在生成Compilation Database那一步生成的compile_commands.json文件
${source_root}/build/macosx-x86_64-server-slowdebug/compile_commands.json
选择As a project打开,这样就导入了 Compilation Database 文件,接下来 CLion 开始进行索引。
reload
这个时候会发现,项目的根路径是不对的,需要改变项目的根路径到${source_root},也就是你编译openjdk12的根路径
通过Tools -> Compilation Database -> Change Project Root 功能,选中openjdk12源码的根目录,改变完根目录之后,通过Tools -> Compilation Database -> Reload Compilation Database Project重新加载一次
Debug
build配置
通过Preferences --> Build, Exceution, Deployment --> Custom Build Targets 配置构建目标,选择build后面的…打开External Tools窗口,然后选择+到Create Tool窗口,添加两个tool,一个make,一个make clean。
下图是make
- Name和description可以自己随便填写,写的是make macosx-x86_64-server-slowdebug
- Program写的make 参数是CONF=macosx-x86_64-server-slowdebug
- Working directory选择openJDK12的根目录
下图是clean
- Name和description可以自己随便填写,写的是clean macosx-x86_64-server-slowdebug
- Program写的make 参数是 macosx-x86_64-server-slowdebug clean
- Working directory选择openJDK12的根目录
通过这两个配置每次构建之前都会重新编译我们的 jdk, 修改 jvm 代码之后可以直接进行重新调试。
debug配置
选择Add configuration->±>Customer Build Application
Executable:选择 ${source_root}/build/macosx-x86_64-server-slowdebug/jdk/bin/java, 或者其它你想调试的文件,比如 javac
Program arguments:上面java的话,这里可以写个-version
忽略SIGEGV和SIGBUS信号
在 ${source_root}/src/java.base/share/native/libjli/java.c 的 406 行打断点
点击 Debug, 然后 F9 放掉,会遇到下面这个问题
由于我们使用的 LLDB 进行 debug 的,所以在进入第一个断点的时候在 LLDB 下执行以下命令忽略SIGEGV和SIGBUS信号可以避免此类问题
pro hand -p true -s false SIGSEGV SIGBUS
每次 debug 的时候都要输入这么一句就很麻烦,可以生成一个脚本文件。在用户目录下面创建.lldbinit文件。
vim ~/.lldbinit
输入下面内容
br set -n main -o true -G true -C "pro hand -p true -s false SIGSEGV SIGBUS“
成功结果输出