uniquetruth / remote-debug-agent

a useful java agent for integration testing
Apache License 2.0
71 stars 25 forks source link

发送 /trace/start 请求后日志里出现WARN #10

Closed yang-yao closed 2 years ago

yang-yao commented 2 years ago

agent注入到服务端,发送 curl http://10.11.16.6/trace/start 后 日志出现如下warn

2022-08-18 19:34:28,900 WARN 10077581 --- [qtp314337396-12] [org.eclipse.jetty.io.ManagedSelector ] [org.eclipse.jetty.util.log.JavaUtilLog:169] : [0||0] java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/eclipse/jetty/server/Request.extractMultipartParameters(Lorg/eclipse/jetty/util/MultiMap;)V @14: invokeinterface
Reason:
Type 'java/lang/Object' (current frame, stack[1]) is not assignable to 'java/lang/Throwable'
Current Frame:
bci: @14
flags: { }
locals: { 'org/eclipse/jetty/server/Request', 'org/eclipse/jetty/util/MultiMap', 'java/lang/Object' }
stack: { 'org/eclipse/jetty/util/log/Logger', 'java/lang/Object' }
Bytecode:
0x0000000: 2a2b b702 5c57 a700 164d b201 be2c b902
0x0000010: 4702 00bb 0249 592c b702 4bbf b1
Exception Handler Table:
bci [0, 6] => handler: 9
bci [0, 6] => handler: 9
Stackmap Table:
same_locals_1_stack_item_frame(@9,Object[#4])
same_frame(@28)

本地测试一点问题没有,接入项目不顺利,磕磕碰碰 哈哈

uniquetruth commented 2 years ago
  1. 这个错误与trace/start请求无关,是你的业务系统的jetty服务器接到请求时,加载org/eclipse/jetty/server/Request这个类的时候报错的。
  2. 错误看起来是因为字节码注入后,class类结构未能通过jvm的校验。
    • 你为什么要把jetty的程序包配置到includes范围内呢?因为只有includes范围内的类才会被本探针注入字节码。
    • 如果你没有将其配置到includes范围内,那么探针是不会修改这个类的,这个报错就跟探针无关。
    • 我本地使用jetty测试,故意将org/eclipse/jetty/server/Request这个类配置到includes范围内,但是注入字节码时发现,并没有extractMultipartParameters方法,因此未能复现该问题。我的jetty版本是jetty-9.4.44.v20210927,请告知一下你试用的版本。
yang-yao commented 2 years ago

我注入命令很简单:-javaagent:/opt/nanyi-agent/remote-debug-agent.jar=includes=cn.chr.et.*,apiport=8098 我们项目也没有用到jetty, 这个不是报错 ,是个warn,在我这里是必现

uniquetruth commented 2 years ago

探针的接口是其内置的jetty服务器提供的,如果你的项目没有使用jetty的话,那么应该是探针用到的jetty的Request类被加载时报的问题。那么如我上文分析,你的includes范围不包含jetty的包,这个警告就跟本探针没有本质关系。
一般来说,类文件格式检查是一个阻断性步骤,如果JVM在验证类格式时出错,会抛出ClassFormatError,从而阻断代码执行。如果你碰到的仅仅是一个警告,并且应用功能不受影响的话,请检查java的全部启动参数,看是否有类似 -noverify 的参数,或其它-javaagent、-agentlib的代理,可以咨询添加这些参数的人,这些参数关联的功能对jetty的适配性是否存在问题。