`
qindongliang1922
  • 浏览: 2184449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117546
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125934
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59928
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71305
社区版块
存档分类
最新评论

Java程序排查问题利器之Btrace

    博客分类:
  • JAVA
阅读更多


(一)Btrace的介绍

BTrace是Java的安全可靠的动态跟踪工具。 他的工作原理是通过 instrument + asm 来对正在运行的java程序中的class类进行动态增强,可以在不用重启的情况下监控系统运行情况,方便的获取程序运行时的数据信息,如方法参数、返回值、全局变量和堆栈信息等,并且做到最少的侵入,占用最少的系统资源。


正如上面描述的一些特性,所以btrace一般是用来排查生产环境jvm问题的一款利器,使用它不用再担心应用程序的日志打的不够全,不够细,也不用为了排查问题一遍遍的重启程序。







(二)Btrace的一些限制

由于Btrace会把脚本逻辑直接侵入到运行的代码中,所以在使用上做很多限制:

1、不能创建对象

2、不能使用数组

3、不能抛出或捕获异常

4、不能使用循环

5、不能使用synchronized关键字

6、属性和方法必须使用static修饰

此外不恰当的使用BTrace可能导致生产程序直接挂掉,所以在上生产环境之前,务必在开发环境充分验证脚本的正确性。


(三)Btrace能干什么

(1)分析任意接口或者方法的耗时情况

(2)分析不断的添加数据时,Map的扩容情况

(3)分析那个方法里面调用了System.gc()方法,并打印出其调用栈

(4)某些方法抛出异常时,分析其运行参数

(5)统计一些接口的调用次数

(6)分析一些方法的代码是否执行到了某一行

(7)..........


注意上面的所有操作,都是监控正在运行中的程序,基本不会产生任何影响。


(四)Btrace的安装


(1)从github上下载最新的二进制包 ,版本是1.3.10.2

wget https://github.com/btraceio/btrace/releases/download/v1.3.10.2/btrace-bin-1.3.10.2.tgz

(2)解压到指定路径


(3)设置环境变量
````
BTRACE_HOME=/root/btrace
export BTRACE_HOME
export PATH=$PATH:$BTRACE_HOME/bin
````


(4)验证安装是否成功

````
[root@es1 ~]# btrace --version
BTrace v.1.3.10 (20171121)
````


(5)查看btrace的帮助文档
````
[root@es1 build]# btrace
Usage: btrace <options> <pid> <btrace source or .class file> <btrace arguments>
where possible options include:
  --version             Show the version
  -v                    Run in verbose mode
  -o <file>             The path to store the probe output (will disable showing the output in console)
-u                    Run in trusted mode
  -d <path>             Dump the instrumented classes to the specified path
  -pd <path>            The search path for the probe XML descriptors
  -classpath <path>     Specify where to find user class files and annotation processors
  -cp <path>            Specify where to find user class files and annotation processors
  -I <path>             Specify where to find include files
  -p <port>             Specify port to which the btrace agent listens for clients
  -statsd <host[:port]> Specify the statsd server, if any
````


(五)Btrace使用的一个例子


注意btrace在maven上发布的jar,版本非常低,都是几年前的版本了,如果要编写btrace脚本,建议把安装目录下三个核心jar直接拷贝到工程中临时使用即可,如果想要随时使用,也可以将其上传到你们公司的maven私服上。
````
[root@es1 btrace]# ll build/
总用量 1572
-rw-r--r--. 1 root root 460271 12月 16 00:44 btrace-agent.jar
-rw-r--r--. 1 root root 358679 12月 16 00:44 btrace-boot.jar
-rw-r--r--. 1 root root 785219 12月 16 00:44 btrace-client.jar
````


(1)在使用btrace之前,我们先需要写一个简单的java程序,模拟成是线上正在跑的程序

代码比较简单,就是每隔随机的时间,随机生成两个整数,进行求和:
````
package com.test;
import java.util.Random;

public class BtraceTest  {

    public static Random random=new Random();

    public int add (int a, int b)   {
        int sum=a+b;
        System.out.println("和:"+sum);
        return a+b;
    }

    public void run(){
        try {
            while (true) {
                add(random.nextInt(10), random.nextInt(10));
                Thread.sleep(random.nextInt(10) * 100);
            }

        }catch (Exception e){
            e.printStackTrace();
        }
    }


    public static void main(String[] args)     {
        new BtraceTest().run();

    }

}


````


(2)主程序已经有了,下面就需要我们写btrace脚本,来监控"我们的线上程序了"
注意,需要在工程里面引入上面提到的3个jar。

监控的代码如下:
````
package samples;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.annotations.*;
import com.sun.btrace.annotations.Export;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class OnlineDebug {

    @OnExit//当成程序退出时,执行一些命令
    public static void onexit(int code) {
        println("BTrace program exits! with code: " + code);
    }

    @Export //可以用来统计调用次数
    public static long counter;

    @OnMethod(clazz="com.test.BtraceTest", method="add",
            location=@Location(value=Kind.RETURN))
    public static void m(@Self Object self, int a,int b,@Return int result,@Duration long time) {
        BTraceUtils.println("参数: a: "+a+"  b: "+b);
        BTraceUtils.println("花费时间:  "+time*1.0/1000+"ms");
        jstack();//打印堆栈信息
        counter++;
    }

    @OnEvent("1")//通过事件触发,打印当前的程序调用次数
    public static void setL1() {
        BTraceUtils.println("executor count:  "+counter);
    }

    //监控程序是否走到第22行代码
    @OnMethod(clazz = "com.test.BtraceTest", location = @Location(value = Kind.LINE, line = 22))
    public static void onBind() {
        println("执行到第22行");
    }

    //每隔指定时间打印一下调用次数
     @OnTimer(5000)
    public static void run(){
        BTraceUtils.println("executor count:  "+counter);
    }

//    //慎用 监控程序里面是否调用了,java.lang下面的一些类或方法
//    @OnMethod(clazz="/java\\.lang\\..*/", method="/.*/")
//    public static void swingMethods( @ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {
//        print("entered " + probeClass + "."  + probeMethod);
//    }
}

````



(六)模拟测试

经过步骤五,我们已经准备好了模拟程序和监控脚本,下面来部署测试下:

(1)首先,通过maven将模拟程序打包成一个jar

(2)选择一台linux机器将jar包上传

(3)执行命令,启动模拟程序
````
java -cp  xxx.jar com.test.BtraceTest
````

linux终端输出内容如下:
````
和:8
和:11
和:3
和:12
和:14
和:15
和:8
和:2
和:8
和:7
和:18
和:4
````


(4)打开另一个linux终端部署监控脚本OnlineDebug.java到指定目录

赋予执行权限:
````
chmod +x OnlineDebug.java
````
执行jps命令,查看模拟程序的进程id

启动监控脚本:
````
btrace 2139 OnlineDebug.java 
````


等待几秒后,控制台输出如下:

````
参数: a: 0  b: 8
花费时间:  101.973ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 3  b: 4
花费时间:  116.611ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 0  b: 2
花费时间:  113.168ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 7  b: 7
花费时间:  113.434ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 6  b: 1
花费时间:  181.184ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 7  b: 6
花费时间:  190.881ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
executor count:  44
````


可以看到监控脚本已经生效,成功获取到了模拟程序的内部参数,以及执行时间等。此刻另一个终端的模拟程序还在
正常运行,但内部其实已经被增强了。

如何退出监控脚本?

非常简单,执行ctrl+c命令,选择1退出即可:
````
参数: a: 9  b: 9
花费时间:  246.743ms
com.test.BtraceTest.add(BtraceTest.java:11)
com.test.BtraceTest.run(BtraceTest.java:17)
com.test.BtraceTest.main(BtraceTest.java:28)
参数: a: 3  b: 1
花费时间:  251.039ms
^CPlease enter your option:
        1. exit
        2. send an event
        3. send a named event
        4. flush console output
1
````






总结:

通过上面的例子,相信大家可以感受到btrace的强大,用其来排查正在运行的程序问题非常方便,感兴趣的朋友们可以自己试一试。


参考链接:

https://github.com/btraceio/btrace/wiki/BTrace-Annotations

https://yq.aliyun.com/articles/7569

https://www.jianshu.com/p/93e94b724476

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
0
0
分享到:
评论

相关推荐

    java在线问题排查利器之Btrace&Greys1

    本文将介绍两款强大的Java在线问题排查工具——Btrace和Greys,它们能够帮助开发者在不重启服务的情况下,实时地跟踪和分析代码执行情况。 1. Btrace 是一个开源的Java诊断工具,它利用了Java的Instrumentation API...

    Java诊断利器Arthas排查问题实践.pptx

    Java 诊断利器 Arthas 排查问题实践 Arthas 是 Alibaba 开源的 Java 诊断工具,于 2018 年 9 月开源,目前在 Github 上获得了 11,000 多个星标。 Arthas 的主要功能特性包括查看类加载情况、反编译类、热更新类、...

    Java常见问题排查

    ### Java常见问题排查 #### NoSuchMethodException **出现原因:** `NoSuchMethodException`异常通常发生在尝试通过反射机制调用类的方法时,该类没有对应签名的方法。这可能是因为类库版本不一致导致方法签名的...

    btrace java线上debug神器

    **BTrace:Java线上调试利器** BTrace是Java开发者在生产环境中进行问题排查的一个强大工具。它无需修改或重新部署代码,就能实时地对运行中的Java应用程序进行动态追踪,帮助我们收集必要的信息,如方法调用、性能...

    Java程序性能优化

    《Java程序性能优化:让你的Java程序更快、更稳定》以Java性能调优为主线,系统地阐述了与Java性能优化相关的知识与技巧。《Java程序性能优化:让你的Java程序更快、更稳定》共6章,先后从软件设计、软件编码、JVM调优...

    Java线上故障排查方案(2).pdf

    本文档围绕Java线上故障排查提供了详尽的方案和知识点,覆盖了从问题定位到解决方案的多个方面。 首先,了解Java线上常见问题的分类是非常重要的。在生产环境中,问题可大致分为系统异常和业务异常两大类。系统异常...

    JAVA线上问题排查和工具.pdf

    JAVA线上问题排查和工具 内容详细 结合实际工作 贴合实际

    btrace安装包

    **正文** BTrace是一款强大的Java诊断工具,专用于实时、安全地进行生产环境中的应用程序性能监控和故障...正确安装和使用BTrace,能够显著提高问题定位的效率,降低运维成本,是每个Java开发者和运维人员的必备利器。

    BTrace-一个用于Java平台的安全动态的跟踪工具

    BTrace将这种能力引入到了Java世界,使得开发者可以对Java应用程序进行细粒度的性能分析和故障排查。通过BTrace,我们可以追踪方法调用、监控对象创建、检测锁竞争等关键操作,这对于性能优化和问题定位来说极其宝贵...

    Java虚拟机调优及问题排查手册.docx

    Java虚拟机调优及问题排查手册 本手册主要介绍Java虚拟机(JVM)的调优和问题排查解决方案。该手册涵盖了JVM排查、数据库连接排查、堆栈快照排查等多方面的内容。 JVM排查 JVM排查是指通过各种命令和工具来排查...

    性能工具之Java调试工具BTrace入门(csdn)————程序.pdf

    【Java调试工具BTrace入门】 在Java开发过程中,遇到应用程序性能问题或需要进行问题定位时,通常会依赖日志分析...正确理解和运用BTrace,可以帮助开发者更高效地排查和解决Java应用中的问题,提升系统性能和稳定性。

    java程序性能优化

    java程序性能优化Java是目前应用最为广泛的软件开发平台,学习针对Java程序的优化方法有重要的现实意义。《Java程序性能优化:让你的Java程序更快、更稳定》以Java性能调优为主线,系统地阐述了与Java性能优化相关的...

    java程序做成Windows服务运行

    这对于调试和问题排查至关重要。 7. **安全性与权限** 由于Windows服务通常以更高的权限运行,你需要确保服务的安全配置正确,避免不必要的权限暴露。在XML配置文件中,可以指定服务运行的账户和密码。 总结,将...

    Java问题定位技术.zip_Java 问题排查_Java问题定位技术_定位_定位系统

    Java问题定位技术是Java开发者日常...通过熟练掌握这些技能,开发者可以更有效地排查和解决Java应用程序中的问题。而"Java问题定位技术.pdf"这份文档,很可能就是对这些知识的详细介绍和实践指导,值得深入学习和研究。

    JAVA程序设计与问题解决(电子书)

    《JAVA程序设计与问题解决》是一本全面介绍Java编程语言的教材,分为基础篇和高级篇,由美国知名计算机科学家Walter Savitch撰写,并有中文翻译版本。这本书旨在帮助读者从零开始学习Java编程,逐步掌握解决问题的...

    java程序写入服务

    2. **日志记录**:服务运行时产生的日志应保存到指定文件,方便排查问题。 3. **资源管理**:合理配置JVM参数,避免内存泄漏或资源占用过高。 4. **权限设置**:确保服务运行时具有必要的文件读写和网络访问权限。...

    btrace.jar

    【btrace.jar】是一款强大的Java在线诊断工具,它允许开发者在不重启应用程序的情况下,实时地对Java程序进行动态追踪和分析。这个工具的核心价值在于它能够帮助我们在生产环境中无侵入地解决性能问题或者追踪特定的...

    Btrace资源

    总的来说,Btrace是一个强大的Java调试和监控工具,通过这个资源包,你可以轻松地在运行中的Java应用程序上实施动态跟踪,提高问题定位和性能优化的效率。然而,为了充分利用这些工具,你需要学习Btrace的语法和使用...

Global site tag (gtag.js) - Google Analytics