如何证明错误不是我的Java代理或如何调试它?

时间:2016-09-21 20:06:38

标签: java java-bytecode-asm javassist javaagents

我们的一位客户与我联系,抱怨他在使用我们的Java代理时遇到了以下JRE崩溃。

根据错误(如下),崩溃是在本机代码上,因为有问题的框架被归类为' C'。

我做了一些谷歌搜索,似乎有一些开放的错误在这个问题上使用java代理时非常相似。请参阅以下链接:

https://bugs.openjdk.java.net/browse/JDK-8094079

https://bugs.openjdk.java.net/browse/JDK-8041920

问题是客户不愿意升级JDK,因为他提到他有其他运行时没有任何问题的java代理。

有关如何解决此问题的任何建议?

为了完整性,请查看他发送的错误:

cat /opt/somecompany/apps/some-product-platform/some-product-name/hs_err_pid6697.log | grep sealights
7fe19d9b5000-7fe19d9d7000 r--s 00401000 ca:01 3539943                    /opt/somecompany/apps/some-product-platform/some-product-name/sealights/sl-test-listener.jar
jvm_args: -javaagent:/opt/somecompany/apps/some-product-platform/hawtio/jolokia-jvm.jar=config=/opt/somecompany/apps/some-product-platform/some-product-name/conf/jolokia-agent.properties -javaagent:/opt/somecompany/apps/some-product-platform/some-product-name/agent/newrelic.jar -DNEWS_product_HOME=/opt/somecompany/apps/some-product-platform/some-product-name -Dsl.environmentName=Functional Tests DEV-INT -Dsl.customerId=myCustomer -Dsl.appName=ABB-product-name -Dsl.server=https://my-server.com -Dsl.includes=com.somecompany.* -javaagent:/opt/somecompany/apps/some-product-platform/some-product-name/sealights/sl-test-listener.jar -Dlog.dir=/opt/somecompany/apps/some-product-platform/logs -Dlog.threshold=debug
java_class_path (initial): some-product-name.jar:/opt/somecompany/apps/some-product-platform/hawtio/jolokia-jvm.jar:/opt/somecompany/apps/some-product-platform/some-product-name/agent/newrelic.jar:/opt/somecompany/apps/some-product-platform/some-product-name/sealights/sl-test-listener.jar

JVM crash message:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000000000000055, pid=6697, tid=140604865455872
#
# JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  0x0000000000000055
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /opt/somecompany/apps/some-product-platform/some-product-name/hs_err_pid6697.log
Compiled method (c1)  565518 13823       1       sun.invoke.util.ValueConversions::identity (2 bytes)
total in heap  [0x00007fe1a76857d0,0x00007fe1a7685a48] = 632
relocation     [0x00007fe1a76858f8,0x00007fe1a7685918] = 32
main code      [0x00007fe1a7685920,0x00007fe1a7685980] = 96
stub code      [0x00007fe1a7685980,0x00007fe1a7685a10] = 144
metadata       [0x00007fe1a7685a10,0x00007fe1a7685a18] = 8
scopes data    [0x00007fe1a7685a18,0x00007fe1a7685a20] = 8
scopes pcs     [0x00007fe1a7685a20,0x00007fe1a7685a40] = 32
dependencies   [0x00007fe1a7685a40,0x00007fe1a7685a48] = 8
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#

1 个答案:

答案 0 :(得分:0)

在聊天讨论中询问更多详细信息后,我认为此错误与ASM AdviceAdapter与同一应用程序中的其他代理组合使用有关。如果其他代理期望某个类的特定结构,则使用该适配器可能会重新排序所讨论的类的变量索引,而其他代理不会预期。当VM跳过内置类的验证时,会导致硬崩溃。

解决方案是将仪器更改为不使用AdviceAdapter