`
jejoker
  • 浏览: 25366 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Btrace的javaagent参数之script的坑

    博客分类:
  • JAVA
阅读更多

简单来说,这篇文章只是个笔记,纪念我与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应用程序的启动参数设置,特别是`JAVA_OPTS`环境变量和`javaagent`选项,这两个是Java虚拟机(JVM)启动时的关键配置项。`JAVA_OPTS`通常用于传递额外的JVM参数,如...

    java 代理例子 -javaagent,premain方式实现

    在这个包中,`javaagent`接口是关键,它定义了一个`premain`方法,该方法会在目标应用程序启动之前被调用,允许我们在程序加载时进行干预。 `premain`方法的签名如下: ```java public static void premain(String ...

    JavaAgent例子-agentmain方式

    5. 调用`VirtualMachine.loadAgent`,传入JavaAgent的路径以及任何必要的参数。 6. JavaAgent的`agentmain`方法会被调用,此时可以使用`Instrumentation`接口进行代码织入。 7. 最后,记得调用`VirtualMachine....

    javaagent+javassist

    Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...

    jmx_prometheus_javaagent-0.12.0.jar

    代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar

    btrace java线上debug神器

    - **自定义脚本**:BTrace使用一种基于Java的脚本语言,允许开发者编写简单的脚本来定义想要追踪的行为,例如记录特定方法的执行时间、参数和返回值。 - **安全无侵入**:BTrace遵循最小权限原则,仅对指定的方法...

    java项目实现热更源码-javaagent

    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实现的自测联调Mock利器.zip...

    不那么一样的 Java Agent 内存马.zip

    不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马...

    opentelemetry-javaagent-all.jar

    调试!!

    Java agent使用大全

    Java agent使用大全-编辑再发

    javaagent:基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志

    java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...

    snmp java agent工具

    - `conf`: 配置文件夹,可能包含SNMP Agent的配置参数和MIB配置。 - `snmpprojects`: 可能包含了SNMP相关的工程或示例代码。 - `tcs`: 可能是特定的通信服务或测试案例。 - `reference`: 可能包含参考文档或API...

    jmx_prometheus_javaagent-0.13.0.jar

    https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh

    Java Agent入门学习之动态修改代码

    Java Agent入门学习之动态修改代码 Java Agent是一种强大的技术,可以在Java程序中动态地修改代码,实现AOP(Aspect Oriented Programming)编程。通过Java Agent,可以在不修改原始代码的情况下,实现对代码的修改...

    btrace1.3.11

    btrace1.3.11,用来动态跟踪线上java代码的隐藏bug、OOM、GC等问题。

    手把手教你实现一个Java Agent.pdf

    4. 在启动JVM时通过`-javaagent`参数指定Agent的jar路径及参数,或者在运行时通过Attach API动态加载。 这个过程可能涉及的细节很多,包括字节码的理解、选择合适的字节码库、正确处理类的加载顺序等。但一旦熟悉了...

    btrace调试工具

    3. **创建Java Agent**:通过`-javaagent`选项指定BTrace的jar文件和BScript文件。 4. **运行应用**:将上述参数添加到Java命令行,启动或重启应用。 5. **查看结果**:BTrace会在标准输出或指定的日志文件中打印出...

    apache-skywalking-java-agent-8.9.0

    它的Java代理是其核心组件之一,用于收集应用运行时的数据。在这个"apache-skywalking-java-agent-8.9.0"版本中,我们将探讨这个Java代理如何监控JVM服务,并深入理解其相关知识点。 1. **SkyWalking Java Agent**...

    java agent demo

    java -javaagent:/path/to/your/agent.jar=arg1=foo,arg2=bar -cp ... MainClass ``` 3. **使用`javassist`修改字节码**: 在`premain`方法中,你可以使用`javassist`来查找和修改类。首先,加载目标类,然后创建`...

Global site tag (gtag.js) - Google Analytics