`
jejoker
  • 浏览: 25395 次
  • 性别: 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 agent注册为windows服务

    wrapper.java.additional.1=-javaagent:path/to/your/agent.jar ``` 6. **启动服务**:现在,当JSW启动Java应用程序时,它会先加载我们的Java Agent,然后由Agent完成服务注册。之后,你可以通过Windows服务管理...

    java agent使用全解析

    当Java虚拟机启动时,在执行main函数之前,JVM会先运行-javaagent所指定jar包内Premain-Class这个类的premain方法。 java agent的主要作用是提供了一个Class类型的转换器,可以在运行时接受重新外部请求,对Class...

    javaagent使用指南-rickiyang1

    例如,BTrace 和 Arthas 就是利用 Javaagent 来实现动态跟踪和诊断的工具。 总之,Javaagent 提供了一种在运行时修改 Java 应用程序行为的能力,通过 `premain` 方法和 `Instrumentation` 接口,开发者可以实现诸如...

    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 ...

    jmx_prometheus_javaagent-0.12.0.jar

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

    JADE(Java Agent DEvelopment Framework):一个Agent,多Agent系统的开发框架

    在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...

    Java agent使用大全

    Java agent使用大全-编辑再发

    Java Agent源码(带Jar包)

    在源码中,我们可能会看到如何注册和使用Java Agent的示例,这通常涉及到`-javaagent`命令行参数的使用,以及`Premain-Class`和`Agent-Class` manifest条目的配置。同时,源码可能包含如何利用Instrumentation API来...

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...

    skywalking java agent包,用于注入java探针

    SkyWalking 的 Java Agent 就是利用了这种机制,通过在 JVM 启动时添加 `-javaagent` 参数,使得 SkyWalking 能够自动对目标应用进行探针埋点,收集服务间调用的链路信息以及各种性能指标。 以下是关于 SkyWalking ...

    btrace-agent-1.2.jar

    jar包,亲测可用

    btrace1.3.11

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

    java agent 使用及实现代码

    Java Agent 使用及实现代码 Java Agent 是一种可以在字节码层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要讲解 Java Agent 的使用及实现代码。 什么是 Java Agent Java Agent 是...

    btrace调试工具

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

    java agent demo

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

    Java Agent实现系统数据采集

    Java Agent是一种强大的技术,它允许我们在Java应用程序运行时对其进行拦截和增强,而无需修改源代码或重新部署。这种技术在系统监控、日志记录、性能分析、安全审计等多个领域都有广泛应用。本文将深入探讨如何使用...

    net-java-btrace-visualvm.nbm

    net-java-btrace-visualvm.nbm java visualvm btrace 插件

    jdk1.8-Btrace.rar

    【标题】"jdk1.8-Btrace.rar"指的是一个针对Java开发的特殊工具包,它包含了一个名为Btrace的在线检测插件。这个插件专为Java开发者设计,旨在帮助他们在应用程序运行时进行问题的实时定位,而无需停止或重启服务。...

    java script learn

    java script learn java script learnjava script learn java script learn java script learn java script learn

Global site tag (gtag.js) - Google Analytics