遠程debug調(diào)試入門
1.遠程DEBUG的必要性
由于部署環(huán)境的差異性,相信很多朋友都碰到過開發(fā)環(huán)境正常測試過的功能在測試環(huán)境甚至生產(chǎn)環(huán)境下出現(xiàn)bug的情況。一般情況下,生產(chǎn)環(huán)境可以采取的手段比較單一,即通過日志的方式獲取運行中的環(huán)境上下文,分析日志文件并嘗試重現(xiàn)bug。這會帶來的問題還是不少的,首先,日志的分析是一項比較耗時的工作;其次,現(xiàn)有的日志記錄不一定能反映出問題,你可能需要多次重復(fù)這個過程(分析日志->猜測問題->加日志->部署->獲取日志)來慢慢逼近問題。倘若是測試環(huán)境,我們還多了一項可供選擇的手段——遠程調(diào)試——將程序在測試環(huán)境中以debug模式啟動,在本機使用IDEA在工程中設(shè)置斷點進行調(diào)試。
2,IDEA構(gòu)建SpringBoot測試Demo
新建SpringBoot測試項目remote-debug,只需要web依賴支持即可;版本選用2.2.6.RELEASE(注意,別用2.5.1版本,有坑,親測)
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.java1234</groupId> <artifactId>remote-debug</artifactId> <version>v1.0</version> <name>remote-debug</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
application.yml:
server:
port: 80
servlet:
context-path: /
tomcat:
uri-encoding: utf-8
簡單搞個TestController,提供一個Rest接口
package com.java1234.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author java1234_小鋒
* @site www.java1234.com
* @company Java知識分享網(wǎng)
* @create 2021-06-12 15:37
*/
@RestController
public class TestController {
@PostMapping("/test")
public String test(Integer id,String name){
System.out.println("id="+id);
System.out.println("name="+name);
if(id>0){
return "success "+name;
}else{
return "fail";
}
}
}
我們啟動項目,用postman測試下:
測試接口:http://localhost/test 加入Body form-data 參數(shù) id=1,name=marry,Send 測試,返回 success marry,測試OK;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qPf6tyol-1623688298210)(image-20210613222730931.png)]](http://img.jbzj.com/file_images/article/202106/202106290838038.png)
3,測試Demo項目配置支持遠程調(diào)試
pom.xml里配置jvmArguments參數(shù) -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n</jvmArguments> </configuration> </plugin> </plugins> </build>
加了此配置后,打包后的項目發(fā)布服務(wù)器,可支持遠程DEBUG;
具體參數(shù)詳解:
-Xdebug 通知JVM工作在DEBUG模式下;
-Xrunjdwp 通知JVM使用(Java debug wire protocol)運行調(diào)試環(huán)境。該參數(shù)同時包含了一系列的調(diào)試選項;
**transport **指定了調(diào)試數(shù)據(jù)的傳送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享內(nèi)存方式,其中,dt_shmem只適用于Windows平臺;
address 調(diào)試服務(wù)器的端口號,客戶端用來連接服務(wù)器的端口號;
server=y/n VM 是否需要作為調(diào)試服務(wù)器執(zhí)行;
suspend=y/n 是否在調(diào)試客戶端建立連接之后啟動 VM;
4,IDEA打包jar
我們打包jar包;
右側(cè)Maven工具,雙擊 package打包工具;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3t35X1S1-1623688298215)(image-20210613224738500.png)]](http://img.jbzj.com/file_images/article/202106/202106290838039.png)
一般打包跳過test,可以點擊箭頭所指閃電圖標,這樣打包速度會快很多;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gjGv5k7R-1623688298218)(image-20210613224828589.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380310.png)
打包后,在target目錄下,會生成一個jar包;我們把它復(fù)制出來即可;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-K5FN6ULx-1623688298222)(image-20210613224918420.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380311.png)
5,啟動jar并且?guī)訁?shù)支持遠程調(diào)試
我們把remote-debug-v1.0.jar放D盤根目錄;
我們啟動jar,并且支持遠程DEBUG;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remote-debug-v1.0.jar
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RERGHClm-1623688298225)(image-20210613225414441.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380312.png)
啟動OK,監(jiān)聽socket 5005端口
6,IDEA遠程DEBUG配置
IDEA要進行遠程DEBUG,需要進行配置;
1,啟動項下拉,選擇 Edit Configurations...編輯配置
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3UGDXNMD-1623688298228)(image-20210613225801811.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380313.png)
2,點擊+,選擇Remote,添加遠程DEBUG配置
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3rzwtdYm-1623688298229)(image-20210613230023399.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380414.png)
3,添加遠程DEBUG配置項,Host和Port,配置后,點擊Apply和OK按鈕
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-l0edF9KU-1623688298231)(image-20210613230200362.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380415.png)
7,IDEA遠程DEBUG測試
1,打測試斷點
我們直接在TestController類里的test方法上打點斷;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2MqDENbp-1623688298232)(image-20210613230809384.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380416.png)
2,選擇遠程debug啟動項,然后點擊測試調(diào)試按鈕啟動;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HWmN2f6b-1623688298234)(image-20210613230646749.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380417.png)
3,postman測試
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VJrvld2D-1623688298236)(image-20210613231151240.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380418.png)
4,成功進入斷點
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BeCKrJS3-1623688298238)(image-20210613231235544.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380419.png)
我們走完斷點;
5,啟動的jar包打印信息,測試OK
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-waIbt2vf-1623688298241)(image-20210613231336792.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380420.png)
8,eclipse遠程DEBUG實現(xiàn)
1,右擊項目 -> Debug As -> Debug Configurations…
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NCIa03JQ-1623688298243)(image-20210613232154571.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380521.png)
2,找到 Remote Java Application 然后右擊 New
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o1TZdUQg-1623688298245)(image-20210613232409021.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380522.png)
3,配置Host和Port,點擊Debug按鈕,即可實現(xiàn)遠程DEBUG
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pDNULzPO-1623688298248)(image-20210613232629335.png)]](http://img.jbzj.com/file_images/article/202106/2021062908380523.png)
9,打war包方式配置遠程DEBUG
如果打的是war包,需要兩個步驟:
1.將 web 應(yīng)用部署到 Tomcat 的 webapp 目錄下
2.修改 Tomcat/bin/startup.bat 文件,在最前面加上如下代碼:
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java分布式ID中Snowflake雪花算法應(yīng)用實現(xiàn)
Snowflake算法作為一種高效且易于實現(xiàn)的分布式ID生成方案,能夠很好地滿足分布式系統(tǒng)中對全局唯一ID的需求,本文就來介紹一下Java分布式ID中Snowflake雪花算法應(yīng)用實現(xiàn),感興趣的可以了解一下2024-07-07
springSecurity自定義登錄接口和JWT認證過濾器的流程
這篇文章主要介紹了springSecurity自定義登陸接口和JWT認證過濾器的相關(guān)資料,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12
spring boot配置讀寫分離的完整實現(xiàn)步驟
數(shù)據(jù)庫配置主從之后,如何在代碼層面實現(xiàn)讀寫分離?所以下面這篇文章主要給大家介紹了關(guān)于spring boot配置讀寫分離的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2018-09-09
myBatis實現(xiàn)三級嵌套復(fù)雜對象的賦值問題
這篇文章主要介紹了myBatis實現(xiàn)三級嵌套復(fù)雜對象的賦值問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Springboot實現(xiàn)全局自定義異常的方法詳解
這篇文章主要介紹了Springboot實現(xiàn)全局自定義異常的方法詳解,SpringBoot的項目已經(jīng)對有一定的異常處理了,但是對于我們開發(fā)者而言可能就不太合適了,因此我們需要對這些異常進行統(tǒng)一的捕獲并處理,需要的朋友可以參考下2023-11-11

