因不會(huì)遠(yuǎn)程debug調(diào)試我被項(xiàng)目經(jīng)理嘲笑了
大家好,我是曹尼瑪,剛從培訓(xùn)機(jī)構(gòu)畢業(yè),去一家單位上班一周了…

這一周項(xiàng)目經(jīng)理讓我熟悉了項(xiàng)目業(yè)務(wù),架構(gòu)和設(shè)計(jì),不算難,憑借我培訓(xùn)機(jī)構(gòu)第一名的成績(jī),還是很順溜。

今天項(xiàng)目經(jīng)理把同事們叫到一起,說(shuō)線上438x6項(xiàng)目出現(xiàn)奇葩問(wèn)題,但是開發(fā)環(huán)境初步測(cè)試沒(méi)問(wèn)題,需要配合測(cè)試部的小姐姐們?cè)跍y(cè)試環(huán)境遠(yuǎn)程debug跟蹤下,排查下問(wèn)題,以及正式環(huán)境日志也會(huì)提供,重現(xiàn)下問(wèn)題,解決下bug;

項(xiàng)目經(jīng)理見(jiàn)我這幾天比較悠閑
所以就對(duì)我說(shuō),“曹尼瑪,這個(gè)小任務(wù)就交給你了”

“我,我,我,我不會(huì)遠(yuǎn)程debug,沒(méi)聽(tīng)過(guò)什么是遠(yuǎn)程debug”;

我看到同事都忍不住笑出來(lái)了,項(xiàng)目經(jīng)理也鄙視的笑了。
哎,培訓(xùn)機(jī)構(gòu)只教了debug本地調(diào)試,何況還沒(méi)練熟呢,遠(yuǎn)程debug都沒(méi)聽(tīng)過(guò)。
后來(lái)散會(huì),項(xiàng)目經(jīng)理單獨(dú)找我訓(xùn)話;

“簡(jiǎn)歷2年開發(fā)經(jīng)驗(yàn),遠(yuǎn)程debug都不會(huì),你是干什么吃的,明天下班前把bug找到,否則直接滾蛋”

靠,包裝簡(jiǎn)歷和經(jīng)驗(yàn),露餡了
趕緊學(xué)吧,加班熬夜學(xué)習(xí)了下,第二天上午通過(guò)遠(yuǎn)程debug,配合線上日志,最終找到了問(wèn)題;
順便總結(jié)了下,寫了篇遠(yuǎn)程debug調(diào)試文章分享給大家,以及錄制了一個(gè)遠(yuǎn)程debug視頻教程;希望大家早日學(xué)會(huì),不要被他人嘲笑和鄙視!
這里正式開始筆記內(nèi)容;文末附上視頻教程下載地址
1,遠(yuǎn)程DEBUG的必要性
由于部署環(huán)境的差異性,相信很多朋友都碰到過(guò)開發(fā)環(huán)境正常測(cè)試過(guò)的功能在測(cè)試環(huán)境甚至生產(chǎn)環(huán)境下出現(xiàn)bug的情況。一般情況下,生產(chǎn)環(huán)境可以采取的手段比較單一,即通過(guò)日志的方式獲取運(yùn)行中的環(huán)境上下文,分析日志文件并嘗試重現(xiàn)bug。這會(huì)帶來(lái)的問(wèn)題還是不少的,首先,日志的分析是一項(xiàng)比較耗時(shí)的工作;其次,現(xiàn)有的日志記錄不一定能反映出問(wèn)題,你可能需要多次重復(fù)這個(gè)過(guò)程(分析日志->猜測(cè)問(wèn)題->加日志->部署->獲取日志)來(lái)慢慢逼近問(wèn)題。倘若是測(cè)試環(huán)境,我們還多了一項(xiàng)可供選擇的手段——遠(yuǎn)程調(diào)試——將程序在測(cè)試環(huán)境中以debug模式啟動(dòng),在本機(jī)使用IDEA在工程中設(shè)置斷點(diǎn)進(jìn)行調(diào)試。
2,IDEA構(gòu)建SpringBoot測(cè)試Demo
新建SpringBoot測(cè)試項(xiàng)目remote-debug,只需要web依賴支持即可;版本選用2.2.6.RELEASE(注意,別用2.5.1版本,有坑,親測(cè))
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
簡(jiǎn)單搞個(gè)TestController,提供一個(gè)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知識(shí)分享網(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";
}
}
}
我們啟動(dòng)項(xiàng)目,用postman測(cè)試下:
測(cè)試接口:http://localhost/test 加入Body form-data 參數(shù) id=1,name=marry,Send 測(cè)試,返回 success marry,測(cè)試OK;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-qPf6tyol-1623688298210)(image-20210613222730931.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520542.jpg)
3,測(cè)試Demo項(xiàng)目配置支持遠(yuǎn)程調(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>
加了此配置后,打包后的項(xiàng)目發(fā)布服務(wù)器,可支持遠(yuǎn)程DEBUG;
具體參數(shù)詳解:
-Xdebug 通知JVM工作在DEBUG模式下;
-Xrunjdwp 通知JVM使用(Java debug wire protocol)運(yùn)行調(diào)試環(huán)境。該參數(shù)同時(shí)包含了一系列的調(diào)試選項(xiàng);
**transport **指定了調(diào)試數(shù)據(jù)的傳送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享內(nèi)存方式,其中,dt_shmem只適用于Windows平臺(tái);
address 調(diào)試服務(wù)器的端口號(hào),客戶端用來(lái)連接服務(wù)器的端口號(hào);
server=y/n VM 是否需要作為調(diào)試服務(wù)器執(zhí)行;
suspend=y/n 是否在調(diào)試客戶端建立連接之后啟動(dòng) VM;
4,IDEA打包jar
我們打包jar包;
右側(cè)Maven工具,雙擊 package打包工具;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3t35X1S1-1623688298215)(image-20210613224738500.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520543.jpg)
一般打包跳過(guò)test,可以點(diǎn)擊箭頭所指閃電圖標(biāo),這樣打包速度會(huì)快很多;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-gjGv5k7R-1623688298218)(image-20210613224828589.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520544.jpg)
打包后,在target目錄下,會(huì)生成一個(gè)jar包;我們把它復(fù)制出來(lái)即可;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-K5FN6ULx-1623688298222)(image-20210613224918420.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520545.jpg)
5,啟動(dòng)jar并且?guī)?dòng)參數(shù)支持遠(yuǎn)程調(diào)試
我們把remote-debug-v1.0.jar放D盤根目錄;
我們啟動(dòng)jar,并且支持遠(yuǎn)程DEBUG;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remote-debug-v1.0.jar
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-RERGHClm-1623688298225)(image-20210613225414441.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520546.jpg)
啟動(dòng)OK,監(jiān)聽(tīng)socket 5005端口
6,IDEA遠(yuǎn)程DEBUG配置
IDEA要進(jìn)行遠(yuǎn)程DEBUG,需要進(jìn)行配置;
1,啟動(dòng)項(xiàng)下拉,選擇 Edit Configurations...編輯配置
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3UGDXNMD-1623688298228)(image-20210613225801811.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520547.jpg)
2,點(diǎn)擊+,選擇Remote,添加遠(yuǎn)程DEBUG配置
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-3rzwtdYm-1623688298229)(image-20210613230023399.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520548.jpg)
3,添加遠(yuǎn)程DEBUG配置項(xiàng),Host和Port,配置后,點(diǎn)擊Apply和OK按鈕
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-l0edF9KU-1623688298231)(image-20210613230200362.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520649.jpg)
7,IDEA遠(yuǎn)程DEBUG測(cè)試
1,打測(cè)試斷點(diǎn)
我們直接在TestController類里的test方法上打點(diǎn)斷;
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2MqDENbp-1623688298232)(image-20210613230809384.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520650.jpg)
2,選擇遠(yuǎn)程debug啟動(dòng)項(xiàng),然后點(diǎn)擊測(cè)試調(diào)試按鈕啟動(dòng);
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-HWmN2f6b-1623688298234)(image-20210613230646749.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520651.jpg)
3,postman測(cè)試
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-VJrvld2D-1623688298236)(image-20210613231151240.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520652.jpg)
4,成功進(jìn)入斷點(diǎn)
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-BeCKrJS3-1623688298238)(image-20210613231235544.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520653.jpg)
我們走完斷點(diǎn);
5,啟動(dòng)的jar包打印信息,測(cè)試OK
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-waIbt2vf-1623688298241)(image-20210613231336792.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520654.jpg)
8,eclipse遠(yuǎn)程DEBUG實(shí)現(xiàn)
1,右擊項(xiàng)目 -> Debug As -> Debug Configurations…
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-NCIa03JQ-1623688298243)(image-20210613232154571.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520655.jpg)
2,找到 Remote Java Application 然后右擊 New
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-o1TZdUQg-1623688298245)(image-20210613232409021.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520656.jpg)
3,配置Host和Port,點(diǎn)擊Debug按鈕,即可實(shí)現(xiàn)遠(yuǎn)程DEBUG
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-pDNULzPO-1623688298248)(image-20210613232629335.jpg)]](http://img.jbzj.com/file_images/article/202108/2021083109520757.jpg)
9,打war包方式配置遠(yuǎn)程DEBUG
如果打的是war包,需要兩個(gè)步驟:
將 web 應(yīng)用部署到 Tomcat 的 webapp 目錄下
修改 Tomcat/bin/startup.bat 文件,在最前面加上如下代碼:
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
10,遠(yuǎn)程debug視頻教程+文檔+源碼下載
鏈接:https://pan.baidu.com/s/10tTqaONO8ShE8D9PKDObeQ
提取碼:paty
到此這篇關(guān)于因不會(huì)遠(yuǎn)程debug調(diào)試我被項(xiàng)目經(jīng)理嘲笑了的文章就介紹到這了,更多相關(guān)遠(yuǎn)程debug調(diào)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Java程序判斷是否是閏年的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇用Java程序判斷是否是閏年的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
java事件處理模型知識(shí)點(diǎn)總結(jié)
在本篇文章里小辮給大家分享的是一篇關(guān)于java事件處理模型知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01

