***java.lang.instrument断言失败的含义/原因是什么***:";!“未完成的错误”;消息转换方法调用失败?

***java.lang.instrument断言失败的含义/原因是什么***:";!“未完成的错误”;消息转换方法调用失败?,java,gradle,jvm,Java,Gradle,Jvm,使用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 ***: "!error

使用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
这是在Java11上发生的

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)
这个输出不是来自我的代码,它似乎来自JVM。没有列出文件名以前的Java版本似乎有一个与此相关的bug

可能是生成消息的原因

更新:

我查看了所有CI日志,以确定导致此问题的提交。在Json格式化程序的单元测试中跟踪到这段代码 基于Jackson的实用程序

    // 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));
特别是循环依赖项触发JVM输出。我猜Jackson真的被循环依赖绊倒了,但我不明白这为什么会导致JVM断言错误

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

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

下面是一些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

这一信息确实来自中国

这意味着您的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加载)。我的代码中的一个
StackOverflowError
触发了一个新类的加载,然后两个代理也抛出了
StackOverflowError
,但没有捕获它。我创建了,但我开始认为只有JDK中的错误报告需要更改


由于异常源在Java代码中,因此可以附加调试器并在抛出的
StackOverflowerError
上设置断点。您很可能会在代码或Jackson中首先发现一个
StackOverflower错误,您应该修复/报告它。

我在进行递归调用时(没有意识到)得到了这个问题,此外,这个调用有一个try/catch,我捕获了Throwable(可能的最高异常类型)。我的解释是,我的捕获捕获了StackOverflowException(并进一步研究了它),这让整个事情变得疯狂!当我在IntelliJ调试器中运行它时,我无法真正停止线程——不知怎么的,新线程正在生成。我一删除递归调用,一切都很好。

您使用的是Java8吗?什么版本?Java 11,更新的问题。对于投票反对的人,请解释你为什么投票反对?在
行873之间是否缺少一部分?@MichaelKemmerzell我仍然不知道是什么原因,但对我来说,这是由循环数据结构引起的,我使用循环数据结构测试JSON Utils类,使其从Jackson生成特定异常。最终找到了做同样测试的另一种方法。
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844