*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed 的含义/原因是什么?

ams*_*ams 28 java jvm gradle

使用 gradle 运行我的测试时,我开始在控制台上获得以下输出。此输出来自 JVM,而不是我的代码。Kotlin DSL 用于配置我的 gradle 构建。

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at  line: 873
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at  line: 873
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at  line: 873
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at  line: 873
Run Code Online (Sandbox Code Playgroud)

这是在 Java 11 上发生的

java --version
openjdk 11.0.6 2020-01-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.6+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.6+10, mixed mode)
Run Code Online (Sandbox Code Playgroud)

这个输出不是来自我的代码,它似乎来自 JVM。没有列出以前版本的 Java 的文件名似乎有一个与此相关的错误https://bugs.openjdk.java.net/browse/JDK-8061621

JPLISAgent.c 第 873 行可能是生成消息的原因。

更新:

我浏览了我所有的 CI 日志来确定引入这个问题的提交。在基于 Jackson 的 Json 格式化程序实用程序的单元测试中将其追踪到此代码。

    // try with a circular dependencies
    Node a = new Node("a");
    Node b = new Node("b");
    a.setChild(b);
    b.setParent(a);

    assertThatExceptionOfType(JsonUtilsException.class).isThrownBy(() -> JsonUtils.toJson(a));
Run Code Online (Sandbox Code Playgroud)

特别是循环依赖会触发 JVM 输出。我猜杰克逊真的被循环依赖绊倒了,但我不明白为什么这会导致 JVM 断言错误。

问题: - 此警告/错误的含义是什么?- 这个错误的典型原因是什么,JVM 中的断言失败?

Dan*_*dei 9

该消息确实来自JPLISAgent.c:873

这意味着您的 JVM 有一个代理实现java.lang.instrument.ClassFileTransformer,并且方法transform(java.lang.Module, java.lang.ClassLoader, java.lang.String, java.lang.Class<?>, java.security.ProtectionDomain, byte[])抛出了异常。

就我而言,我同时拥有 BlockHound 和 ByteBuddy(由 BlockHound 加载)。我的代码中的AStackOverflowError触发了新类的加载,然后两个代理也抛出StackOverflowError并没有捕获它。我为 ByteBuddy 创建了一个问题,但我开始认为只有 JDK 中的错误报告需要更改。

由于异常源位于 Java 代码中,因此您可以附加调试器并在抛出的异常上设置断点StackOverflowErrorStackOverflowError您很可能首先在代码中或杰克逊中找到 a ,您应该修复/报告该问题。


Gab*_*iel 3

您的测试正在生成非常大的异常原因链。

下面是一些 Scala 代码,它生成一个很长的异常原因链,然后抛出它:

val iter = Iterator.from(0).map(_.toString).map(new Exception(_))
val es = iter.take(1024 * 1024).toSeq
for {
  (e0, e1) <- es.zip(es.tail)
} {
  e0.initCause(e1)
}
//es.last.initCause(es.head) //uncomment this line for extra fun
throw es.head
Run Code Online (Sandbox Code Playgroud)

这产生相同的

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
Run Code Online (Sandbox Code Playgroud)

编辑:

我相信这是上面 Scala 代码的 java 等价物:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
Run Code Online (Sandbox Code Playgroud)