使用VSCode调试OpenJDK8
以 Manjaro 20.1 为例
系统环境
?~ uname -r
5.4.57-1-MANJARO
?~ make -version
GNU Make 4.3
?~ gcc -v
...
gcc version 10.2.0 (GCC)
?~ g++ -v
...
gcc version 10.2.0 (GCC)
安装必要的编译、调试软件
- VSCode 很好用的编辑器
- compiledb 我们使用这个工具捕获编译过程中定义的各种宏定义,以便之后在VSCode中配置,消除那些烦人的红线
- vscode-cpptools VSCode c/c++插件
- Building the JDK 编译需要的安装包参考
- mercurial
sudo pacman -S mercurial
- OracleJDK7 作为编译OpenJDK8 的 bootSDK
需要挂梯子
# 根据自己的实际情况配置
export ALL_PROXY=socks5://127.0.0.1:1080
# 这里最好用jdk8u, 不容易出问题
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/
# 进入目录
cd jdk8u
# 执行脚本,拉取所有代码
bash ./get_source.sh
GDB 配置
vim ~/.gdbinit
handle SIGSEGV nostop noprint pass
handle SIGBUS nostop noprint pass
handle SIGFPE nostop noprint pass
handle SIGPIPE nostop noprint pass
handle SIGILL nostop noprint pass
配置源码 说明: 由于jdk8u的代码一直在更新,具体代码的构建过程可能也会变动。强烈推荐阅读源码根目录下的
README-builds.html
进行编译。这里仅以此时获取到的源码构建文档为例!!注意: 配置、编译源码前请不要用Clion、Idea、VSCode 等工具打开源码目录下的子文件夹(如 hotspot目录),否则会在目录下生成ide的配置文件夹(如.idea、.vscode)造成源码编译失败!! 如果已经打开了,请自己手动删除相关目录。
# 移除环境变量配置
unset JAVA_HOME
# 生成slowdebug版本的 openjdk8. 这里必须是slowdebug,不然调试会有问题。
# 具体的--with-boot-jdk 路径需要替换成你自己的jdk7路径
bash ./configure--with-boot-jdk=/home/zero/Documents/Java/jdk1.7.0_80 --with-debug-level=slowdebug --with-target-bits=64
编译源码
compiledb make images
配置VSCode 在源码目录下找到
compile_commands.json
文件,将其中的 -D 后的所有参数收集起来, 如 -DLINUX参数如下图:

文章图片
image.png 【使用VSCode调试OpenJDK8】将收集起来的参数添加到
c_cpp_properties.json
中的 define
配置中。这是我的机器编译时的配置参数,你需要替换成你自己查找出来的参数:

文章图片
c_cpp_properties.json

文章图片
launch.json 说明: 上图中把
preLaunchTask
注释掉了。毕竟我们并不想每次调试的时候都重新编译一遍jdk。可以看到上图中的
args
参数配置,只是简单的执行一下 java -version
,等配置没毛病后,再替换成你要调试的class文件就好了。默认的
tasks.json
文件
文章图片
tasks.json

文章图片
调试效果图 可以看到代码精确地断在了断点上, 没有CLion调试时的断点错位现象。
如果本文帮助您节省了时间,看的爽快,请点个赞支持一下原创。
参考资料
- VSCode Linux下插件配置
- native-java-debugging-on-alpine-linux-gdb-openjdk-and-the-mysterious-unknown-signal
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 移动端h5调试方法
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用