JEP 279:改进测试失败故障排除
概括
自动收集诊断信息,在测试失败和超时时可用于进一步故障排除。
目标
收集以下信息以帮助诊断测试失败和超时:
- 对于测试失败或超时后仍在主机上运行的 Java 进程:
- C 和 Java 堆栈
- 核心转储(Windows 上的小型转储)
- 堆统计
- 环境信息:
- 正在运行的进程
- CPU 和 I/O 负载
- 打开文件和套接字
- 可用磁盘空间和内存
- 最近的系统消息和事件
我们将开发一个提供此功能的库,并将库源代码与产品代码放在一起。
动机
当没有有关测试环境的信息时,很难排除间歇性测试失败的问题。此类测试失败通常取决于测试执行顺序和并发性,这使得重现它们变得极其困难。
描述
目前,测试工具中有两个扩展点jtreg
。第一个是超时处理程序,它jtreg
在测试超时时运行 。第二个是观察者,它实现了观察者设计模式来跟踪测试运行中的不同事件。我们将使用这些扩展点来收集诊断信息并为jtreg
.
有关环境和非 Java 进程的信息将通过运行特定于平台的命令来收集。收集关于Java进程的信息将通过由JEP 228大量扩展的可用诊断命令来完成,例如,print_vm_state
收集类似于hs_err
文件的信息的命令。收集到的信息将与测试结果一起存储以供以后检查。finishedTest
当测试失败时,观察者将收集有关事件的信息。
由于测试可能会创建其他进程,因此将收集有关测试进程及其子进程的信息。为了找到此类进程,该库将创建一个进程树,其中原始测试进程位于根部。
库源将放置在test
顶级存储库的目录中,并且将更新 makefile 以构建它们并将它们捆绑为测试包的一部分。
测试
我们将安排使用该库的定期测试。当结果和测试执行变得稳定时,我们将将该库的使用扩展到其他组件。
风险和假设
- _执行某些命令可能挂起的风险:_为了最大限度地降低这种风险,命令将仅在指定的时间内执行,并在此之后中断。
- _主机上的磁盘空间不足:_计划是归档信息、限制保存的信息量,并在信息收集之前检查可用磁盘空间。
- _平台或主机上不可用的工具:_如果某个工具在特定主机或平台上不可用,则将跳过依赖于缺失工具的命令,并将警告消息添加到日志文件中。另一种可能的解决方案是从已知的工具存储库下载所需的工具。
- _系统资源耗尽:_某些故障可能会导致不同类型的系统资源(CPU、内存、磁盘空间等)耗尽或由资源锁定引起。由于在这些情况下无法运行命令来收集信息,因此将跳过命令执行以防止系统进一步降级。
- 在 Java 中获取进程树:在 Java 中获取进程树需要JEP 102中描述的新进程 API 。使用被测 JDK 作为稳定 JDK(即运行
jtreg
测试工具的 JDK)可能会干扰测试结果。为了缓解这个问题,我们将开发一种替代的流程树实现。该实现将简化将该项目向后移植到 JDK 8 的过程。