你可能並不知道的遠程調試技巧

問題

  1. 在咱們的平常開發中,測試人員在測試環境遇到某個問題,經過日誌不足以鎖定問題,巴不得能夠遠程調試一下代碼
  2. 上一篇文章介紹了SpringBoot的啓動,在IDE裏直接運行應用的main方法,跳過了SpringBoot的Jarlanucher,不知道該如何調試Jarlanucher的啓動過程
  3. 想了解Tomcat的源碼,但無法調試Tomcat的啓動過程
  4. 我的電腦配置不高,沒法運行大量微服務,租用了某雲上的虛擬機跑微服務,只能靠手動添加日誌來排錯,影響開發效率

若是你遇到了上述問題卻無從下手,那麼你必定要了解一下遠程調試,而不是原地踏步用老舊的方法解決變幻莫測的問題windows

正文

在很長的一段時間內,我本身一直覺得調試(Debug)就是IDE的功能,並且只能調試本地的程序,對於遠程環境則無能爲力。在一次瀏覽Github優秀的中文開源項目中瞭解到Java Agent,該項目甚至在Issue裏教開發者如何用遠程調試,這才知道原來JVM還提供了一套如此優秀的工具,真是相見恨晚啊!!!架構

Java Agent

Java Agent爲開發者提供了一種運行時修改字節碼的能力,例如JVM級別的AOP,不重啓應用直接修改字節碼等,利用該技術能夠玩出不少應用代碼沒法實現的花樣。socket

JDPA

JDPA全稱Java Platform Debugger Architecture(Java平臺調試架構),定義了Java平臺上的調試體系架構,主要包括3個主要組成部分:JVMTI(Java虛擬機工具接口),JDI(Java調試連線協議)和JDWP(Java調試接口)微服務

JDWP

JDWP全稱Java Debug Wire Protocol,定義了調試器和遠程JVM之間的調試通信協議工具

JDPA的體系很複雜,咱們做爲開發者先學會如何用就能夠了。用法也很簡單,啓動應用的參數加上如下參數就行了測試

-agentlib:jdwp=transport=dt_socket,address=6666,server=y,suspend=n調試

而後IDE裏面選擇Remote Java Application,填入對應的IP和端口,就能愉快地遠程調試了日誌

  • agentlib:jdwp 利用了Java Agent技術,選擇JDWP做爲agent
  • transport=dt_socket 使用socket做爲通信方式,實際上windows支持socket和shared memory,而Linux只支持socket
  • address 監聽的端口
  • server =y表示該JVM即將被調試
  • suspend =n說明JVM當即運行, 若是設置成y,表示JVM會等待將來將要attached的調試者,適合於調試應用初始化的場景

小結

  • Java Agent提供了十分強大的拓展功能
  • JDPA的遠程調試十分好用,爲咱們解決問題提供了一條更高效的途徑
  • 多逛Github,就算英文很差,也能先從中文開源項目入手,更況且國人的優秀開源項目愈來愈多,絕對受益不淺
相關文章
相關標籤/搜索