在这里想要记录一下自己在下载openjdk到编译再到使用vscode来debug源码的过整个过程,以及遇到的问题相关的记录
环境准备
1.安装虚拟机,lz这里是windows系统,选择安装VMware
2.安装Ubuntu系统,这里我选择的是1.6因为jdk1.8版本是有点老了,选择高的系统版本会不支持并且报错
3.下载jdk 1.8 ,从官网去下载,lz这里打算编译jdk1.8所以安装jdk1.8作为根bootjdk,记得配置好环境变量JAVA_HOME;当我们编译好后JAVA_HOME改成手动编译好的jdk的位置,例如我的是在
4.GitHub下载openjdk源码,GitHub - AdoptOpenJDK/openjdk-jdk8u: JDK8u mirror from mercurial
5. 执行bash ./configure --with-target-bits=64 --with-num-cores=8 --with-debug-level=slowdebug --enable-debug-symbols,在这个过程中会发生很多问题,下面会一一列出
6. 执行 make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok,生成目标文件,这里要是make all哦,网上很多地方都是make images,我之前就因为这个走了很多弯路
7.安装vscode,这个直接从官网下载就可以了,需要安装相应的插件,如下图所示
8.准备好Test.java.javac 编译成class文件
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("hello world !");
for (int i = 0; i < 1000000; i++) {
System.out.println("睡眠开始" + i);
Thread.sleep(2 * 60 * 1000);
System.out.println("睡眠结束");
}
System.out.println("end");
}
}
9.导入编译好的jdk源码,配置launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "cppdbg",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java",
"args": ["-cp","Test.class文件所在目录", "Test"],
"stopAtEntry": true,
"miDebuggerPath": "/usr/bin/gdb",
//"additionalSOLibSearchPath": "${workspaceFolder}/build/linux-x86_64-normal-server-slowdebug/jdk/lib:${workspaceFolder}/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug",
"cwd": "${workspaceFolder}",
"environment": [
// {
// "name": "LD_LIBRARY_PATH",
// "value": "${workspaceFolder}/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug"
// }
],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}]
}
]
}
10.开始debug了,因为配置了"stopAtEntry": true,所以debug会停9程序入口点,main.c的main方法里面
遇到的问题
1.编译问题,在执行bash ./configure的时候会又很多提示缺少什么,根据提示就可以解决了,但是我这次遇到一个freetype依赖问题,相关的包已经安装,bash configure 一直提示找不到让安装;产生这个问题的原因是:没有找到所需要的库文件"ft2build.h",该文件位置为/usr/include/freetype2/ft2build.h
解决方案:创建一个硬链接即可:sudo ln -s /usr/include/freetype2/ft2build.h /usr/include/
2.debug问题,在debug到r = ifn->CreateJavaVM(pvm, (void **)penv, &args);时提示gdb cannot execute next step,直接跳过之后堆栈信息很多unknow source,jni.cpp.thread.cpp里面的断点都是灰色空心的,(网上找了很多文章都说是文件被改了需要重新编译,然而我重现编译后依然不可以,后来从头到尾自己又理了一遍从编译到配置,包括每个配置项都认证的核对过是什么意思,在launch.json里加了LD_LIBRARY_PATH还是不行,其实相关的源文件是存在的,想起了编译的时候只加了 --with-debug-level=slowdebug,make images,于是重新编译带使用了上面5.6中的参数就可以了)