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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!

發布時間:2025/3/20 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

  • 在部署線上項目時,相信大家都會遇到一個問題,線上的 Bug 但是在本地不會復現,多么無奈。

  • 此時最常用的就是取到前端傳遞的數據用接口測試工具測試,比如 POSTMAN,復雜不,難受不?

  • 今天陳某教你一招,讓你輕松調試線上的 Bug。文章目錄如下:

什么是 JPDA?

  • JPDA(Java Platform Debugger Architecture),即 Java 平臺調試體系,具體結構圖如下圖所示。

  • 其中實現調試功能的主要協議是JDWP協議,在 Java SE 5 以前版本,JVM 端的實現接口是 JVMPI(Java Virtual Machine Profiler Interface),而在 Java SE 5 及以后版本,使用 JVMTI(Java Virtual Machine Tool Interface) 來替代 JVMPI。

  • 因此,如果使用 Java SE 5 之前版本,使用調試功能的命令為:

java?-Xdebug?-Xrunjdwp:...
  • 而 Java SE 5 及之后版本,使用調試功能的命令為:

java?-agentlib:jdwp=...

調試命令

  • 現在開發中最常見的一條遠程調試的的命令如下:

java?-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9091?-jar?xxx.jar

參數說明

  • 基于前面的調試命令,我們來分析一下基本的參數代表什么意思。

transport

  • 指定運行的被調試應用和調試者之間的通信協議,它由幾個可選值:

  • dt_socket:主要的方式,采用socket方式連接。

  • dt_shmem:采用共享內存方式連接,僅支持 Windows 平臺。

  • server

    • 指定當前應用作為調試服務端還是客戶端,默認為n。

    • 如果你想將當前應用作為被調試應用,設置該值為 y,如果你想將當前應用作為客戶端,作為調試的發起者,設置該值為n。

    suspend

    • 當前應用啟動后,是否阻塞應用直到被連接,默認值為 y。

    • 在大部分的應用場景,這個值為 n,即不需要應用阻塞等待連接。一個可能為 y的應用場景是,你的程序在啟動時出現了一個故障,為了調試,必須等到調試方連接上來后程序再啟動。

    address

    • 暴露的調試連接端口,默認值為 8000。

    • 此端口一定不能與項目端口重復,且必須是服務器開放的端口。

    onthrow

    • 當程序拋出設定異常時,中斷調試。

    onuncaught

    • 當程序拋出未捕獲異常時,是否中斷調試,默認值為 n。

    launch

    • 當調試中斷時,執行的程序。

    timeout

    • 該參數限定為java -agentlib:jdwp=…可用,單位為毫秒ms。

    • 當 suspend = y 時,該值表示等待連接的超時;當 suspend = n 時,該值表示連接后的使用超時。

    參考命令

  • -agentlib:jdwp=transport=dt_socket,server=y,address=8000:以 Socket 方式監聽 8000 端口,程序啟動阻塞(suspend 的默認值為 y)直到被連接。

  • -agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000:以 Socket 方式監聽 8000 端口,當程序啟動后 5 秒無調試者連接的話終止,程序啟動阻塞(suspend 的默認值為 y)直到被連接。

  • -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n:選擇可用的共享內存連接地址并使用 stdout 打印,程序啟動不阻塞。

  • -agentlib:jdwp=transport=dt_socket,address=myhost:8000:以 socket 方式連接到 myhost:8000上的調試程序,在連接成功前啟動阻塞。

  • -agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub:以 Socket 方式監聽 8000 端口,程序啟動阻塞(suspend 的默認值為 y)直到被連接。當拋出 IOException 時中斷調試,轉而執行 usr/local/bin/debugstub程序。

  • IDEA 遠程調試示例

    • 首先打包 SpringBoot 項目,在服務器上運行,執行以下命令:

    java?-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9190?-jar?debug-demo.jar
    • 出現下圖的界面,表示運行成功:

    • 然后在 IDEA 中,點擊 Edit Configurations,在彈框中點擊 + 號,然后選擇Remote。

    • 填寫服務器的地址及端口,點擊 OK 即可。

    • 配置完畢后,DEBUG 調試運行即可。

    • 配置完畢后點擊保存即可,因為我配置的 suspend=n,因此服務端程序無需阻塞等待我們的連接。我們點擊 IDEA 調試按鈕,當我訪問某一接口時,能夠正常調試。

    最后,再附上我歷時三個月總結的?Java 面試 + Java 后端技術學習指南,這是本人這幾年及春招的總結,目前,已經拿到了騰訊等大廠offer,拿去不謝,github 地址:https://github.com/OUYANGSIHAI/JavaInterview

    這么辛苦總結,給個star好不好。?點擊閱讀原文,直達

    總結

    以上是生活随笔為你收集整理的线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!的全部內容,希望文章能夠幫你解決所遇到的問題。

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