继上一篇文章《Java工程师尝鲜:编译最新OpenJDK》
之后,内心还是很慌乱:编译个JDK太简单了,似乎没有任何技术含量,本篇继续编译之后的工作,一步一步搭建一个调试JDK的环境。
项目 | 版本 | 说明 |
---|---|---|
VMware | 15.5 | Windows上安装Linux系统必备 |
操作系统 | CentOS 8.1 | CentOS最新社区开源版本 |
基础JDK | 13.0.2 | 运行java程序及编译最新JDK需要 |
Visual Studio Code | 1.43.2 for Linux | 调试需要的工具链 |
Linux登录用户 | peterchen | 在使用时用${user}替换,指代当前登录用户的用户名 |
下载地址:
https://my.vmware.com/en/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/15_0?wd=&eqid=95cf61ac00012630000000065e8ad569
安装步骤:
请查看百度经验:
https://jingyan.baidu.com/article/e2284b2ba81236e2e6118d89.html
官网教程地址:
https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based-distributions
安装步骤
1.打开终端
2.切换用户
从当前登录用户切换到root用户
su -
然后输入root用户密码
3.配置dnf源
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
4.进行安装
如果因为网络问题中断请多试几次
cd /opt
sudo dnf check-update
sudo dnf install code
5.创建桌面快捷方式
查看安装目录
whereis code
注意这个目录:/usr/share/code
另外visual studio code的图标文件在:/usr/share/code/resources/app/resources/linux 目录下
创建快捷方式
vim /usr/share/applications/VSCode.desktop
添加以下内容:
[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/usr/share/code/bin/code
Icon=/usr/share/code/resources/app/resources/linux/code.png
Type=Application
StartupNotify=true
Categories=TextEditor;
MimeType=text/plain;
:wq!保存退出
将快捷方式复制到当前登录用的桌面:
cp /usr/share/applications/VSCode.desktop /home/${user}/Desktop
修改权限
chown ${user} /home/${user}/Desktop/VSCode.desktop
设置允许快捷方式执行
如果这一步中没有看到Allow Launching 则需要选择Rename进行重命名,将名字后面的.desktop删掉,然后再设置可执行,成功后的效果如下:
到此Visual Studio Code就在CentOS 8.1中安装成功。
其他必要的安装可百度,OpenJDK编译请参考:《Java工程师尝鲜:编译最新OpenJDK》
正式调试 构建VS工程在CentOS系统中打开终端切换root用户,并进入已成功编译过的OpenJDK根目录(笔者是放置在openjdk14中)
cd /opt/openjdk/
make vscode-project
导入VS工程
打开Visaul Studio Code点击 File --> Open Workspace…
进入上一步执行make vscode-project 成功后输出的目录,点击OPEN即可将项目导入:
导入后会出现一个警告,警告的含义是当前Visual Studio Code打开的workspace文件太多已超出限制,需要做一些配置,我们点击蓝色按钮(Instuctions)可以跳转到官网找到解决方案:
解决方案是在终端查看当前文件限制数并修改其设置:
cat /proc/sys/fs/inotify/max_user_watches
默认文件句柄限制为8192,通过以下命令修改:
vim /etc/sysctl.conf
在文件最后增加以下内容:
fs.inotify.max_user_watches=524288
然后:wq保存退出,再执行以下命令使配置生效:
sudo sysctl -p
安装C/C++编译插件
安装Code Runner插件
重新启动Visual Studio Code,我们看到完整的jdk源码及编译文件结构:
点击VScode的debug按钮,我们可以看到如下内容:
在“2.点击下拉框”我们看到两个可以执行的选项
gtestLauncher
java
这是jdk源码调试的两个入口,我们先使用默认的gtestLauncher,然后点击右边的齿轮,VScode会打开一个luanch.json的配置文件,其内容是:
{
"version": "0.2.0",
"configurations": [
{
"name": "gtestLauncher", // 配置名称,将会在启动配置的下拉菜单中显示
"type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
"request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
"program": "/opt/openjdk14/build/linux-x86_64-server-release/hotspot/variant-server/libjvm/gtest/gtestLauncher", // 将要进行调试的程序的路径
"args": ["-jdk:/opt/openjdk14/build/linux-x86_64-server-release/jdk"], // 程序调试时传递给程序的命令行参数
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
"cwd": "/opt/openjdk14", // 调试程序时的工作目录,此为工作区文件夹;改成${fileDirname}可变为文件所在目录
"environment": [], // 环境变量
"externalConsole": false, // 为true时使用单独的cmd窗口,与其它IDE一致;18年10月后设为false可调用VSC内置终端TERMINAL
"preLaunchTask": "Make 'exploded-image'",
"osx": {
"MIMode": "lldb",
"internalConsoleOptions": "openOnSessionStart",
"args": ["--gtest_color=no", "-jdk:/opt/openjdk14/build/linux-x86_64-server-release/jdk"]
},
"linux": {
"MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb,linux下默认使用gdb
"setupCommands": [
{
"text": "handle SIGSEGV noprint nostop",
"description": "Disable stopping on signals handled by the JVM"
}
]
}
},
{
"name": "java",
"type": "cppdbg",
"request": "launch",
"program": "/opt/openjdk14/build/linux-x86_64-server-release/jdk/bin/java",
"stopAtEntry": false,
"cwd": "/opt/openjdk14",
"environment": [],
"externalConsole": false,
"preLaunchTask": "Make 'exploded-image'",
"osx": {
"MIMode": "lldb",
"internalConsoleOptions": "openOnSessionStart",
},
"linux": {
"MIMode": "gdb",
"setupCommands": [
{
"text": "handle SIGSEGV noprint nostop",
"description": "Disable stopping on signals handled by the JVM"
}
]
}
}
]
}
我们根据配置文件找到调试入口:/opt/openjdk14/build/linux-x86_64-server-release/hotspot/variant-server/libjvm/gtest/gtestLauncher
但这是个so的二进制文件,对应的cpp文件在源码目录下,我们将luanch.json中的"stopAtEntry"改为true,让他启动时在main函数处断点,这样我们就可以很快找到对应的源文件了,修改后点击RUN旁边的箭头启动debug:
很快程序就会进入main函数的断点:
VScode会自动将调试入口的源程序gtestLuancher.cpp打开,并在main函数中断点。这样我们就可以愉快的进行调试了,常用的快捷键是:
F5: 运行至下一个断点
F10: 一行一行的执行,如果某一行是一个函数的调用,不进入该函数
F11: 一行一行的执行,如果某一行是一个函数的调用,会进入该函数
shift + F11: 跳出方法
Ctrl + F10: 执行到光标处