日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

在 IntelliJ IDEA 中远程调试 Java 程序

發布時間:2024/4/13 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 IntelliJ IDEA 中远程调试 Java 程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 IntelliJ IDEA 中遠程調試 Java 程序

  • 說明
  • IntelliJ IDEA 遠程調試的原理
  • 使用 IntelliJ IDEA 遠程調試原始 Java 程序的步驟

說明

  • 本文的遠程調試對象以運行在 Linux 上的 Java 程序為例。

IntelliJ IDEA 遠程調試的原理

??遠程調試指的是使用本地客戶端來調試運行在遠程服務器上的程序。IntelliJ IDEA 遠程調試的原理是,當服務器端以調試模式運行 Java 程序時,如果客戶端使用文本相同的字節碼和事先約定好的端口號,就可以遠程調試該 Java 程序。因此,IntelliJ IDEA 遠程調試的必要條件是:

  • Java 程序必須在服務端已經啟動且在調試時正在運行。IntelliJ IDEA 只有觸發調試的能力,沒有遠程部署啟動 Java 程序的能力

  • Java 程序在服務端以調試模式啟動。以調試模式啟動需要在運行該 Java 程序時,使用一些調試模式的 JVM 參數。

  • 客戶端使用 IntelliJ IDEA 進行調試時,使用與服務端事先約定好的相同端口號,且該端口號在服務端沒有被占用。

  • 客戶端使用 IntelliJ IDEA 進行調試時,使用的代碼在文本上與服務端一致。在文本上一致指的是,客戶端使用的代碼與服務端使用的代碼的文字完全相同,如果不一致,使用的斷點將不起作用。文本上一致不包括注釋,但包括換行。文本上一致不需要是同一個代碼源文件,只需要文本相同即可。


??使用 IntelliJ IDEA 進行遠程調試的注意事項:

  • IntelliJ IDEA 只有觸發調試的能力,沒有遠程部署啟動 Java 程序的能力。只能自己先確保 Java 程序可以在服務端基本運行之后才能在客戶端使用遠程調試,無法通過 IntelliJ IDEA 來直接利用服務端的環境運行 Java 代碼。

  • 在遠程調試時,程序是在服務端運行的,與客戶端沒有任何關系,產生的數據對客戶端不會有任何影響。

  • 代碼在文本上與服務端一致 僅指代碼相同。文本上一致不包括注釋,但包括換行。文本上一致不需要是同一個代碼源文件,只需要文本相同即可。也不需要約定 JAR 包名,但需要使用同一標識的應用。

  • 在 IntelliJ IDEA 的代碼中打斷點不需要在調試之前打斷點,只需要在程序運行到此斷點之前打即可。一般部署在服務端的應用都是一個無限循環的應用,同一處代碼會不斷地運行。因此一般可以在調試時的任何時候打斷點。

  • 一旦在客戶端的 IntelliJ IDEA 中觸發了斷點,在服務端運行的 Java 程序會立刻被暫停運行,且受客戶端的 IntelliJ IDEA 所控制。


??IntelliJ IDEA 遠程調試有兩種模式,一種是 attach,另一種是 listen。attach 指的是服務端的 Java 程序已經運行,使用 IntelliJ IDEA 立即進行調試。listen 指是服務端的 Java 程序可能還沒有運行,現在正在監聽在服務端的該端口,直到服務端的 Java 程序啟動了再觸發調試。本文使用的是 attach 模式。

使用 IntelliJ IDEA 遠程調試原始 Java 程序的步驟

筆者的運行環境:

  • 客戶端:
  • IntelliJ IDEA 2020.1.2 (Ultimate Edition)
  • Windows 10 教育版
  • Xshell 7.0.0014
  • Xftp 7
  • 服務器:
  • CentOS Stream 8
  • Java 11.0.12
  • 為了方便遠程輸入命令、將文件加入到 Linux 操作系統中,最好還要在一臺 Windows 操作系統上面使用一種終端控制軟件,如 Xshell、Xftp 等。關于這方面的內容,可見筆者的另一篇如下博客。同時,該博客還給出了查看 Linux 中的 IP 的方法:

    如何在 Windows 主機上訪問本地局域網中的 Linux 主機:
    https://blog.csdn.net/wangpaiblog/article/details/120052152?spm=1001.2014.3001.5502

    現在,假設讀者已經會了如何將文件從 Windows 中傳入 Linux 中,以及查看 Linux 中的 IP。

  • 為了方便說明,筆者編寫了一個傻瓜的 Java 程序。此 Java 程序是在本地的客戶端中的 IntelliJ IDEA 中完成編寫的。示例代碼如下:

    以下代碼的簡單解釋:

    • 以下為無限循環延時代碼。間隔時間為 1 秒,每秒會打印循環的圈數。
    • 使用無限循環的原因是,為了確保進行遠程調試時,遠程程序依然處于運行的狀態。
    • 無需為無限循環而擔心,因為這里是阻塞型程序,在 CMD 中運行時,使用 ctrl + C 即可立刻終止該程序。
    public class Main {public static void main(String[] args) throws InterruptedException {System.out.println("--------start--------");if (args != null && args.length != 0) {for (int order = 1; order <= args.length; ++order) {System.out.println(order + ":" + args[order - 1]);}} else {System.out.println("Hello world.");}for (int order = 0; true; ++order) { // 無限循環延時代碼System.out.println(order);Thread.currentThread().sleep(1000); // 休眠 1 秒}} }
  • 在 IntelliJ IDEA 中進行遠程調試的相關配置。如下圖所示進行操作。

  • 如下圖所示進行操作。注意復制圖中的 JVM 代碼,這將在之后在服務端用于以調試模式啟動本程序。

    筆者示例中約定的端口號為 5005,JVM 代碼為:

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005

  • 在本地客戶端制作 JAR 包。

    如果讀者沒使用 Maven 等構建工具,打包的方法可見筆者的另一篇博客:

    不使用 Maven 等構建工具,而使用原始方法在 IntelliJ IDEA 中制作 JAR 包:
    https://blog.csdn.net/wangpaiblog/article/details/120359856?spm=1001.2014.3001.5501

    如果讀者使用了 Maven,則 Maven 下打包的方法可見筆者的另一篇博客:

    將 Maven 中的多模塊項目只打成一個 JAR 包:
    https://blog.csdn.net/wangpaiblog/article/details/119628194

  • 得到 JAR 包之后,可以使用 Xftp 將其上傳到服務器端的 Linux 中。

  • 對于很多 Linux 系統,此時還不能直接進行遠程調試,因為 Linux 上有防火墻,默認會阻止所有的遠程訪問。對于筆者的 CentOS Stream 8 x86_64,默認的防火墻為 firewalld,而不是 iptables。(很多人會選擇安裝 iptables,但偷懶的筆者沒有選擇這樣做。)

    • 一個偷懶的方法就是,永久地關閉防火墻。關閉的方法如下:

      systemctl stop firewalld
      systemctl mask firewalld
      firewall-cmd --reload
    • 另一個方法是,在防火墻中永久開放上述約定的端口號 5005。開放的方法如下:

      firewall-cmd --zone=public --add-port=5005/tcp --permanent
      firewall-cmd --reload

      單獨開放完端口 5005 之后,可以輸入以下命令查看是否生效:

      firewall-cmd --zone=public --query-port=5005/tcp
      [root@localhost temp]# firewall-cmd --zone=public --query-port=5005/tcp yes

      實際上,也可以輸入以下命令查看所有開放的端口:

      firewall-cmd --zone=public --list-ports
      [root@localhost temp]# firewall-cmd --zone=public --list-ports 5005/tcp
  • 進入上述 JAR 包的目錄。假設上面上傳的 JAR 包名為 demo.jar。整合前面復制的 JVM 代碼,輸入以下命令來運行此 demo 程序。

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar demo.jar
  • 可以看到,前面的無限循環程序開始運行了。

  • 現在就可以在本地客戶端的 IntelliJ IDEA 進行遠程調試了。

  • 如果遠程調試成功。在服務器端運行的上述 Java 程序會立刻被暫停運行。而在 IntelliJ IDEA 的調試控制臺 Console 中會有如下顯示:

  • 最后,記得去服務器端使用 ctrl + C 終止上述 demo 程序。

  • 盡管很多讀者認真閱讀了筆者的教程,但現實中仍然可能出現很多調試失敗的例子。當讀者遠程調試失敗的時候,還請再回去看筆者本文前面寫的 IntelliJ IDEA 遠程調試的原理,不過這里也再提幾點:

    • 如果遠程服務端的 Java 程序沒有啟動,這是一定會調試失敗的。因為如果遠程服務端的 Java 程序沒有啟動,則遠程服務端的端口號會不存在。(這與有沒有在防火墻對外開放端口號權限無關。如果遠程服務端的 Java 程序沒有啟動,就會連端口號都沒有,開放端口號權限也沒用。)

    • 如果想知道遠程服務端的端口號有沒有生成,可以在遠程服務端輸入以下命令:(如果運行的程序阻塞了當前的 Shell 窗口,可以在 Xshell 中另開一個 Shell 窗口。)

      netstat -na | grep 5005
      [root@localhost ~]# netstat -na | grep 5005 tcp 0 0 0.0.0.0:5005 0.0.0.0:* LISTEN
    • 如果想知道本地客戶端能不能連接遠程的端口號,可以在本地客戶端輸入以下命令:

      ssh -v -p 5005 192.168.0.100

      以筆者在 Windows 的 CMD 中,訪問 Linux 的端口號 5005 為例。

      如果訪問成功,輸出信息為:

      C:\Users\XXXXX>ssh -v -p 5005 192.168.0.100 OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5 debug1: Connecting to 192.168.0.100 [192.168.0.100] port 5005. debug1: Connection established. debug1: identity file C:\\Users\\XXXXX/.ssh/id_rsa type 0 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_rsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_dsa type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_dsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_ecdsa type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_ecdsa-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_ed25519 type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_ed25519-cert type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_xmss type -1 debug1: key_load_public: No such file or directory debug1: identity file C:\\Users\\XXXXX/.ssh/id_xmss-cert type -1 debug1: Local version string SSH-2.0-OpenSSH_for_Windows_7.7 ssh_exchange_identification: read: Connection reset

      如果訪問不成功,輸出信息為:

      C:\Users\XXXXX>ssh -v -p 5005 192.168.0.100 OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5 debug1: Connecting to 192.168.0.100 [192.168.0.100] port 5005. debug1: connect to address 192.168.0.100 port 5005: Connection refused ssh: connect to host 192.168.0.100 port 5005: Connection refused
    • 如果本地 IntelliJ IDEA 中沒有使用前述的 在文本上一致 的代碼,而其它正確,則遠程調試會成功,但斷點會打不了(斷點不生效)。

  • 總結

    以上是生活随笔為你收集整理的在 IntelliJ IDEA 中远程调试 Java 程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。