在masOS上用Clion编译和调试openJDK12(利用Compilation Database生成CMakeLists.txt)

编译openJDK

    参考我的上一遍文章,在macOS上编译openJDK12

导入项目

    如果想在Clion上编译和调试openJDK12,需要把它的CMakeLists.txt修好,什么是CMakeLists.txt?我们从头了解。

  1. gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。
  2. 当你的程序只有一个源文件时,直接就可以用gcc命令编译它。
  3. 但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大
    所以出现了make工具
  4. make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。
  5. makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。
  6. makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
    makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。
  7. 这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
  8. 可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。
  9. 到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。
    cmake是make maker,生成各种可以直接控制编译过程的控制器的配置文件,比如makefile、各种IDE的配置文件。
  10. 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“

成功结果输出
在这里插入图片描述

参考资料

THE END
分享
二维码
< <上一篇
下一篇>>