BTrace使用简介

Posted on

BTrace使用简介

BlueDavy之技术blog

{互联网,OSGi,Java, High Scalability, High Performance,HA}

BTrace使用简介

Nov 11

bluedavyjvm btrace 13 Comments 很多时候在online的应用出现问题时,很多时候我们需要知道更多的程序的运行细节,但又不可能在开发的时候就把程序中所有的运行细节都打印到日志上,通常这个时候能采取的就是修改代码,重新部署,然后再观察,但这种方法对于online应用来说不是很好,另外一方面如果碰到不好改的代码,例如引用的其他的外部的包什么的,就很麻烦了,BTrace就是一个可以在不改代码、不重启应用的情况下,动态的查看程序运行细节的工具,其官方网站在此:http://kenai.com/projects/btrace/,在这篇blog中,就来看看如何用BTrace来动态的监测方法的一些运行细节状况。 BTrace通过动态的挂接用java写的代码到运行时上来获取到一些运行细节,例如典型的使用btrace的方法为: btrace -cp [btrace的jar所在的路径,默认为btrace/build下] [pid] [需要运行的java代码] 例如一段这样的代码: ?1

2 3

4 5

6 7

8 9

10 11

12 13

14 15

16 17

18 19

20 21

22 23

24 25

26 import

java.util.Random;

public

class

Case1{

public

static

void

main(String[] args)

throws

Exception{

Random random=

new

Random();

CaseObject object=

new

CaseObject();

boolean

result=

true

;

while

(result){

result=object.execute(random.nextInt(

1000

));

Thread.sleep(

1000

);

}

}

} public

class

CaseObject{

private

static

int

sleepTotalTime=

0

;

public

boolean

execute(

int

sleepTime)

throws

Exception{

System.out.println(

"sleep: "

+sleepTime);

sleepTotalTime+=sleepTime;

Thread.sleep(sleepTime);

return

true

;

}

}

如在程序运行的情况下,想知道调用CaseObject的execute方法的以下几种情况,在BTrace中可以这么做: 1、调用此方法时传入的是什么参数,返回的是什么值,当时sleepTotalTime是多少? BTrace脚本如下:

?1

2 3

4 5

6 7

8 9

10 11

12 13

14 15

16

import

static

com.sun.btrace.BTraceUtils./*;

import

com.sun.btrace.annotations./*;

@BTrace

public

class

TraceMethodArgsAndReturn{

@OnMethod

(

clazz=

"CaseObject"

,

method=

"execute"

,

location=

@Location

(Kind.RETURN)

)

public

static

void

traceExecute(

@Self

CaseObject instance,

int

sleepTime,

@Return

boolean

result){

println(

"call CaseObject.execute"

);

println(strcat(

"sleepTime is:"

,str(sleepTime)));

println(strcat(

"sleepTotalTime is:"

,str(get(field(

"CaseObject"

,

"sleepTotalTime"

),instance))));

println(strcat(

"return value is:"

,str(result)));

}

}

然后直接执行btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java就可以了。 当程序中调用到caseobject的execute方法时,就会在btrace的console中输出相应的信息。 2、execute方法执行耗时是多久? BTrace脚本如下:

?1

2 3

4 5

6 7

8 9

10 11

12 13

14 15

16 17

18 19

20 21

22 23

24

import

static

com.sun.btrace.BTraceUtils./*;

import

com.sun.btrace.annotations./*;

@BTrace

public

class

TraceMethodExecuteTime{

@TLS

static

long

beginTime;

@OnMethod

(

clazz=

"CaseObject"

,

method=

"execute"

)

public

static

void

traceExecuteBegin(){

beginTime=timeMillis();

}

@OnMethod

(

clazz=

"CaseObject"

,

method=

"execute"

,

location=

@Location

(Kind.RETURN)

)

public

static

void

traceExecute(

int

sleepTime,

@Return

boolean

result){

println(strcat(strcat(

"CaseObject.execute time is:"

,str(timeMillis()-beginTime)),

"ms"

));

}

}

3、谁调用了execute方法? BTrace脚本如下:

?1

2 3

4 5

6 7

8 9

10 11

12 13

import

static

com.sun.btrace.BTraceUtils./*;

import

com.sun.btrace.annotations./*;

@BTrace

public

class

TraceMethodCallee{

@OnMethod

(

clazz=

"CaseObject"

,

method=

"execute"

)

public

static

void

traceExecute(){

println(

"who call CaseObject.execute :"

);

jstack();

} }

4、有没有人调用CaseObject中的哪一行代码? BTrace脚本如下:

?1

2 3

4 5

6 7

8 9

10 11

12

import

static

com.sun.btrace.BTraceUtils./*;

import

com.sun.btrace.annotations./*;

@BTrace

public

class

TraceMethodLine{

@OnMethod

(

clazz=

"CaseObject"

,

location=

@Location

(value=Kind.LINE,line=

5

)

)

public

static

void

traceExecute(

@ProbeClassName

String pcn,

@ProbeMethodName

String pmn,

int

line){

println(strcat(strcat(strcat(

"call "

,pcn),

"."

),pmn));

}

}

从上面可看出,在有了BTrace后,要动态的跟踪代码的运行细节还是非常爽的,更多的细节的操作请大家查看BTrace的User Guide

GC悲观策略之Serial GC篇 学习JVM的References

13 Comments (+add yours?)

  1. ikbear Nov 11, 2010 @ 17:41:12 收藏了。
  2. pandonix Nov 11, 2010 @ 20:58:54 关于方法的执行时间和返回值,有个问题请教,如果调用量非常大的方法,有没有类似染色日志这样的功能:只需要打印参数符合某种条件的调用情况?
  3. bluedavy Nov 12, 2010 @ 11:42:06 :) ,这个自己可以在脚本里判断下…
  4. vitty Nov 14, 2010 @ 14:09:22 不知道这个对被监测程序的性能影响有多大?不过真的很爽呢。
  5. bluedavy Nov 14, 2010 @ 19:53:38 据使用来看,影响很小。
  6. bobo Nov 16, 2010 @ 10:16:58 学习,哈哈
  7. xuanyuanzhiyuan Dec 21, 2010 @ 15:37:22 学习了 :)
  8. pandonix Dec 27, 2010 @ 23:07:55 运行第一个例子:TraceMethodArgsAndReturn.java报错: TraceMethodArgsAndReturn.java:10: 找不到符号 符号: 类 CaseObject 位置: 类 TraceMethodArgsAndReturn 把@Self CaseObject instance修改成为@Self Object self,并且去掉println(strcat(“sleepTotalTime is:”,str(get(field(“CaseObject”,”sleepTotalTime”),instance)))); 就可以了,但是楼主希望获取sleepTotalTime的需求就满足不鸟了。还不太明白@Self的含义,再看看纠结的文档吧
  9. pandonix Dec 27, 2010 @ 23:44:37 找到原因了,是CaseObject不在classthpath中,如果用到了@Self CaseObject ,编译TraceMethodArgsAndReturn.java时会去找CaseObject类。 简单的将CaseObject.java放到跟TraceMethodArgsAndReturn.java同一目录即可
  10. 光夏 Jan 23, 2011 @ 11:34:36 使用TLS得注意递归调用的情况吧
  11. victorcai Jul 19, 2011 @ 15:03:18 请问各位大侠btrace能否在windows xp上使用,是否需要设置环境变量,我在windows xp上每次使用都失败

    Leave a Reply

Cancel

Name (required)

Mail (required)

Website

CAPTCHA Image

Refresh Image

CAPTCHA Code /*


July 2013 M T W T F S S « Mar 1234567 891011121314 15161718192021 22232425262728 293031

Categories

Tags

btrace c1 c2 Deflater facebook gc gc tuning Grizzly HBase hotspot Inflater interpreter javac java code generation JavaOne javaone general technical session java代码执行 Java 并发 jit jvm memory management Native Memory Leak NoSQL oom oracle keynote pessimism policy references RPC serial gc SOA sun jdk sun jdk oom Web容量规划的艺术 yuanzhuo 书:分布式Java应用 书评 互联网技术 交流 内存管理 分布式Java应用 圆桌交流 容量规划 悲观策略 服务框架 硅谷公司

订阅

推荐书籍

My Book

© BlueDavy之技术blog 2013

Icons & Wordpress Theme by N.Design

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途
本文链接: BTrace使用简介