通過jdb命令連線遠端除錯的方法
阿新 • • 發佈:2021-12-31
概述
有的時候在判斷是否可以本地連線到遠端的除錯埠,比如是不是網路的限制,還是環境等問題,這個時候可以使用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