BTrace简单实用教程

来源:互联网 发布:linux mount usb命令 编辑:程序博客网 时间:2024/06/04 18:29

BTrace本身也是可以独立运行的程序,作用是在不停止目标程序运行的前提下,通过HotSpot虚拟机的HotSwap技术动态插入原本不存在的调试代码。

比如遇到了我们的程序出问题,而又没有足够的打印语句时,我们一般的方法是不得不停掉服务,然后修改代码,增加打印语句,重新编译重新运行来解决,效率很低。

但有了BTrace,我们需要做的就很简单了,举例说明:

 

比如环境上运行着一个简单程序:

package com.huawei.main;import java.io.BufferedReader;import java.io.InputStreamReader; public class Main{    public static void main(String[] args) throws Exception    {           Main test = new Main();        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));        for (int i = 0; i < 10; i++)        {            reader.readLine();            int a = (int) Math.round(Math.random() * 1000);            int b = (int) Math.round(Math.random() * 1000);            System.out.println(test.add(a, b));        }    }    public int add(int a, int b)    {        return a + b;    }}


 

该程序从控制台中获取一个输入,然后生成两个随机数,相加后将结果打印出来

对于add方法没有日志打印,如果想在不改变程序的前提下知道程序运行时add函数的入参和返回值,我们可以:

 

1. 在环境上解压BTrace工具包

比如解压到:/opt/eucalyptus/test/目录下

 

2. 编写BTrace脚本,对于脚本还是需要时间学习和实践的。如下TraceScript.java(注意在Linux下,这个文件应该是ANSI格式,否则会报illegal character: \65279的异常):

import com.sun.btrace.annotations.*;

import static com.sun.btrace.BTraceUtils.*;

 

@BTrace

public class TraceScript

{

       @OnMethod(clazz="com.huawei.main.Main", method="add", location=@Location(Kind.RETURN))

       public static void func(int a, int b, @Return int result)

       {

              jstack();

              println(strcat("para A: ", str(a)));

              println(strcat("para B: ", str(b)));

              println(strcat("result: ", str(result)));

       }

}

 

将该脚本放在环境目录下,比如:/opt/eucalyptus/test/TraceScript.java

test目录结构如下:

除TraceScript.java外都是BTrace解压后的文件。

 

3. 利用jps得到Main程序的进程号(比如28772),到BTrace目录的bin目录下执行语句:

/opt/eucalyptus/test/bin # ./btrace 28772 ../TraceScript.java

 

4. 在Main程序的控制台下输入字符,回车,会看到BTrace的输出:

 

总结:BTrace用法还有很多,打印调用堆栈、参数、返回值只是最基本的应用,在BTrace网址上有使用BTrace进行性能监视、定位连接泄露、内存泄露、解决多线程竞争问题等例子。

 

注意:如果一个java程序是以普通用户权限运行,则不能在root权限下对其进行btrace,一定先要切换到普通用户。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 步步高账号密码忘了怎么办 步步高手机账号密码忘了怎么办 康佳电视通行证忘了怎么办 尚游通行证忘了怎么办 深圳免限行通行证忘了截图怎么办 电脑把管理员账号删除了怎么办 uc新浪加载失败怎么办红包还 微信忘记账号和密码怎么办 苹果手机忘记id密码怎么办 购买游戏账号被找回怎么办 交易猫账号忘了怎么办 爱奇艺账号怎么修改不了密码怎么办 论文目录显示错误未定义书签怎么办 银行账号被冻结了怎么办 哈罗单车账号被冻结怎么办 麻袋赚赚账号被冻结怎么办 网赌账号被冻结怎么办 梦想城镇账号被冻结怎么办 钱被银行冻结了怎么办 百度云账号密码忘了怎么办 微信钱包忘记密码了怎么办 word文档打开文件出错怎么办 有盘文件删不了怎么办 u盘文档严重损坏怎么办 wps文档打开是乱码怎么办 九游3083网资金冻结怎么办 阴阳师九游版禁止部分玩法怎么办 夜神模拟器游戏打不开怎么办 九游代金券锁定怎么办 被娱乐天地骗了怎么办 win8更新失败无法开机怎么办 安装英雄联盟文件损坏怎么办 电脑玩lol运行内存不足怎么办 守望先锋账号冻结了怎么办 守望先锋服务器发生意外错误怎么办 在先锋社保缺一年上学怎么办 lol更新后反应很慢怎么办 电脑跳舞毯不正常电脑游戏怎么办 PS中缺失的字体怎么办 黑板墙不想要了怎么办 淘宝代练打坏了怎么办