java - 使用 BCEL 时出现错误 "java.lang.VerifyError: StackMapTable error: bad offset"

标签 java tomcat jvm instrumentation bcel

我正在使用 BCEL 进行 Java 检测。我的 Java 代理正在针对一些在 tomcat8.0 服务器上运行的 Java webapp 进行测试。如果我不对 JVM 中的每个类加载进行检测(或者不对以 java、javax... org.apache/* 开头的包进行检测)那么它工作正常..

但如果我在 tomcat(package org.apache/*)上进行检测,则会收到“StackMapTable 错误:偏移量错误”错误。

 2015-05-30 20:11:44 Commons Daemon procrun stderr initialized
 java.lang.VerifyError: StackMapTable error: bad offset
 Exception Details:
 Location:
  org/apache/catalina/startup/Bootstrap.createClassLoader(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/ClassLoader; @0: new
Reason:
 Invalid stackmap specification.
 Current Frame:
 bci: @36
 flags: { }
 locals: { 'org/apache/catalina/startup/Bootstrap', 'java/lang/String', 'java/lang/ClassLoader', 'java/lang/String' }
stack: { }

 Bytecode:
 0x0000000: bb00 1259 b700 132b 3a10 1402 1219 10b8
 0x0000010: 0208 1910 b600 1412 153a 1014 0214 1910
0x0000020: b802 0819 10b6 0014 b600 163a 1014 0216
0x0000030: 1910 b802 0819 10b8 0017 4e2d c600 102d
0x0000040: 1218 3a0d 190d b600 1999 0005 2cb0 2a2d
0x0000050: 3a10 1402 1819 10b8 0208 1910 b600 1a4e
0x0000060: bb00 1b59 b700 1c3a 042d 3a10 1402 1a19
0x0000070: 10b8 0208 1910 b800 1d3a 0519 053a 0619
0x0000080: 06be 3607 0336 0815 0815 07a2 0119 1906
0x0000090: 1508 323a 09bb 001e 5919 093a 1014 021c
0x00000a0: 1910 b802 0819 10b7 001f 3a0a 1904 bb00
0x00000b0: 2059 1909 b200 213a 0b3a 1014 021e 1910
0x00000c0: b802 0819 1019 0bb7 0022 3a0d 190d b900
0x00000d0: 2302 0057 a700 ca3a 0a19 0912 253a 1014
0x00000e0: 0220 1910 b802 0819 10b6 0026 9900 4919
0x00000f0: 0903 1909 b600 2712 25b6 0027 6436 0f36
0x0000100: 0e15 0e15 0fb6 0028 3a09 1904 bb00 2059
0x0000110: 1909 b200 293a 0b3a 1014 0222 1910 b802
0x0000120: 0819 1019 0bb7 0022 3a0d 190d b900 2302
0x0000130: 0057 a700 6c19 0912 2a3a 1014 0224 1910
0x0000140: b802 0819 10b6 0026 9900 2e19 04bb 0020
0x0000150: 5919 09b2 002b 3a0b 3a10 1402 2619 10b8
0x0000160: 0208 1910 190b b700 223a 0d19 0db9 0023
0x0000170: 0200 57a7 002b 1904 bb00 2059 1909 b200
0x0000180: 2c3a 0b3a 1014 0228 1910 b802 0819 1019
0x0000190: 0bb7 0022 3a0d 190d b900 2302 0057 8408
0x00001a0: 01a7 fee6 1904 2c3a 113a 0c19 0c19 11b8
0x00001b0: 002d b0                                
Exception Handler Table:
bci [149, 212] => handler: 215
Stackmap Table:
append_frame(@36,Object[#191])
same_frame(@38)
full_frame(@71,{Object[#192],Object[#191],Object[#193],Object[#191],Object[#194],Object[#129],Object[#129],Integer,Integer},{})
full_frame(@119,{Object[#192],Object[#191],Object[#193],Object[#191],Object[#194],Object[#129],Object[#129],Integer,Integer,Object[#191]},{Object[#195]})
same_frame(@173)
same_frame(@206)
chop_frame(@226,1)
chop_frame(@232,3)

我知道 tomcat 在检测开始之前正在运行。但根据运行时检测,检测仅在类即将加载时发生,而不是在加载后发生。由于 tomcat 已经在运行,因此这些类已经在 J​​VM 中,我只检测引入 JVM 的新类,因此 tomcat 是否无关紧要是否正在运行,因为我没有接触 JVM 中已有的类。有人知道吗?

最佳答案

尝试在运行应用程序时添加 "-XX:-UseSplitVerifier" JVM 参数,这可能会解决您的问题。

关于java - 使用 BCEL 时出现错误 "java.lang.VerifyError: StackMapTable error: bad offset",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30547854/

相关文章:

java - Java 函数的递归版本在第一次调用时比迭代慢,但在调用之后更快。为什么是这样?

java - 如何将外部源代码传递给java中的线程?

java - java字节码是独立于CPU还是独立于OS?

java - 创建maven项目

java - Kotlin 使用 JDK 模块

spring - HTTP 状态 500 - servlet 调度程序的 Servlet.init() 抛出异常

java - PSQLException 未被捕获

java - 通过网络服务器注册证书

java - 当 SQL 字符串获取 'SYSDATE' 作为字符串参数传递时,Spring Data Access 异常

java - android程序中的 sleep 函数