Intellij外掛之除錯停止生命週期

SnailsH發表於2024-06-09

Intellij外掛之除錯停止生命週期

目錄
  • Intellij外掛之除錯停止生命週期
    • 除錯會話的建立
    • 除錯停止
    • 除錯會話各個監聽器停止順序

除錯會話的建立

  1. 除錯會話的建立由 XDebuggerManager.startSessionAndShowTab 介面建立,返回一個型別為 XDebugSession 的例項。它會在 Debug 視窗建立一個除錯會話。XDebugSession 是一個介面,具體實現型別為 XDebugSessionImpl。

    image-20240609000255650

  2. 建立對應的 XDebugProcess 後廣播 XDebuggerManagerListener 監聽的 processStarted 事件。

    image-20240609000229263

  3. showToolWindowOnSuspendOnly 屬性決定了除錯會話的展示時機,true 則斷點命中時展示,false 則預設展示。

  4. 之後就是廣播 processHandler#startNotified 事件。再之後就是透過 XDebugProcessStarter 建立 XDebugProcess,一個 XDdebugProcess 繫結一個 XDebugSession。

  5. XDebugSession 初始化,初始化時對 XDebugProcess 中的 processHandler 新增了一個監聽,當 processHandler 觸發了 processTerminated 事件將會被廣播回撥。

    image-20240609084146084

除錯停止

除錯會話由 XDebugSession 管理,而 XDebugSession 會話繫結了一個 XDebugProcess,XDebugProcess 繫結一個 processHandler,所以當 processHandler 銷燬時 XDebugSession 也就銷燬了。

除錯會話預設是不會自行關閉的,它可以由使用者自己關閉,透過 UI 頁面的入口:

image-20240609091512012

停止除錯原理:

  1. 首先拿到當前執行所有的 RunContentDescriptor,然後遍歷迴圈構造 HandlerItem 節點

    image-20240609092222568

  2. HandlerItem 節點有個 stop 介面,點選每個節點都會觸發,最後透過 ExecutionManagerImpl.stopProcess(descriptor) 銷燬

    image-20240609091747744

  3. 從程式碼實現邏輯可以看到最終銷燬的就是一個 processHandler,而除錯會話中的 XDebugProcess 繫結的是一個 DefaultDebugProcessHandler

    image-20240609092445107

    image-20240609093021469

    image-20240609092938117

    image-20240609092957033

    廣播 ProcessListener 監聽的 processWillTerminate 和 processTerminated 事件

    image-20240609093052758

    image-20240609093309788

    回過頭來我們再看 XDebugSession 中對 XDebugProcess 中 processHandler 的註冊監聽:

    image-20240609092613978

    image-20240609092646141

    stopImpl 中做的事情主要是 XDebugProcess的一個 stopAsync 非同步回撥方法,預設不做任何事情,由使用者自己編寫的 XDebugProcess 實現去實現此方法,onSuccess 後觸發 processStopped 方法:

    image-20240609093724222

    從上面可以看到首先將會發布 XDebuggerManager.TOPIC 的事件訂閱,然後再從除錯會話管理中移除 XDebugSesion,再然後廣播 XDebugSessionListener#sessionStopped 事件,最後把所有 XDebugSessionListener 監聽移除。

    除錯會話各個監聽器停止順序

    所以透過以上分析我們有了以下結論,Intellij 除錯會話停止時隔個監聽廣播銷燬的順序為:

    1. processHandler 中的 ProcessListener 監聽器

    2. XDebugProcess#stop 方法

    3. XDebuggerManagerListener#processStopped 方法

    4. XDebugSession 從除錯會話管理(XDebuggerManager)中移除

    5. XDebugSessionListener#sessionStopped 方法

    6. XDebugSessionListener 監聽移除

相關文章