java的整个调试体系为JDPA,Oracle提供了高级的jdi接口以方便使用java来连接调试程序进行相应的调试。这样,只需要调用相应的java接口,就能进行打断点,记录断点,然后继续运行,清除断点这样基本的断点调试手法了。

1. 连接远程JVM

连接其它JVM称之为附加(attach)操作,当前实现中有2种,如果是本地JVM,则通过Process的方式即可,如果是远程,则需要通过socket的方式才能进行连接。首先是server端需要开启调试agent,并且指定相应的端口,如下启动命令所示:

上面的参数表示监听指定端口(1234),并且当存在断点时并不主动阻塞。

旧的JVM也有使用Xrunjdwp参数的,但不再被建议使用.

客户端即通过相应的connector进行连接,如下的socket连接方式

即设置好主机地址,端口信息,然后即可以进行连接。

2. 开启新断点

相应的请求调用通过requestManager来完成,由刚才成功连接上的vm(VirtualMachine)来获取。由于这里是创建一个代码判断,因此需要获取相应的类,以及具体的断点位置,即相应的代码行。

要获取代码行,则要求源文件(class)中必须存在lineCode信息,即通过在抛出异常时,在异常信息中所指定的行数。这些信息默认情况下编译时会自动输出,但使用编译开关-g:none时,则不会输出。如果没有line信息,则不能创建相应的断点信息。创建信息如下所示:

以上即拿到类A1的第15行的执行段(可能有多个,一行代码可能有多个调用),并设置阻塞模式为线程阻塞,即只有当前线程被阻塞。最终启用之,即成功创建新断点。这里必须将其设置为阻塞,否则将断点记录产生时,由于当前线程继续运行了,将不能拿到相应的信息(表示为产生IncompatibleThreadStateException)

3. 记录断点信息

接下来就是从vm的事件队列中,不断地读取事件并处理断点记录事件即可。由于断点产生时,server端线程被阻塞,因此必须尽可能快地处理断相应的,以避免出现业务阻塞。标准的事件循环如下所示:

上面在事件记录处理完之后,必须将相应线程resume,表示继续运行。

这里获取的event为一个抽象的事件记录,可以通过类型判断转型为具体的事件,这里我们转型为BreakpointEvent,即断点记录,并通过断点处的线程拿到线程帧,进而获取相应的变量信息,并打印记录。如下所示:

上面的value也是抽象形式,也可以通过类型转换以打印不同类型的对象。

4. 断点继续运行

如第2点所示,必须调用相应的event.resume

5. 清除断点

如果记录的信息又足够(如记录了半天的数据了),则可能通过requestManager.deleteEventRequest调用相应的断点,或者调用deleteAllBreakpoints删除所有断点信息。

或者通过vm.dispose直接中断相应的调试连接即可。

unity 线程断点时卡机_Java使用JDI进行线上程序断点信息记录相关推荐

  1. unity 线程断点时卡机_Compute Shader在Unity和UE4中的应用

    该文档为学习文档,如有错误欢迎指正. 1. D3D11 Compute Shader概述 Compute Shader 是一个通用计算 Stage.它利用了GPU的并行处理器,实现大量线程并发执行.它 ...

  2. java行程单解析获取内容_java如何抓取网页上的动态信息,获取源代码后如何分析JS?...

    首先明确我指的动态数据是什么. 名词定义:动态数据在这里指的是网页中由Javascript动态生成的页面内容,即网页源文件中没有,在页面加载到浏览器后动态生成的. 下面进入正题. 抓取静态页面很简单, ...

  3. [Unity脚本运行时更新]C#6新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第4篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  4. [Unity脚本运行时更新]C#5新特性

    洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 本文是该系列<Unity脚本运行时更新带来了什么?>的第3篇. 洪流学堂公众号回复runtime,获取本系列所有文章. Unity2 ...

  5. 使用线程池时一定要注意的五个点

    一.使用线程池在流量突发期间能够平滑地服务降级 很多场景下应用程序必须能够处理一系列传入请求,简单的处理方式是通过一个线程顺序的处理这些请求,如下图: 单线程策略的优势和劣势都非常明显: 优势:设计和 ...

  6. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

  7. Java Review - 创建线程和线程池时建议指定与业务相关的名称

    文章目录 概述 线程 不指定线程名称为何难定位问题 Thread默认的线程名称 指定线程名称 线程池 不指定线程池名称为何难定位问题 指定线程名称 自定义线程名称 小结 概述 在日常开发中,当在一个应 ...

  8. 高并发编程-捕获线程运行时的异常 + 获取调用链

    文章目录 概述 捕获线程运行时的异常 使用场景 UncaughtExceptionHandler 接口 示例 获取调用链 使用线程池的场景: 获取线程运行时异常 概述 捕获线程运行时的异常 我们看下T ...

  9. 在使用线程池时应特别注意对ThreadLocal的使用

    使用ThreadLocal并且有线程池时要特别注意,ThreadLocal是以线程为key的,而线程池里面的线程是会被重新利用的,所以如果有使用线程池并且使用ThreadLocal来保存状态信息时要特 ...

  10. pthread 线程退出时自动释放资源

    线程退出时自动释放资源 今天碰到一个问题:主线程pthread_create一个子线程A,子线程pthread_mutex_lock,然后调用其他的函数fun,最后从fun返回后再pthread_mu ...

最新文章

  1. 假如 IDEA 也加入防沉迷功能...
  2. 为了一个科研idea,博士生们连冥想、巫毒仪式都用上了|Reddit热议
  3. 如何实现高容量大并发数据库服务 | 数据库分布式架构设计
  4. jQuery对表单元素的取值和赋值操作代码
  5. 架构模式: 事务日志跟踪
  6. ora-01034 / ORA-27101 错误.
  7. 仿简书、淘宝等等App的View弹出效果
  8. 【阿里妈妈营销科学系列】第五篇:多渠道组合路径效率评价
  9. Cloud一分钟 | HR SaaS 平台北森云计算E轮融资1亿美金;云学堂宣布完成C轮5000万美元融资...
  10. eslint常规语法检
  11. 给一张表加一个自动编号字段_Python办公自动化|从Word到Excel
  12. Q116:PBRT-V3场景描述文件.pbrt格式解析
  13. 如何隐藏电脑里的文件或者文件夹?
  14. 首届全国智能制造(中国制造2025)创新创业大赛在京启动
  15. 完美平台反复正在连接至服务器,完美世界无法连接服务器是什么原因
  16. 达人评测 i7 12700F和i5 12400F区别 i7 12700F和i5 12400F对比
  17. php写前端还是nodejs,javascript - 新手想在短期内写一个个人博客,是用php还是用nodejs?...
  18. oracle对某两列求和再求和_分手后4个阶段这样挽回,再狠的他也会心软求和
  19. java 设置pdf 编码格式_Java 在PDF中添加条形码
  20. 38. 字符串的排列

热门文章

  1. 树莓派学习路程No.1 树莓派系统安装与登录 更换软件源 配置wifi
  2. CORE网络数据包接收传递过程分析
  3. Jquery 判断IE
  4. IEnumerableIEnumerablestring结构解析通用解决方案(支持指定属性顺序)
  5. cartographer 前端两个方法:相干性匹配与非线性优化;以及回环检测方法:利用了分枝定界的相干性匹配
  6. 基于 Google 搜索的半自动推荐
  7. hadoop复合键排序使用方法
  8. C++--第14课 - 专题二经典问题解析
  9. python实训第一天
  10. GraphQL到底怎么用?看看这个例子就知道了