`
iamzhongyong
  • 浏览: 804545 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BTrace小结(+houseMD使用)

    博客分类:
  • java
 
阅读更多

之前很早有同事分享过Btrace的原理,基于java Instruction 实现的,方便跟踪代码。对于线上应用,我们不能进行debug来获取运行的详细信息,通过BTrace可以搞定一些问题。Btrace使用到的技术主要有

 

•Java Compiler API;•Annotation Processing;•Java Agent;•ASM 4;•Attach API;•jvmstat;•JMX

术语主要有三个:

Probe Point 在何处执行trace语句, 这里的"何处"可以是具体的跟踪地点和执行事件, 在BTrace中通过各种注解来指定 
Trace Actions or Actions在何时执行trace语句 
Action Methods 定义在trace脚本中的trace语句, 具体来说就是脚本中的无返回值静态方法(1.2之后可以是非静态方法)

使用BTrace

(1)下载BTrace的工程代码

mkdir /home/admin/btrace

cd /home/admin/btrace

wget  http://kenai.com/downloads/btrace/releases/release-1.2.2/btrace-bin.tar.gz 

tar -xzvf  /home/admin/btrace/btrace-bin.tar.gz

export JAVA_HOME=/java

(2)编写自定义的BTrace脚本(java文件)

常用的几个注解

A、方法上的注解OnMethod

clazz: 类名称,可以是全称,也可以是正则表达式(也可以是正则表达式(表达式必须写在"//"中, 比如"/java\\.awt\\..+/").)

例如: clazz="+java.lang.ClassLoader"--》实现ClassLoader接口的类;

method:方法名称,

location:例如location=@Location(Kind.RETURN)是一个枚举值

例如:

 @OnMethod(

        clazz="/java\\.io\\..*Input.*/",

        method="/read.*/"

    )

B 、方法上的注解OnTimer 用来指定时长(ms)执行一次trace. 时长通过"value"属性指定。例如   @OnTimer(4000) 

C、 其他方法上的注解、

  • OnError 当trace代码抛异常时该注解的方法会被执行. 如果同一个trace脚本中其他方法抛异常, 该注解方法也会被执行.

  • OnExit 当trace方法调用内置exit(int)方法(用来结束整个trace程序)时, 该注解的方法会被执行. 参考自带例子ProbeExit.java.

  • OnEvent 用来截获"外部"btrace client触发的事件, 比如按Ctrl-C 中断btrace执行时将执行使用了该注解的方法, 该注解的value值为具体事件名称. 

  • OnLowMemory 当内存超过某个设定值将触发该注解的方法, 具体参考MemAlerter.java

D、参数上的注解:Self 用来指定被trace方法的this

E、参数上的注解:Return 用来指定被trace方法的返回值

F、参数上的注解:ProbeClassName 和ProbeMethodName  被trace的类名称和方法名称

G、参数:.TargetInstance (since 1.1) 用来指定被trace方法内部被调用到的实例

H、参数:TargetMethodOrField (since 1.1) 用来指定被trace方法内部被调用的方法名, 可参考例子AllCalls1.java 合 AllCalls2.java

I、属性上的注解:TLS 将一个脚本变量与一个ThreadLocal变量关联

 

常用的几种脚本

A、查看一个方法的入参和返回值

B、查看一个方法执行耗时

C、谁调用这个方法

D、代码中的特定行有没有被调用

 

下面转自毕玄的博客:http://rdc.taobao.com/team/jm/archives/509

 

(3)命令运行自定义脚本(获取反馈信息)

运行一个例子程序(-cp是设置环境变量,18528是java的进程ID,然后后面是编写的java的文件)

btrace -cp [btrace的jar所在的路径,默认为btrace/build下] [pid] [需要运行的java代码]

sudo -u admin sh  btrace -cp /home/admin/btrace/build 18528 /home/admin/btrace/samples/ThreadCounter.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
27
28
29
30
31
32
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace
public class BtraceAll {
    @TLS
    private static long beginTime;
    @OnMethod(
            clazz="com.taobao.commonway.core.service.impl.TimeInfoManagerImpl",
            method="getCityName"
    )
    public static void traceMethodBegin(){
        beginTime = timeMillis();
    }
    @OnMethod(
            clazz="com.taobao.commonway.core.service.impl.TimeInfoManagerImpl",
            method="getCityName",
            location=@Location(Kind.RETURN)
    )
    public static void traceMethdReturn(
            @Return String result,
            @ProbeClassName String clazzName,
            @ProbeMethodName String methodName){
        println("===========================================================================");
        println(strcat(strcat(clazzName, "."), methodName));
        println(strcat("Time taken : ", str(timeMillis() - beginTime)));
        println("java thread method trace:---------------------------------------------------");
        jstack();
        println("----------------------------------------------------------------------------");
        println(strcat("Reuslt :",str(result)));
        println("============================================================================");
    }
}

 

 

参考:

http://rdc.taobao.com/team/jm/archives/509

 http://kenai.com/projects/btrace/ 

http://macrochen.iteye.com/blog/838920

 

=========================================================================================================

下面是houseMD的使用,感觉比btrace好用一点,但是灵活性不是很高,常见问题都能用一下。

 

 

安装

 

(1)sudo -u admin  curl -Lk https://raw.github.com/zhongl/HouseMD/master/bin/install

(2) sudo -u admin sh install.sh  | bash

(3) export JAVA_HOME=/opt/taobao/java

(4)sudo -u admin /home/admin/houseMD/housemd -h  23259 ( java pid)进入housemd的控制台

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
#! /bin/bash
                           
CHECKSUM="checksum"
                           
curl -Lk https://api.github.com/repos/zhongl/HouseMD/downloads grep -E "[0-9a-f]+\s+[^ \"]+" -o | head -1 > $CHECKSUM
                           
JAR_NAME=`cat $CHECKSUM | grep -E housemd.+ -o`
                           
curl -Lk https://github.com/downloads/zhongl/HouseMD/$JAR_NAME > $JAR_NAME
                           
SHASUM=`which shasum || which sha1sum`
                                                                                                                 
if [ -z $SHASUM ]; then
    echo "Warning, shasum or sha1sum could not find to validate the download jar."
else
    $SHASUM -c $CHECKSUM || {
        rm -rf $JAR_NAME $CHECKSUM ;
        echo "Download failed, please try again!";
        exit 1;
    }
fi
                           
mv $JAR_NAME housemd.jar
rm -rf $CHECKSUM
curl -Lk https://raw.github.com/zhongl/HouseMD/master/bin/housemd > housemd
chmod u+x housemd

(1)查看类加载路径(loaded 类名称,如果查看加载层次,加参数-h)

1
2
3
housemd> loaded CollectionUtil
com.taobao.util.CollectionUtil -> /home/admin/commonway/.default/deploy/commonway.war/WEB-INF/lib/util-1.0.jar
com.alibaba.citrus.util.CollectionUtil -> /home/admin/commonway/.default/deploy/commonway.war/WEB-INF/lib/citrus-webx-all-in-one-3.0.3.jar

(2)查看一个类或者特定方法的运行情况

-t 时间  一定时间的运行情况

-s 打出栈信息

-d打印详细信息

打印接下来10秒内方法的调用情况(方法全名(含参数列表), 当前类的加载器对象, 总计调用次数, 平均调用耗时, 调用的自身对象

1
2
3
4
5
6
7
8
9
housemd> trace -t 10 TimeInfoManagerImpl.querySellerAvgSpeed
INFO : Probe class com.taobao.commonway.core.service.impl.TimeInfoManagerImpl
No traced method invoked
  
com/taobao/commonway/core/service/impl/TimeInfoManagerImpl.querySellerAvgSpeed(long, String)    sun.misc.Launcher$AppClassLoader@4aad3ba4            3            5ms    com.taobao.commonway.core.service.impl.TimeInfoManagerImpl@794352d2
  
INFO : Ended by timeout
INFO : Reset class com.taobao.commonway.core.service.impl.TimeInfoManagerImpl

 

打印调用的详细信息

1
2
3
4
5
6
7
8
9
10
11
housemd> trace -d TimeInfoManagerImpl.querySellerAvgSpeed
INFO : Probe class com.taobao.commonway.core.service.impl.TimeInfoManagerImpl
No traced method invoked
            
No traced method invoked
            
com/taobao/commonway/core/service/impl/TimeInfoManagerImpl.querySellerAvgSpeed(long, String)    sun.misc.Launcher$AppClassLoader@4aad3ba4            1            3ms    com.taobao.commonway.core.service.impl.TimeInfoManagerImpl@794352d2
            
INFO : You can get invocation detail from /tmp/trace/23259@commonway079145.pre.cm3.tbsite.net/detail
INFO : Ended by timeout
INFO : Reset class com.taobao.commonway.core.service.impl.TimeInfoManagerImpl

日志中的详细信息

日期, 时间戳, 调用耗时, 调用线程名, 调用方法的自身对象, 调用方法全名, 调用方法参数值列表, 返回值(或异常)

1
2
3
4
5
6
7
8
9
10
more /tmp/trace/23259@commonway079145.pre.cm3.tbsite.net/detail
          
2012-11-20 16:44:06 3ms [http-0.0.0.0-7001-6] com.taobao.commonway.core.service.impl.TimeInfoManagerImpl@794352d2com/taobao/commonw
ay/core/service/impl/TimeInfoManagerImpl.querySellerAvgSpeed [341952863 121.0.29.228] com.taobao.commonway.common.TimeResultDO@1a882
b79[
  consignTime=20
  timeCost=66
  industryCtime=21
  industryStime=44
]

 

(3)查看类中属性的值(inspect 类名称)( 属性全名, 属性值, 自身对象实例 , 此类的类加载器

1
2
3
4
5
6
7
8
9
10
housemd> inspect TimeResultDO.consignTime
INFO : Probe class com.taobao.commonway.common.TimeResultDO
TimeResultDO.consignTime 20 com.taobao.commonway.common.TimeResultDO@eec91ef[
  consignTime=20
  timeCost=66
  industryCtime=21
  industryStime=44
] org.jboss.mx.loading.UnifiedClassLoader3@37debcf3{ url=file:/home/admin/commonway/.default/deploy/commonway.war/ ,addedOrder=44}
INFO : Ended by timeout
INFO : Reset class com.taobao.commonway.common.TimeResultDO

https://github.com/zhongl/HouseMD/wiki/UserGuideCN

https://github.com/downloads/zhongl/HouseMD/housemd_2.9.2-0.2.4.min.jar

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    HouseMD介绍.pdf

    文档的描述暗示了HouseMD通过提供一系列强大的诊断和分析工具来帮助程序员更加高效地解决代码中出现的问题,它强调了使用正确的工具对于程序员来说是多么重要,能够大大减少调试过程中的不便和时间成本。

    HouseMD:HouseMD是比BTrace更好的强大诊断工具

    HouseMD是一款基于Scala开发的强大诊断工具,其设计目标是超越BTrace,为开发者提供更为高效、精准的问题排查手段。在Java生态系统中,诊断工具对于识别和解决应用性能问题至关重要,而HouseMD就是这类工具中的杰出...

    housemd内存加载工具查看

    housemd 类加载工具查看 查看类的加载包 定位类加载异常等问题

    housemd_2.9.2-0.2.4.min.jar_hm_

    这款工具能够实时监控Java进程的运行状态,包括但不限于内存使用情况、线程状态、CPU占用率等关键指标。通过这些数据,开发者可以迅速定位到可能导致性能瓶颈或系统异常的部分。 其次,HouseMD提供了一套命令行接口...

    Java异常诊断greys-anatomy.zip

    很早的时候,我们使用BTrace排查问题,在感叹BTrace的强大之余,也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD,将 常用的几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala...

    Java工程师应用技术汇总

    - **btrace**:动态追踪工具,无需重新编译或重启应用即可进行调试。 - **crash**:命令行工具,用于分析核心转储文件。 - **TProfiler**:阿里巴巴开源的性能分析工具,用于JVM应用的性能监控。 - **HouseMD**:...

    令人敬畏的脚本:适用于Linux op的脚本

    集成开源java运维工具脚本:housemd,greys,sjk,jtop等 部分脚本的编写 运行/安装环境 Linux git1.7 + 安装 三种方法 curl -s ...

    taobao-tomcat-7.0.59.tgz

    Ali-tomcat 基于Apache-­‐Tomcat 7 – JDK6、JDK7 (websocket) 改动(减掉的) 1) 集群 2) 多应用部署 (只支持单个应用) ...3) 诊断⼯工具:HouseMD2 4) 统⼀一⽇日志框架:Taobao-­‐logback

Global site tag (gtag.js) - Google Analytics