編譯最新OpenJDK
繼上一篇文章《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}替換,指代當前登錄用戶的用戶名 |
安裝環境
VMware安裝
下載地址:
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
Visual Studio Code 安裝
官網教程地址:
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源碼及編譯文件結構:
調試OpenJDK
點擊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: 執行到光標處