• 使用btrace 分析java 应用


    btrace 是一个类型安全的java 平台动态追踪工具(类似dtrace,bpf。。。),以下是一个简单的试用
    备注: 目前btrace 对于jdk 9 以及以上版本的支持有问题,而且团队暂时也没有支持的打算

    项目准备

     
    ├── README.md
    ├── btrace-app
    ├── pom.xml
    └── src
    └── main
    └── java
    └── com
    └── dalong
    └── Application.java
    └── btrace-scripts
        └── Simple.java
    • 代码说明
      btrace-app 为需要追踪的项目,一个maven 项目,使用flat 模式的部署
      Application.java 代码
     
    package com.dalong;
    import java.io.IOException;
    import java.util.Random;
    public class Application {
        private String name;
        public Application(String name) {
            super();
            this.name = name;
        }
        public String toString() {
            return this.name;
        }
        public int add(int a, int b) {
            Test test = new Test();
            int result = 0;
            try {
                result = test.add(a, b);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
        class Test {
            public int add(int a, int b) throws IOException {
                if (a > 50 && a < 80) throw new IOException("this is a exception!");
                return a + b;
            }
        }
        public static void main(String[] args) {
            Random random = new Random();
            Application demo = new Application("this is a Demo1 instace");
            while (true) {
                int a = random.nextInt(100);
                int b = random.nextInt(100);
                int c = demo.add(a, b);
                System.out.println("a:" + a);
                System.out.println("b:" + b);
                System.out.println("a+b:" + c);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.dalong</groupId>
        <artifactId>btrace-learning</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <encoding>UTF-8</encoding>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
        <build>
            <finalName>btrace-learning-app</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <!-- Run shade goal on package phase -->
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <!-- add Main-Class to manifest file -->
                                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>com.dalong.Application</mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    btrace script 代码,这个实际上就是一个普通的java 代码(也可可以maven 进行代码管理,同时使用ide 自动提示)
    Simple.java

    import com.sun.btrace.annotations.*;
    import static com.sun.btrace.BTraceUtils.*;
    /**
     * This script traces method entry into every method of 
     * every class in com.dalong.Application! Think before using 
     * this script -- this will slow down your app significantly!!
     */
    @BTrace public class Simple {
        @OnMethod(
            clazz="/.*/",
            method="/.*/",
            location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))
        public static void m(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {
            print(Strings.strcat("entered ", probeClass));
            println(Strings.strcat(".", probeMethod));
        }
    }

    运行

    • 构建项目
    cd btrace-app
    mvn clean package
    java -jar target/btrace-learning-app.jar
    • 查看进程id
      可以使用jcmd
    • 运行btrace 脚本
    btrace -v <pid> Simple.java
    • 效果

    说明

    以上是一个简单的使用,btrace 的功能还是很强大的,支持对于新版本jdk 暂不支持,对于的agent boot client 都已经提供maven 包了
    我们可以方便在项目中使用,阿里的arthas 也是一个很不错的工具,强大,系统开销比较小

    参考资料

    https://github.com/btraceio/btrace

  • 相关阅读:
    团队项目
    四则运算
    关于软件工程的问题
    自我介绍
    各种排序
    2017年03月14日 新模块投产日记
    第一发和技术无关的博客
    分享一款好用的PHP下ID混淆插件
    批量抓取cisco设备配置脚本编写(expect/sed/awk/shell)
    ntp/heartbeat/postfix/dns故障处理记录
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/12144482.html
Copyright © 2020-2023  润新知