准备
环境: Ubuntu, GCC(7.5), (JDK7)BOOT_JDK
Jdk8源码获取可以选择从Java官网获取,实在太慢,我这里选择从AdoptOpenJDK获取,从github下载zip文件包,解压,搞定.
编译
运行configure脚本.
根据后面的调试需求选择合适的参数.
具体参数可通过在jdk8u源码目录运行帮助命令获取.bash configure --help
为了后面获取更多的调试信息,我选择以下参数(我的代码放在jdk8u_zero目录)
$ cd jdk8u_zero
$ bash ./configure \
--with-boot-jdk=/usr/lib/jvm/zulu7-ca-amd64 \
--with-jvm-variants=zero \
--with-debug-level=slowdebug \
--enable-debug-symbols ZIP_DEBUGINFO_FILES=0
在当前目录运行
make all
等待编译完成
搭建调试环境
- Clion导入JDK8U源码目录
创建CMakeLists.txt文件,写入基本项目配置(这里我把JDK源码顶级目录和项目名命名为jdk8u_zero),把hotspot作为子目录配置到CMakeLists
cmake_minimum_required(VERSION 3.19) project(jdk8u_zero) set(CMAKE_CXX_STANDARD 14) add_subdirectory(hotspot)
在hotspot目录下建立CMakeLists文件. 为CMakeLists添加源码&头文件以及宏定义,方便ide进行源码识别和跳转
根据环境和参数不同配置不一样
a. 从该文件获取一部分源码头文件和宏
build/linux-x86_64-normal-zero-slowdebug/hotspot/linux_amd64_zero/debug/flags.make
b. 通过g++命令获取系统头文件`gcc -print-prog-name=cc1plus` -v
最终hotspot下CMakeLists文件如下:
cmake_minimum_required(VERSION 3.19) project(hotspot) set(CMAKE_CXX_STANDARD 14) #通过命令获取 `gcc -print-prog-name=cc1plus` -v #================================================================================== include_directories(SYSTEM /usr/include/c++/7) include_directories(SYSTEM /usr/include/x86_64-linux-gnu/c++/7) include_directories(SYSTEM /usr/include/c++/7/backward) include_directories(SYSTEM /usr/lib/gcc/x86_64-linux-gnu/7/include) include_directories(SYSTEM /usr/local/include) include_directories(SYSTEM /usr/include) #================================================================================== #通过文件获取 build/linux-x86_64-normal-zero-slowdebug/hotspot/linux_amd64_zero/debug/flags.make #================================================================================== add_definitions("-DTARGET_OS_FAMILY_linux") add_definitions("-DTARGET_ARCH_zero") add_definitions("-DTARGET_ARCH_MODEL_zero") add_definitions("-DTARGET_OS_ARCH_linux_zero") add_definitions("-DTARGET_OS_ARCH_MODEL_linux_zero") add_definitions("-DTARGET_COMPILER_gcc") add_definitions("-DLINUX ") add_definitions("-D_GNU_SOURCE ") add_definitions("-DCC_INTERP ") add_definitions("-DZERO ") add_definitions("-DAMD64 ") add_definitions("-DZERO_LIBARCH=\"amd64\"") add_definitions("-DINCLUDE_JFR=0") include_directories(src/share/vm/prims) include_directories(src/share/vm) include_directories(src/share/vm/precompiled) include_directories(src/cpu/zero/vm) include_directories(src/os_cpu/linux_zero/vm) include_directories(src/os/linux/vm) include_directories(src/os/posix/vm) include_directories(../build/linux-x86_64-normal-zero-slowdebug/hotspot/linux_amd64_zero/generated) file(GLOB_RECURSE source_list "src/share/vm/asm/*.cpp" "src/share/vm/asm/*.hpp" "src/share/vm/c1/*.cpp" "src/share/vm/c1/*.hpp" "src/share/vm/ci/*.cpp" "src/share/vm/ci/*.hpp" "src/share/vm/classfile/*.cpp" "src/share/vm/classfile/*.hpp" "src/share/vm/code/*.cpp" "src/share/vm/code/*.hpp" "src/share/vm/compiler/*.cpp" "src/share/vm/compiler/*.hpp" "src/share/vm/gc_implementation/*.cpp" "src/share/vm/gc_implementation/*.hpp" "src/share/vm/gc_implementation/g1/*.cpp" "src/share/vm/gc_implementation/g1/*.hpp" "src/share/vm/gc_implementation/concurrentMarkSweep/*.cpp" "src/share/vm/gc_implementation/concurrentMarkSweep/*.hpp" "src/share/vm/gc_implementation/shared/*.cpp" "src/share/vm/gc_implementation/shared/*.hpp" "src/share/vm/gc_implementation/parNew/*.cpp" "src/share/vm/gc_implementation/parNew/*.hpp" "src/share/vm/gc_implementation/parallelScavenge/*.cpp" "src/share/vm/gc_implementation/parallelScavenge/*.hpp" "src/share/vm/gc_interface/*.cpp" "src/share/vm/gc_interface/*.hpp" "src/share/vm/interpreter/*.cpp" "src/share/vm/interpreter/*.hpp" "src/share/vm/memory/*.cpp" "src/share/vm/memory/*.hpp" "src/share/vm/oops/*.cpp" "src/share/vm/oops/*.hpp" "src/share/vm/precompiled/*.cpp" "src/share/vm/precompiled/*.hpp" "src/share/vm/prims/*.cpp" "src/share/vm/prims/*.hpp" "src/share/vm/prims/wbtestmethods/*.cpp" "src/share/vm/prims/wbtestmethods/*.hpp" "src/share/vm/runtime/*.cpp" "src/share/vm/runtime/*.hpp" "src/share/vm/services/*.cpp" "src/share/vm/services/*.hpp" "src/share/vm/shark/*.cpp" "src/share/vm/shark/*.hpp" "src/share/vm/utilities/*.cpp" "src/share/vm/utilities/*.hpp" "src/cpu/zero/vm/*.cpp" "src/cpu/zero/vm/*.hpp" "src/os_cpu/linux_zero/vm/*.cpp" "src/os_cpu/linux_zero/vm/*.hpp" "src/os/linux/vm/*.cpp" "src/os/linux/vm/*.hpp" "src/os/posix/vm/*.cpp" "src/os/posix/vm/*.hpp") #================================================================================== add_executable(hotspot ${source_list} main.cpp main.h)
开始DEBUG
GDB调试:
gdb --args java -classpath ~/IdeaProjects/demo/target/classes com.example.demo.jvm.App
- 添加添加调试配置(根据自己的情况修改自己对应的目录)
Executable 选择build/linux-x86_64-normal-zero-slowdebug/jdk/bin/java
Program arguments 填入准备好的Java测试类-classpath ~/IdeaProjects/demo/target/classes com.example.demo.jvm.App
Environment variables 填入JAVA_HOME = ~/jdk8u_zero/build/linux-x86_64-normal-zero-slowdebug/jdk
LD_LIBRARY_PATH = ~/jdk8u_zero/build/linux-x86_64-normal-zero-slowdebug/hotspot/linux_amd64_zero/debug
移除Before launch中的build