Debug OpenJDK
环境
- 系统: ubuntu 18.10
- 编辑器: vscode
- JDK版本: openjdk8u
下载Openjdk
各版本都在https://hg.openjdk.java.net,这里选择jdk8u。
1 | hg clone https://hg.openjdk.java.net/jdk8u/jdk8u openjdk |
hg命令需要事先安装Mercurial.
1 | sudo apt install mercurial |
如果下载缓慢尝试设置代理,在/etc/mercurial/hgrc
文件里加入(真的非常慢):
1 | system-wide mercurial configuration file |
编译
编译jdk需要系统已经安装了JDK,称为bootstrap jdk(而且最好是前一个版本,比如编译jdk8,那么事先装好jdk7),如果不对可以通过修改环境变量或者加上configure参数--with-boot-jdk
参数指定jdk路径。
1 | java -version |
安装依赖(参考README
,也可以configure
之后依据提示安装):
1 | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev |
配置:
1 | chmod u+x configure |
debug-level分slowdebug和fastdebug,–enable-debug默认位fast-debug,debug symbol默认是压缩的,设置–with-native-debug-symbols=external免去手动解压的工作。
将hotspot/make/linux/makefiles/gcc.make
中的WARNINGS_ARE_ERRORS = -Werror
改为WARNINGS_ARE_ERRORS = -w
,不然会出现如下异常。
1 | cc1plus: all warnings being treated as errors |
编译:
1 | make all |
完成
1 | build/linux-x86_64-normal-server-fastdebug/jdk/bin/java -version |
调试
vscode需要先装上cpptools
插件,可以直接在插件商城里搜索c/c++
。
打开VSCode, File -> OpenFolder选中jdk文件夹,点击左侧虫虫图标,点击add configuration选中c/c++ (gdb) Launch,修改lauch.json
文件。
1 | { |
这里主要修改program参数和args参数,program设置为build/linux-x86_64-normal-server-fastdebug/jdk/bin/java
,args设置为编译好的class类名(我放在桌面),断点打在src/share/vm/prims/jni.cpp
文件下的JNI_CreateJavaVM
函数上,这里是jvm的入口,你也可以打在jdk/src/share/bin/main.c
的main函数上,这样差不多就可以开始调了,但是查看文件会非常多的错误提示找不到文件。
接下来在.vscode
文件夹下创建c_cpp_properties.json
文件,输入以下内容。
1 | { |
最后一个问题就是调试遇到libc
里的函数的时候会弹窗提示找不到对应的文件,首先按照系统提示安装对应版本的glibc
源文件,也可以手动下载。
1 | sudo apt-get install glibc-source |
我这里版本是glibc-2.31,安装在/usr/src/glibc/glibc-2.31.tar.xz
,解压在当前目录。
1 | cd /usr/src/glibc |
接下来,在弹错误的时候注意提示文件路径,比如我这里是/build/glibc-KRRWSm/glibc-2.29
,在launch.json
的configurations
里面加入"sourceFileMap":{"/build/glibc-KRRWSm/glibc-2.29": "/usr/src/glibc/glibc-2.29"}
。sourceFileMap
配置可以参考下面的文档:https://github.com/vadimcn/vscode-lldb/blob/master/MANUAL.md#source-path-remapping。