以java指令java -jar demo-1.0.0.jar執行Java應用程式demo-1.0.0.jar時,可以在VS Code以Debug模式下中斷點的方式如下。
例如現在VS Code中有個簡單的Java應用程式專案程式如下。
App.java
package com.abc;
public class App {
public static void main(String[] args) {
String id = args.length > 0 ? args[0] : "";
System.out.println("Demo application started.");
System.out.println("id = " + id);
}
}
將其打包為demo-1.0.0.jar,則在所在目錄輸入java -jar demo-1.0.0.jar id=12345執行如下。
C:\..\target>java -jar demo-1.0.0.jar id=12345
Demo application started.
id = id=12345
以VS Code Debugger執行並中斷
設定launch.json
若要執行時在VS Code以debug模式進行中斷,首先在專案根目錄下新增.vscode/launch.json,內容如下。
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "java", // 告訴VS Code此為Java Debug配置
"name": "Attach App", // 顯示在[Run and Debug]的名稱
"request": "attach", // 不要由VS Code啟動Java,而是連到一個已經正在執行的JVM
"hostName": "localhost", // 表示Debugger要連到哪一台電腦,localhost即本機
"port": 5005 // Debugger連到host的port,即localhost:5005。
}
]
}
以JDWP執行JVM
然後執行命令改為java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -jar demo-1.0.0.jar id=12345。也就是多加上參數-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005開啟Java Debug功能(Java Debug Wire Protocol, JDWP)。
-agentlib:jdwp- 啟用JVM的Java Debug功能,讓VS Code的Debugger可以連到執行的JVM。transport=dt_socket- 指定Debugger透過Socket/TCP連線到JVM。server=y- JVM作為Debug Server,等待Debugger連進來。suspend=y- JVM啟動後先暫停,不執行Java程式,直到Debugger連進來。address=*:5005- 指定Debug Server監聽所有網路介面的5005 port。
意思就是啟動JVM的JDWP功能,使用TCP/Socket,監聽5005 port,等待Debugger連線到JVM Debug Server才開始執行程式。
所以執行命令後會看到"Listening for transport dt_socket at address: 5005",此時執行JVM會先暫時卡住監聽5005 port等待Debugger的連線。
C:\..\target>java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005 -jar demo-1.0.0.jar id=12345
Listening for transport dt_socket at address: 5005
Run and Debug
此時在VS Code的App.java中下個中斷點,然後在左側選擇[Run and Debug],然後在上面選擇[Attach App]並執行,便可以看到程式繼續執行並停在中斷點。
雖然實際執行的是jar中的.class檔案,但Java編譯時會在.class中保留Debug Information,例如原始程式碼的行號資訊。VS Code Debugger透過這些資訊,可以將JVM正在執行的bytecode對應到專案中的Java原始碼,因此可以在App.java對應的位置設定中斷點。
沒有留言:
張貼留言