1 前言
歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!
我們習慣于在本地開發的時候debug,能快速定位與解決問題,那部署在服務器上是不是就沒有辦法了呢?只能通過查看日志來定位?
不是的,在遠端的服務器上,我們一樣可以debug,
2 IDEA的debug
我們先來看一下在IntelliJ IDEA直接debug是怎樣的,
先準備一個簡單的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------------------");
}
}
功能很簡單,獲取所有系統環境變數,并列印出含有HOME欄位的,
Debug很簡單,直接點擊以下按鈕就可以:

相信大家都知道這一點,但應該很多人都不會注意,IDEA究竟做了什么,為什么就可以除錯了呢?我們看一下控制臺的日志就明白了:
/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
Connected to the target VM, address: '127.0.0.1:59313', transport: 'socket'
簡化一下,不重要的引數去掉:
java -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59313,suspend=y,server=n com.pkslow.basic.RemoteDebug
這就是可以Debug的原因,利用了Java Agent原理,這個功能很強大,類似一個AOP,代理了Java程式,可以利用它進行除錯、熱部署等,
3 除錯本地程式
我們先試試如何可以除錯本地程式,不是直接在IDEA上除錯,先要編譯出class檔案RemoteDebug.class,然后按package結構放好,我通過mvn clean compile來編譯,
啟動程式,在target/classes/目錄執行:
$ 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
然后程式就會等待除錯客戶端的連接,不會往下執行,
配置IDEA以進行除錯:

配置完成保存后,點擊debug就可以了:

程式已經進入debug模式:

我們已經執行到了其中一行,現在看看服務端:

與IDEA是同步的,并且確實已經控制了服務端Java的執行,
4 遠程除錯Linux Java程式
先把程式部署在Linux上:
$ scp -P 22 ./com/pkslow/basic/RemoteDebug.class [email protected]:/root/remoteDebug/com/pkslow/basic/
RemoteDebug.class 100% 2572 282.5KB/s 00:00
通過以下命令在服務端啟動程式,這里除錯埠改為9999,因為部分埠在遠程服務器并沒有開啟:
java -agentlib:jdwp=transport=dt_socket,address=9999,suspend=y,server=y com.pkslow.basic.RemoteDebug
本地電腦IDEA配置如下:

開始debug,正常控制了遠程服務端的Java:

服務端的實時執行情況:

讓程式執行完如下:
$ 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 總結
本文一步步探索如何進行除錯遠程的服務器,這在出現問題時定位還是非常有用的,畢竟可以實時看到服務端運行環境,
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/5045.html
標籤:Java
上一篇:程式員你的maven多模塊專案如何對外輸出為一個構件?
下一篇:性能測驗-locust簡介及使用
