Skip to content

JEP 279: Improve Test-Failure Troubleshooting | 改进测试失败排除故障

摘要

在测试失败和超时的情况下自动收集诊断信息,以供进一步排除故障。

目标

收集以下信息,以帮助诊断测试失败和超时:

  • 对于在测试失败或超时后仍在主机上运行的 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 的过程。