1. 程式人生 > 其它 >通過jdb命令連線遠端除錯的方法

通過jdb命令連線遠端除錯的方法

概述

有的時候在判斷是否可以本地連線到遠端的除錯埠,比如是不是網路的限制,還是環境等問題,這個時候可以使用java自帶的jdb命令,嘗試連線到遠端的除錯埠,如果可以連線,則排除網路問題,從其他的方向入手進行排查,本文介紹在linux環境,windows環境中通過jdb連線遠端除錯埠的方法。

jdb = java debugger

linux環境

1.確保宿主機上有jdk

2.遠端主機開啟除錯埠

可通過引數-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000啟動jvm

3.jdb命令連線遠端

# 存在jdk環境
[root@nctest-snap-test-02 bin]# pwd
/data/jdk/bin

# 有jdb命令
[root@nctest-snap-test-02 bin]# ls
appletviewer  jarsigner       javah         jcmd      jhat   jmc.ini     jstat         orbd        rmiregistry  unpack200
ControlPanel  java            javap         jconsole  jinfo  jps         jstatd        pack200     schemagen    wsgen
extcheck      javac           javapackager  jcontrol  jjs    jrunscript  jvisualvm     policytool  serialver    wsimport
idlj          javadoc         java-rmi.cgi  jdb       jmap   jsadebugd   keytool       rmic        servertool   xjc
jar           javafxpackager  javaws        jdeps     jmc    jstack      native2ascii  rmid        tnameserv

# 使用jdb連線遠端服務的除錯埠
[root@nctest-snap-test-02 bin]# jdb -attach 172.20.45.87:37500
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
Initializing jdb ...
> 

這樣就附加到遠端vm上了。

執行threads命令,可看到執行緒資訊

> threads
Group system:
  (java.lang.ref.Reference$ReferenceHandler)0x31be       Reference Handler                         cond. waiting
  (java.lang.ref.Finalizer$FinalizerThread)0x31bd        Finalizer                                 cond. waiting
  (java.lang.Thread)0x31bc                               Signal Dispatcher                         running
  (sun.misc.GC$Daemon)0x31b9                             GC Daemon                                 cond. waiting
Group main:
  (java.lang.Thread)0x31bf                               main                                      running
  (org.apache.juli.AsyncFileHandler$LoggerThread)0x31bb  AsyncFileHandlerWriter-1504109395         cond. waiting
  (java.lang.Thread)0x31ba                               FileHandlerLogFilesCleaner-1              cond. waiting
  (org.apache.logging.log4j.core.util.Log4jThread)0x31b8 Log4j2-TF-2-Scheduled-1                   cond. waiting
  (java.lang.Thread)0x31b7                               check-offline-msg-valid                   sleeping
  (java.lang.Thread)0x31b6                               ConfigurationMonitor                      sleeping
  (nc.bs.framework.execute.impl.ExecutorThread)0x31b5    Thread-7                                  cond. waiting
  (nc.bs.framework.mx.thread.NotifyNMC)0x31b4            notifynmc                                 sleeping
  (nc.bs.framework.execute.impl.ExecutorThread)0x31b3    Thread-9                                  cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31b2    Thread-10                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31b1    Thread-11                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31b0    Thread-12                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31af    Thread-13                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31ae    Thread-14                                 sleeping
  (java.lang.Thread)0x31ad                               Thread-15                                 sleeping
  (java.util.TimerThread)0x31ac                          Timer-0                                   cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31ab    Thread-17                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31aa    Thread-19                                 cond. waiting
  (java.lang.Thread)0x31a9                               DisExeManager                             sleeping
  (java.lang.Thread)0x31a8                               Dist_MTaskPro                             sleeping
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a7    Thread-21                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a6    Thread-22                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a5    Thread-23                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a4    Thread-24                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a3    Thread-25                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a2    Thread-26                                 cond. waiting
  (nc.bs.framework.execute.impl.ExecutorThread)0x31a1    Thread-27                                 cond. waiting
  Group middleware-group:
  (java.lang.Thread)0x3198                               middleware-RPCTokenRefreshTimer-1         cond. waiting
  (java.lang.Thread)0x318e                               middleware-HttpNodeWatcher-1              sleeping
  (java.lang.Thread)0x318d                               middleware-HttpNodeWatcher-2              sleeping
  (java.lang.Thread)0x318c                               middleware-HttpNodeWatcher-3              sleeping
> 

這樣就可以在互動式的環境中進行除錯了。

windows環境

1.確保有jdk的存在

2.此處shift +右鍵,開啟powershell

3.執行jdb命令

注意:linux如果連線了,先斷掉,同一時間除錯埠只能有一個連線

.\jdb -connect com.sun.jdi.SocketAttach:hostname=172.20.45.87,port=37500

已經連線上

執行threads命令,檢視執行緒資訊

可以繼續的進行除錯的操作。

如有任何疑問,歡迎討論! QQ:563727470 QQ群:304622338 用高質量的輸出,解答你的煩惱。 高質量問答網站:PKAB https://www.sqslt.cn