简单来说,这篇文章只是个笔记,纪念我与btrace参数拼搏的青春……(好吧……,我似乎不年轻了)
先写结论:windows环境下,javaagent方式的instrument不支持win的全路径方式,这里指script参数,因为他会按 : 进行分隔,带了盘符就会有问题。可以使用scriptdir替代,他会扫描这个文件夹下的所有classes文件,认为都是你的btrace脚本
==== 分割线,想看过程及其他一些说明,可以继续读下面 =========
btrace的场景,大部分情况下可能是运行时attach,一般来说都ok,但是也有极个别的场景下需要启动时就instrument(一直不知道这词怎么翻译……)。
什么样的场景呢?比如说:项目引入了大量jar包,某个jar里面启动了线程池而没有进行关闭……,还是个未命名线程池,这茫茫人海,让我去哪里找……
一般一种可行方案是,可以扫描自己项目所有能加载的类,并在加载的类中(如字节码)扫描是否有线程池类使用。bingo,出来了,可问题是……,他可能是十几个,或者几十个类引用了。然后一个一个翻代码,恐怕效率奇低。就算你排除了一些,剩下十来个,问题是,这些class你自己并没有引用,意味着可能是间接引用,于是乎……,又是一份费时费力的苦差。
这里,我想到了几种方案,这里不一一说了,大体是,可替换jdk的线程池类,使用自己的,打jstack,或者织入到线程池类中,等等等……
这里,我实际采用的方式是btrace,因为btrace非侵入性的debug代码能力非常之强,而且除了runtime阶段instrument以外,他提供了javaagent方式instrument。(javaagent就不展开说了)
于是,我尝试在代码启动时加入javaagent,大概是这样的:
-javaagent:D:/Dev/btrace-bin-1.3.9/build/btrace-agent.jar=noServer=true,debug=true,stdout=true,script=d:/script/Pool.class
结果,brache很愉快的告诉你,d不是预编译的class,然后报xxx/Pool.class file not found。
初步怀疑是btrace代码做了分隔,为了支持多脚本,于是查看btrace源码。果然他做了这个事情,源码如下:
if (script != null) { StringTokenizer tokenizer = new StringTokenizer(script, ":"); if (isDebug()) { debugPrint(((tokenizer.countTokens() == 1) ? "initial script is " : "initial scripts are ") + script); } while (tokenizer.hasMoreTokens()) { loadBTraceScript(tokenizer.nextToken(), traceToStdOut); } }
于是乎……,无解……
于是,看到有另一个参数 scriptdir,然后就指定这个文件夹,把classes文件放到下面就解决了
当然了,使用了这个参数,他会扫描下面的所有文件,并且都认为是btrace脚本,如果不符合规范(如没有@Btrace注解),都会报错,OVER!
另:补充一下,实际上,btrach默认直接 new File(scriptFilePath),如果找不到,会尝试 META-INF/btrace/scriptFilePath 找一次,还不行才会FileNotFound
相关推荐
标题中的"java JAVA_OPTS javaagent"涉及到Java应用程序的启动参数设置,特别是`JAVA_OPTS`环境变量和`javaagent`选项,这两个是Java虚拟机(JVM)启动时的关键配置项。`JAVA_OPTS`通常用于传递额外的JVM参数,如...
在这个包中,`javaagent`接口是关键,它定义了一个`premain`方法,该方法会在目标应用程序启动之前被调用,允许我们在程序加载时进行干预。 `premain`方法的签名如下: ```java public static void premain(String ...
5. 调用`VirtualMachine.loadAgent`,传入JavaAgent的路径以及任何必要的参数。 6. JavaAgent的`agentmain`方法会被调用,此时可以使用`Instrumentation`接口进行代码织入。 7. 最后,记得调用`VirtualMachine....
Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...
代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar
- **自定义脚本**:BTrace使用一种基于Java的脚本语言,允许开发者编写简单的脚本来定义想要追踪的行为,例如记录特定方法的执行时间、参数和返回值。 - **安全无侵入**:BTrace遵循最小权限原则,仅对指定的方法...
2. **指定Agent参数**:在Java应用启动时,通过`-javaagent`参数指定Agent的路径和可选参数。例如:`-javaagent:/path/to/your/agent.jar=param1=value1,param2=value2`。 3. **操作类字节码**:Java Agent接收到...
基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip...
不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马...
调试!!
Java agent使用大全-编辑再发
java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...
- `conf`: 配置文件夹,可能包含SNMP Agent的配置参数和MIB配置。 - `snmpprojects`: 可能包含了SNMP相关的工程或示例代码。 - `tcs`: 可能是特定的通信服务或测试案例。 - `reference`: 可能包含参考文档或API...
https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh
Java Agent入门学习之动态修改代码 Java Agent是一种强大的技术,可以在Java程序中动态地修改代码,实现AOP(Aspect Oriented Programming)编程。通过Java Agent,可以在不修改原始代码的情况下,实现对代码的修改...
btrace1.3.11,用来动态跟踪线上java代码的隐藏bug、OOM、GC等问题。
4. 在启动JVM时通过`-javaagent`参数指定Agent的jar路径及参数,或者在运行时通过Attach API动态加载。 这个过程可能涉及的细节很多,包括字节码的理解、选择合适的字节码库、正确处理类的加载顺序等。但一旦熟悉了...
3. **创建Java Agent**:通过`-javaagent`选项指定BTrace的jar文件和BScript文件。 4. **运行应用**:将上述参数添加到Java命令行,启动或重启应用。 5. **查看结果**:BTrace会在标准输出或指定的日志文件中打印出...
它的Java代理是其核心组件之一,用于收集应用运行时的数据。在这个"apache-skywalking-java-agent-8.9.0"版本中,我们将探讨这个Java代理如何监控JVM服务,并深入理解其相关知识点。 1. **SkyWalking Java Agent**...
java -javaagent:/path/to/your/agent.jar=arg1=foo,arg2=bar -cp ... MainClass ``` 3. **使用`javassist`修改字节码**: 在`premain`方法中,你可以使用`javassist`来查找和修改类。首先,加载目标类,然后创建`...