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

}
[/java]
如在程序运行的情况下,想知道调用CaseObject的execute方法的以下几种情况,在BTrace中可以这么做:
1、调用此方法时传入的是什么参数,返回的是什么值,当时sleepTotalTime是多少?
BTrace脚本如下:
[java]
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)));
}
}
[/java]
然后直接执行btrace -cp btrace/build [pid] TraceMethodArgsAndReturn.java就可以了。
当程序中调用到caseobject的execute方法时,就会在btrace的console中输出相应的信息。
2、execute方法执行耗时是多久?
BTrace脚本如下:
[java]
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"));
}
}
[/java]
3、谁调用了execute方法?
BTrace脚本如下:
[java]
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();
}
}
[/java]
4、有没有人调用CaseObject中的哪一行代码?
BTrace脚本如下:
[java]
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));
}
}
[/java]
从上面可看出,在有了BTrace后,要动态的跟踪代码的运行细节还是非常爽的,更多的细节的操作请大家查看BTrace的User Guide

from: http://jm.taobao.org/2010/11/11/509/

最新文章

  1. CPU使用率终于正常了——记一次订餐系统事故处理
  2. 重新注册IIS
  3. different between unicorn / unicorn_rails
  4. POJ2367 Genealogical tree (拓扑排序)
  5. WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
  6. selenium自动化遇见Cannot find class in classpath问题
  7. vs2012中使用localdb实例还原一个sql server 2008r2版本的数据库
  8. poj_2195Going Home(最小费用最大流)
  9. Python基础数据类型之字典
  10. 07、NetCore2.0依赖注入(DI)之生命周期
  11. less-loader编译calc异常解决方法
  12. hibernate的理解
  13. shell 十进制数字转十六进制字符串并将结果保存到变量
  14. Codeplex最流行25个开源项目
  15. 安装xcache3.0.3/3.2,为php加速
  16. POJ 2250 Compromise【LCS】+输出路径
  17. ios alloc init 和 new 的区别
  18. Inviting Friends(hdu3244 && zoj3187)完全背包+二分
  19. Pyqt中富文本编辑器
  20. 认识网页:html + css + JavaScript

热门文章

  1. vue系列之webstrom的设置
  2. 多CPU,多核,多进程,多线程
  3. nginx配置学习总结
  4. oracle分区表彻底删除的办法,处理删不掉的不规则表名
  5. 2018-2019-2 网络对抗技术 20165333 Exp2 后门原理与实践
  6. python全栈开发day15-递归函数、二分查找
  7. 解决Win8系统修改IP地址后保存不了的方法
  8. P2700 逐个击破 最小生成树
  9. 052 自动将每日的日志增量导入到hive中
  10. Python4 - 文件操作