Byteman规则bmcheck校验通过但bmsubmit提交报错找不到已加载规则
1 提交命令参数错误排查
你执行bmsubmit.sh时加了-u参数,这个参数的作用是卸载指定脚本对应的已加载规则,而非加载规则。如果是首次提交规则,直接去掉-u参数即可:
jboss/byteman/byteman-download-4.0.17/bin/bmsubmit.sh /somewhere/scripts/InefficientIOStreamHandling.btm
如果是确认规则已经加载过、想要卸载时报这个错,再排查下面的问题:
2 目标JVM Byteman Agent配置排查
- 检查目标JVM启动时是否正确挂载了Byteman Agent,基础配置是否正确:
必须的启动参数至少包含:-javaagent:<byteman安装路径>/lib/byteman.jar=port:9091,listener:true - 你要注入的是
java.io包下的JDK系统类,需要额外添加参数允许Byteman修改系统类:-Dorg.jboss.byteman.transform.all=true - JDK11属于模块化JDK,需要添加以下启动参数规避模块化访问限制:
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED - 如果目标JVM在挂载Byteman Agent前就已经加载过
FilterInputStream、FilterOutputStream两个类,需要开启类重转换能力才能注入规则:-Dorg.jboss.byteman.agent.retransform=true
3 日志级别调整排查
给目标JVM添加Byteman调试参数,输出详细的规则加载日志,方便定位具体失败原因:
-Dorg.jboss.byteman.debug=true -Dorg.jboss.byteman.verbose=true
开启后重新提交规则,查看目标JVM控制台输出的规则加载、注入阶段的具体错误即可定位根因。
4 版本兼容性校验
Byteman 4.0.17对JDK11的兼容性存在部分已知问题,你可以尝试升级到Byteman 4.0.20及以上版本,这些版本对JDK11的适配修复更完善。
内容的提问来源于stack exchange,提问作者Jeremy Whiting
相关产品推荐
相关产品推荐

