Intellij外掛之除錯停止生命週期
- Intellij外掛之除錯停止生命週期
- 除錯會話的建立
- 除錯停止
- 除錯會話各個監聽器停止順序
除錯會話的建立
-
除錯會話的建立由
XDebuggerManager.startSessionAndShowTab
介面建立,返回一個型別為 XDebugSession 的例項。它會在 Debug 視窗建立一個除錯會話。XDebugSession 是一個介面,具體實現型別為 XDebugSessionImpl。 -
建立對應的 XDebugProcess 後廣播 XDebuggerManagerListener 監聽的 processStarted 事件。
-
showToolWindowOnSuspendOnly 屬性決定了除錯會話的展示時機,true 則斷點命中時展示,false 則預設展示。
-
之後就是廣播
processHandler#startNotified
事件。再之後就是透過 XDebugProcessStarter 建立 XDebugProcess,一個 XDdebugProcess 繫結一個 XDebugSession。 -
XDebugSession 初始化,初始化時對 XDebugProcess 中的 processHandler 新增了一個監聽,當 processHandler 觸發了 processTerminated 事件將會被廣播回撥。
除錯停止
除錯會話由 XDebugSession 管理,而 XDebugSession 會話繫結了一個 XDebugProcess,XDebugProcess 繫結一個 processHandler,所以當 processHandler 銷燬時 XDebugSession 也就銷燬了。
除錯會話預設是不會自行關閉的,它可以由使用者自己關閉,透過 UI 頁面的入口:
停止除錯原理:
-
首先拿到當前執行所有的 RunContentDescriptor,然後遍歷迴圈構造 HandlerItem 節點
-
HandlerItem 節點有個 stop 介面,點選每個節點都會觸發,最後透過
ExecutionManagerImpl.stopProcess(descriptor)
銷燬 -
從程式碼實現邏輯可以看到最終銷燬的就是一個 processHandler,而除錯會話中的 XDebugProcess 繫結的是一個
DefaultDebugProcessHandler
廣播 ProcessListener 監聽的 processWillTerminate 和 processTerminated 事件
回過頭來我們再看 XDebugSession 中對 XDebugProcess 中 processHandler 的註冊監聽:
stopImpl 中做的事情主要是 XDebugProcess的一個 stopAsync 非同步回撥方法,預設不做任何事情,由使用者自己編寫的 XDebugProcess 實現去實現此方法,onSuccess 後觸發 processStopped 方法:
從上面可以看到首先將會發布
XDebuggerManager.TOPIC
的事件訂閱,然後再從除錯會話管理中移除 XDebugSesion,再然後廣播XDebugSessionListener#sessionStopped
事件,最後把所有 XDebugSessionListener 監聽移除。除錯會話各個監聽器停止順序
所以透過以上分析我們有了以下結論,Intellij 除錯會話停止時隔個監聽廣播銷燬的順序為:
-
processHandler 中的 ProcessListener 監聽器
-
XDebugProcess#stop
方法 -
XDebuggerManagerListener#processStopped
方法 -
XDebugSession 從除錯會話管理(XDebuggerManager)中移除
-
XDebugSessionListener#sessionStopped
方法 -
XDebugSessionListener 監聽移除
-