首页 > 其他分享 >Intellij插件之调试停止生命周期

Intellij插件之调试停止生命周期

时间:2024-06-09 10:11:29浏览次数:29  
标签:插件 生命周期 Intellij 会话 XDebugSession processHandler XDebugProcess 监听 调试

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 监听移除

标签:插件,生命周期,Intellij,会话,XDebugSession,processHandler,XDebugProcess,监听,调试
From: https://www.cnblogs.com/SnailsWalk/p/18239288

相关文章

  • Python+pytest+jenkins 多插件 pdf电子书目录
    第1章pytest入门11.1资源获取 41.2运行Pytest 51.3运行单个测试用例 101.4使用命令行选项 10--collect-only选项 11-k选项 11-m选项 12-x选项 13--maxfail=num 15-s与--capture=method 16-lf(--lastfailed)选项 16--ff(--failed-first)选项 17......
  • Vue第三方库与插件实战手册
    title:Vue第三方库与插件实战手册date:2024/6/8updated:2024/6/8excerpt:这篇文章介绍了如何在Vue框架中实现数据的高效验证与处理,以及如何集成ECharts、D3.js、Chart.js等图表库优化数据可视化效果。同时,探讨了ProgressiveWebApp(PWA)的接入与优化策略,以提升Web应用的......
  • koishi常用插件推荐
    今天给大家做一个常用插件的推荐以下将插件归为几个大类,按类型推荐1.日常相关点歌插件名:koishi-plugin-music-downloadvoice-api功能介绍:语音点歌-搜索并提供QQ音乐和网易云音乐的歌曲,交互后发送语音消息使用说明:指令点歌<歌名>ai画图插件名:koishi-......
  • 还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序
    ......
  • web开发之浏览器扩展插件开发-chrome浏览器扩展插件开发-入门
     一.起步:开始,开发一个浏览器扩展程序:  参考文档: https://developer.chrome.google.cn/docs/extensions/get-started/tutorial/hello-world?authuser=19&%3Bhl=zh-cn&hl=zh-cn 1.配置文档:manifest.json对应文件:新建manifest.json /popup.html/ icon-green.png/ ba......
  • Minecraft Deluxehub 超好用大厅插件 中文文档
    最近发现了一个minecraft服务器大厅插件,可以实现菜单管理、大厅物品管理,掉落伤害等等等好用的大厅功能,不过是英文的配置文件,我自己翻译了一下MinecraftDexluxehub中文文档原插件是纯英文的,大家有需要可以拿走,记得对好版本号,我这里是3.5.5看一下我配置了一下的效果:Deluxeh......
  • [UE 虚幻引擎] DTLoadFbx 运行时加载FBX本地模型插件说明
    本插件可以在打包后运行时动态加载FBX模型。 新建一个Actor并添加一个DTRuntimeFbxComponent。然后直接调用组件的函数LoadFile加载显示模型(注:不支持模型动画)FilePath:加载模型的绝对路径。CreateCollision:是否创建碰撞体。本组件是继承于UProceduralMeshC......
  • 从0开发一个Chrome插件:核心功能开发——背景脚本
    前言这是《从0开发一个Chrome插件》系列的第七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。专栏:从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必要知识从0开发......
  • Vue父子组件生命周期执行顺序
    顺序执行顺序:父组件先创建,然后子组件创建;子组件先挂载,然后父组件挂载,即“父beforeCreate->父create->子beforeCreate->子created->子mounted->父mounted”。在单一组件中,钩子的执行顺序是beforeCreate->created->mounted->…->destroyed,但当父子组件嵌套时,父组件和......
  • vue2使用Clodop插件打印表格,分页,每页显示页头页尾,自定义纸张大小
    一、前往lodop官网,下载插件,下载中心-Lodop和C-Lodop官网主站 这里下载的window64位的,将插件安装好,运行,会看到引入项目第一种、可以直接将script标签放入vue的head中,在项目运行时自动加载。第二种、也可以将js文件下载至本地,通过import引入,前提是将CLODOP对象export出......