跳到主要内容

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 的过程。