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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

IDEA远程调试Java代码

發(fā)布時間:2023/12/31 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IDEA远程调试Java代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 前言
    • 2 遠(yuǎn)程 Debug 調(diào)試原理
      • 2.1 理論基礎(chǔ)
      • 2.2 遠(yuǎn)程調(diào)試分類
    • 3 主動連接調(diào)試
      • 3.1 遠(yuǎn)程服務(wù)中開啟 Debug 服務(wù)
        • 3.1.1 對于 SpringBoot
        • 3.1.2 對于 Tomcat
      • 3.2 IDEA 中指定 Debug 服務(wù)器
      • 3.3 遠(yuǎn)程服務(wù)器防火墻端口放行
    • 4 被動連接調(diào)試
      • 4.1 對于 Tomcat
      • 4.2 對于 SpringBoot
    • 5 開始調(diào)試
    • 6 關(guān)閉調(diào)試

1 前言

當(dāng)我們的代碼在線上/測試環(huán)境運行出現(xiàn)異常需要進(jìn)行問題定位時,之前的傳統(tǒng)做法是:查看異常日志,根據(jù)日志定位到出錯代碼,然后再根據(jù)相關(guān)參數(shù)及異常信息進(jìn)行推斷。但是很多異常問題需要更細(xì)致的進(jìn)行debug才能夠更精準(zhǔn)的去定位和解決,這種情況下,我們希望能夠像在本地調(diào)試一樣去debug線上/測試環(huán)境的代碼,這樣可以大大提升bug修復(fù)的效率。IDEA 遠(yuǎn)程調(diào)試為我們提供了解決方案,像運行本地代碼一樣調(diào)試遠(yuǎn)程主機上的程序,以排查遠(yuǎn)程程序的BUG或代碼執(zhí)行流程。

2 遠(yuǎn)程 Debug 調(diào)試原理

在本地遠(yuǎn)程調(diào)試服務(wù)器端的代碼原理:本地和服務(wù)器端建立一個socket連接監(jiān)聽,當(dāng)客戶端訪問服務(wù)器的時候,服務(wù)器端會先去問本地idea有沒有斷點,如果有會停在當(dāng)前斷點,如果沒有就返回給客戶端。

2.1 理論基礎(chǔ)

JPDA(Java Platform Debugger Architecture)是Java平臺調(diào)試體系結(jié)構(gòu)的縮寫。由3個規(guī)范組成,分別是JVMTI(JVM Tool Interface),JDWP(Java Debug Wire Protocol),JDI(Java Debug Interface) 。

  • 1.JVMTI定義了虛擬機應(yīng)該提供的調(diào)試服務(wù),包括調(diào)試信息(Information譬如棧信息)、調(diào)試行為(Action譬如客戶端設(shè)置一個斷點)和通知(Notification譬如到達(dá)某個斷點時通知客戶端),該接口由虛擬機實現(xiàn)者提供實現(xiàn),并結(jié)合在虛擬機中
  • 2.JDWP定義調(diào)試服務(wù)和調(diào)試器之間的通信,包括定義調(diào)試信息格式和調(diào)試請求機制
  • 3.JDI在語言的高層次上定義了調(diào)試者可以使用的調(diào)試接口以能方便地與遠(yuǎn)程的調(diào)試服務(wù)進(jìn)行交互,Java語言實現(xiàn),調(diào)試器實現(xiàn)者可直接使用該接口訪問虛擬機調(diào)試服務(wù)。

2.2 遠(yuǎn)程調(diào)試分類

遠(yuǎn)程調(diào)試分為主動連接調(diào)試,和被動連接調(diào)試。

主動連接調(diào)試:服務(wù)端配置監(jiān)控端口,本地IDE連接遠(yuǎn)程監(jiān)聽端口進(jìn)行調(diào)試,一般調(diào)試問題用這種方式。

被動連接調(diào)試:本地IDE監(jiān)聽某端口,等待遠(yuǎn)程連接本地端口。一般用于遠(yuǎn)程服務(wù)啟動不了,啟動時連接到本地調(diào)試分析。

3 主動連接調(diào)試

3.1 遠(yuǎn)程服務(wù)中開啟 Debug 服務(wù)

3.1.1 對于 SpringBoot

命令行添加選項,并重啟,注意新參數(shù)必須在 -jar 之前

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar springbootfirst.jar

3.1.2 對于 Tomcat

啟動腳本中添加選項,并重啟:

## sudo vim $CATALINA_HOME/bin/catalina.sh JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

3.2 IDEA 中指定 Debug 服務(wù)器

  • 點擊主窗口菜單 Run / Edit Configurations,打開Run/Debug Configurations窗口;

  • 點擊工具欄上的+按鈕,下拉菜單中選擇Remote;

  • 設(shè)置 Host 為遠(yuǎn)程服務(wù)器的域名或IP,保持 Port=5005 無需調(diào)整;

  • Use module classpath配置為程序模塊名稱;

  • Command line arguments for remote JVM配置:配置Debug遠(yuǎn)程服務(wù)的命令行啟動參數(shù),

    形如 -Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005,參數(shù)說明如下:

    • -Xdebug:JVM在DEBUG模式下工作;
    • -Xrunjdwp:JVM使用(java debug wire protocol)來運行調(diào)試環(huán)境;
    • transport:監(jiān)聽Socket端口連接方式,常用的dt_socket表示使用socket連接;
    • server:=y表示當(dāng)前是調(diào)試服務(wù)端,=n表示當(dāng)前是調(diào)試客戶端;
    • suspend:=n表示啟動時不中斷(如果啟動時中斷,一般用于調(diào)試啟動不了的問題);
    • address:表示本地監(jiān)聽的地址和端口。

3.3 遠(yuǎn)程服務(wù)器防火墻端口放行

如果調(diào)試服務(wù)器與遠(yuǎn)程服務(wù)器網(wǎng)絡(luò)不相通則需要開放端口

### sudo vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5005 -j ACCEPT ### 重啟生效: sudo systemctl restart iptables

4 被動連接調(diào)試

首先需要IDEA配置監(jiān)聽,如主動連接調(diào)試的IDEA配置圖片,Debugger mode選擇:Listen to remote JVM,配置本地監(jiān)聽端口,比如默認(rèn)5005。點擊Debug開始等待遠(yuǎn)程連接調(diào)試。

4.1 對于 Tomcat

配置遠(yuǎn)程服務(wù)啟動腳本:

JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y"

4.2 對于 SpringBoot

命令行添加選項,并重啟,注意新參數(shù)必須在 -jar 之前

java -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:5005,suspend=y -jar springbootfirst.jar

參數(shù)含義和主動連接調(diào)試一樣,只是這里suspend=y表示啟動時就中斷,需要連接本地IDE調(diào)試啟動。address=ip:port,ip需要修改為本地的對外IP。

這樣遠(yuǎn)程項目啟動時就連接到本地,方便調(diào)試項目啟動不了的問題。

5 開始調(diào)試

  • 要求:雙方代碼一致,否則遠(yuǎn)程調(diào)試無法啟動;
  • 本地啟動剛剛配置的 Remote Server,正常時會看到日志: Connected to the target VM, address: 'xxx:5005', transport: 'socket'
  • 本地 IDEA 代碼中設(shè)置斷點
  • 瀏覽器或手機 HTTP 訪問服務(wù)器
  • IDEA 即可在斷點暫停并跟蹤

6 關(guān)閉調(diào)試

服務(wù)器上多開放個端口是不安全的,調(diào)試完畢后可恢復(fù)防火墻設(shè)置。

Java 服務(wù)器關(guān)閉 Debug 服務(wù)器的功能,因為debug會影響性能。

總結(jié)

以上是生活随笔為你收集整理的IDEA远程调试Java代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。