IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問(wèn)題不要只會(huì)看日志了(推薦)
1 前言
我們習(xí)慣于在本地開(kāi)發(fā)的時(shí)候debug
,能快速定位與解決問(wèn)題,那部署在服務(wù)器上是不是就沒(méi)有辦法了呢?只能通過(guò)查看日志來(lái)定位?
不是的,在遠(yuǎn)端的服務(wù)器上,我們一樣可以debug
。
2 IDEA的debug
我們先來(lái)看一下在IntelliJ IDEA
直接debug
是怎樣的。
先準(zhǔn)備一個(gè)簡(jiǎn)單的Java
程序:
package com.pkslow.basic; import java.util.Map; public class RemoteDebug { public static void main(String[] args) { System.out.println("------------------start------------------"); System.out.println("get all the system environment"); Map<String, String> envs = System.getenv(); System.out.println("\nprint out the contains `HOME`"); System.out.println("------env HOME------"); envs.entrySet().stream() .filter(env -> env.getKey().contains("HOME")) .forEach(env -> { System.out.println(env.getKey() + ":" + env.getValue()); }); System.out.println("------------------end------------------"); } }
功能很簡(jiǎn)單,獲取所有系統(tǒng)環(huán)境變量,并打印出含有HOME
字段的。
Debug
很簡(jiǎn)單,直接點(diǎn)擊以下按鈕就可以:
相信大家都知道這一點(diǎn),但應(yīng)該很多人都不會(huì)注意,IDEA
究竟做了什么,為什么就可以調(diào)試了呢?我們看一下控制臺(tái)的日志就明白了:
/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n -javaagent:/Users/pkslow/Library/Caches/IntelliJIdea2019.3/captureAgent/debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/charsets.jar:" com.pkslow.basic.RemoteDebug
簡(jiǎn)化一下,不重要的參數(shù)去掉:
java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n com.pkslow.basic.RemoteDebug
這就是可以Debug
的原因,利用了Java Agent
原理。這個(gè)功能很強(qiáng)大,類(lèi)似一個(gè)AOP
,代理了Java
程序,可以利用它進(jìn)行調(diào)試、熱部署等。
3 調(diào)試本地程序
我們先試試如何可以調(diào)試本地程序,不是直接在IDEA
上調(diào)試。先要編譯出class
文件RemoteDebug.class
,然后按package
結(jié)構(gòu)放好。我通過(guò)mvn clean compile
來(lái)編譯。
啟動(dòng)程序,在target/classes/
目錄執(zhí)行:
$ java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50050,suspend=y,server=y com.pkslow.basic.RemoteDebug Listening for transport dt_socket at address: 50050
然后程序就會(huì)等待調(diào)試客戶端的連接,不會(huì)往下執(zhí)行。
配置IDEA
以進(jìn)行調(diào)試:
配置完成保存后,點(diǎn)擊debug
就可以了:
程序已經(jīng)進(jìn)入debug
模式:
我們已經(jīng)執(zhí)行到了其中一行,現(xiàn)在看看服務(wù)端:
與IDEA
是同步的,并且確實(shí)已經(jīng)控制了服務(wù)端Java
的執(zhí)行。
4 遠(yuǎn)程調(diào)試Linux Java程序
先把程序部署在Linux
上:
$ scp -P 22 ./com/pkslow/basic/RemoteDebug.class root@xxx.xx.xx.xxx:/root/remoteDebug/com/pkslow/basic/ RemoteDebug.class 100% 2572 282.5KB/s 00:00
通過(guò)以下命令在服務(wù)端啟動(dòng)程序,這里調(diào)試端口改為9999
,因?yàn)椴糠侄丝谠谶h(yuǎn)程服務(wù)器并沒(méi)有開(kāi)啟:
java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug
本地電腦IDEA
配置如下:
開(kāi)始debug
,正??刂屏诉h(yuǎn)程服務(wù)端的Java
:
服務(wù)端的實(shí)時(shí)執(zhí)行情況:
讓程序執(zhí)行完如下:
$ java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug Listening for transport dt_socket at address: 9999 ------------------start------------------ get all the system environment print out the contains `HOME` ------env HOME------ JAVA_HOME:/root/jdk1.8.0_131 HOME:/root ------------------end------------------
5 總結(jié)
本文一步步探索如何進(jìn)行調(diào)試遠(yuǎn)程的服務(wù)器,這在出現(xiàn)問(wèn)題時(shí)定位還是非常有用的。畢竟可以實(shí)時(shí)看到服務(wù)端運(yùn)行環(huán)境。
到此這篇關(guān)于IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問(wèn)題不要只會(huì)看日志了的文章就介紹到這了,更多相關(guān)IDEA遠(yuǎn)程Debug Linux的Java程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring Boot 自定義PropertySourceLoader
這篇文章主要介紹了詳解Spring Boot 自定義PropertySourceLoader,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05IDEA中Javaweb項(xiàng)目圖片加載不出來(lái)解決方案
在IDEA中能夠正常的預(yù)覽到圖片,但是在生成項(xiàng)目的war包時(shí),項(xiàng)目的目錄結(jié)構(gòu)卻會(huì)發(fā)生變化,所以無(wú)法訪問(wèn)圖片,本文主要介紹了IDEA中Javaweb項(xiàng)目圖片加載不出來(lái)解決方案,感興趣的可以了解一下2023-10-10Java網(wǎng)絡(luò)編程中的TCP/UDP詳解
這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫(xiě)運(yùn)行在多個(gè)設(shè)備的程序,這些設(shè)備都通過(guò)網(wǎng)絡(luò)連接起來(lái),java.net 包中 J2SE 的 API 包含有類(lèi)和接口,它們提供低層次的通信細(xì)節(jié),需要的朋友可以參考下2023-12-12Java ServletContext對(duì)象用法解析
這篇文章主要介紹了Java ServletContext對(duì)象用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Java volatile如何實(shí)現(xiàn)禁止指令重排
這篇文章主要介紹了Java volatile如何實(shí)現(xiàn)禁止指令重排,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11如何使用JWT的SpringSecurity實(shí)現(xiàn)前后端分離
這篇文章主要介紹了使用JWT的SpringSecurity實(shí)現(xiàn)前后端分離,登錄成功需要返回json數(shù)據(jù)登錄失敗需要返回json數(shù)據(jù)權(quán)限不足時(shí)返回json數(shù)據(jù)未登錄訪問(wèn)資源返回json數(shù)據(jù),需要的朋友可以參考下2024-08-08指定springboot的jar運(yùn)行內(nèi)存方式
這篇文章主要介紹了指定springboot的jar運(yùn)行內(nèi)存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java中數(shù)組與集合的相互轉(zhuǎn)換實(shí)現(xiàn)解析
這篇文章主要介紹了Java中數(shù)組與集合的相互轉(zhuǎn)換實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08