idea 导出war包_使用IDEA实现远程代码DEBUG调试教程详解
我們在使用 IDEA DEBUG調(diào)試代碼的時候,常常見到控制臺會輸出一句這樣的話:「Connected to the target VM, address: '127.0.0.1:62981', transport: 'socket'」,所以即使代碼不在本地運行,只要JVM打開調(diào)試模式,并且網(wǎng)絡(luò)能夠用過 socket 連接到JVM,使用 Debug 協(xié)議通過 Socket 通信就可以傳遞調(diào)試指令和調(diào)試信息。
IDEA配置啟動環(huán)境(遠(yuǎn)程Debug服務(wù)器)
打開Intellij IDEA,在頂部靠右的地方選擇”Edit Configurations”,進(jìn)去之后點擊左上角的+號,選擇”Remote”,見下圖,其中Name填寫名稱,可以隨便起一個名字,host是你要遠(yuǎn)程調(diào)試代碼的機(jī)器ip/hostname,port是調(diào)試監(jiān)聽端口,如果遠(yuǎn)端服務(wù)器已經(jīng)開啟了遠(yuǎn)程調(diào)試端口就填遠(yuǎn)程端口,如果沒開,那么先選默認(rèn)的5005端口,Use Module classpath 是選擇遠(yuǎn)程運行的代碼模塊是哪個模塊下的。
在Command line arguments for remote JVM,右側(cè)選擇JDK版本,這個是根據(jù)你遠(yuǎn)程服務(wù)器上運行的JDK版本選的,我這里選擇 JDK5-8,就會給你一條命令,我這里得到的是:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005這條命令就是啟動遠(yuǎn)程調(diào)試的命令,有好奇的同學(xué),咱們解釋一下什么意思:
- jdwp是Java Debug Wire Protocol的縮寫
- transport:有兩種形式,分別是socket和shared memory,需要跨機(jī)器,只能用socket;
- server:JVM是否需要作為調(diào)試服務(wù)器執(zhí)行
- suspend:是否調(diào)試客戶端建立連接之后啟動虛擬機(jī)。如果是y,則需要等調(diào)試端機(jī)器上的debugger開啟后,程序才會開始運行。否則,程序啟動時候不會掛起,直接運行。
- address:監(jiān)聽端口5005作為調(diào)試端口
服務(wù)端調(diào)試環(huán)境
Jar包方式啟動的程序
以Jar包方式啟動的程序,例如SpringBoot,可以在啟動的時候添加這個命令,例如:
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 web.jarTomcat(war包)項目
以Tomcat(war包)運行的項目需要修改Tomcat啟動腳本,Linux 的是 catalina.sh,Windows 的是 catalina.bat,將這個命令添加進(jìn)去:
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"服務(wù)器端的JVM參數(shù)添加好,等到程序啟動,你就可以開始運行你電腦上的DEBUG了。如果連接失敗,記得檢查網(wǎng)絡(luò)防火墻是否放行了端口。
探究原理
核心是JPDA(Java Platform Debugger Architecture)框架。IBM有非常詳細(xì)的介紹:
- https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/
- https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/
- https://www.ibm.com/developerworks/cn/java/j-lo-jpda3/
- https://www.ibm.com/developerworks/cn/java/j-lo-jpda4/
關(guān)鍵摘抄如下:
- JPDA是JVM的調(diào)試標(biāo)準(zhǔn),任何JDK都必須實現(xiàn)。
- 調(diào)試Java程序,本質(zhì)是向JVM請求當(dāng)前狀態(tài)。這需要對JVM發(fā)送一定指令,設(shè)置一定回調(diào)。
- JPDA的三個層次:Java 虛擬機(jī)工具接口(JVMTI),Java 調(diào)試線協(xié)議(JDWP)以及 Java 調(diào)試接口(JDI)。它們之間的角色圖:
- JVMTI(Java Virtual Machine Tool Interface):通向JVM的native的接口,處于體系最底層。所有的調(diào)試功能都需要該接口提供。是debug和profiler的接口,是線程分析、監(jiān)聽和代碼覆蓋率檢查的基礎(chǔ)。會有個緊耦合的Agent來實現(xiàn)JVMTI。該Agent的加載時間是出于JVM初始化早期或者運行時加載(對應(yīng)于上文中的suspend參數(shù))。
- JDWP(Java Debug Wire Protocol):交互的通訊協(xié)議。定義了交互中的命令、回應(yīng)數(shù)據(jù)和錯誤代碼。不包含傳輸層具體實現(xiàn)。主要分為握手和應(yīng)答兩個階段。
- JDI(Java Debug Interface):對JDWP進(jìn)行解析,為JDWP提供隊列、緩存等服務(wù)。分為數(shù)據(jù)模塊,將虛擬機(jī)上的所有數(shù)據(jù)、狀態(tài)映射為Java的數(shù)據(jù)對象;鏈接模塊,調(diào)試器向虛擬機(jī)發(fā)起鏈接,以獲得各種狀態(tài),分為主動和被動形式。事件請求和處理模塊。
- 由于JVM神一般的存在,使得Java的運行是先天可控的,因此其調(diào)試程序的開發(fā),也遠(yuǎn)容易與C++。
- 類似工具:Apache harmony
總結(jié)
以上是生活随笔為你收集整理的idea 导出war包_使用IDEA实现远程代码DEBUG调试教程详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云顶之弈机器人法爆_云顶之弈10.16b
- 下一篇: python中当地时间_R 与 Pyth