- 浏览: 804527 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
huan19900606:
像haskell这些脚本语言很容易定义DSL,实现对应的词法语 ...
DSL的基本介绍(groovy来进行构建) -
express_wind:
https://yq.aliyun.com/album/130 ...
qlexpress规则引擎初探 -
readxuxuegang:
博主你好。如果groovy的代码是保存在数据库里,不是文件,这 ...
在java中使用groovy怎么搞 (java and groovy) -
express_wind:
hi,兄弟,有没有兴趣来阿里巴巴专门做这方面的研究,https ...
qlexpress规则引擎初探 -
langcaiye:
有2个问题请教:1. 这里的base32算法为什么需要以负数的 ...
【原】geohash算法详解
之前很早有同事分享过Btrace的原理,基于java Instruction 实现的,方便跟踪代码。对于线上应用,我们不能进行debug来获取运行的详细信息,通过BTrace可以搞定一些问题。Btrace使用到的技术主要有
术语主要有三个:
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 @794352d2 com/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
发表评论
-
系统分布式情况下最终一致性方案梳理
2015-09-05 19:34 40934前言 目前的应用系 ... -
Storm核心概念剖析
2015-03-20 20:42 3219最近团队中有分析的场 ... -
池和流的两种数据处理方式
2014-11-19 22:59 1379在抽象层面,想了一下,目前很多的数据处理形式,一般分为池和流 ... -
关于CodeReview(java)
2014-10-29 20:42 1894关于codereview,在平时的开发中,经常忽略的环节,参 ... -
java中各种各样的数据结构
2014-07-13 20:26 2455在java中,有非常丰富的数据结构,可能是因为大多数的软件 ... -
关于JVM的ClassLoader(笔记)
2014-07-13 12:19 1859众所周知,java是编译型的语言,写的是java文 ... -
关于事务的几个概念介绍
2014-06-06 22:22 1935啥是事务? 有一组操 ... -
开发中遇到的编码问题
2014-05-22 19:39 18701、说到编码,最大的问题就是乱码了,为啥会有乱码呢 ? 因 ... -
ThreadLocal源代码解析
2014-04-24 17:54 2399最开始的时候,理解的ThreadLocal,我的理解是这样的 ... -
关于单例模式(代码篇)
2014-04-23 10:47 2411很早的时候,转发过一篇单例模式的文章:http://iamz ... -
今天遇到的两个spring相关的两个问题
2014-04-18 21:56 2550今天在项目中写代码,遇到两个Spring的问题,记录一下。再 ... -
Activiti中的命令模式解析
2014-04-11 13:10 3176最近在看Activiti的源代码,发现是基于命令模式进行的开 ... -
关于java中的本地缓存-总结概述
2014-03-31 19:00 18355java中的本地缓存,工作后陆续用到,一直想写,一直无从下 ... -
使用guava中的EventBus构建内存级别的事件引擎
2014-03-25 19:27 6392这个EventBus是guava中比较给力的一个类,从字面 ... -
DSL的基本介绍(groovy来进行构建)
2014-03-04 23:32 17034什么是DSL? 领域特定 ... -
qlexpress规则引擎初探
2014-02-25 22:28 25071qlexpress是啥? 这个是阿里内部的一个开源的jav ... -
在java中使用groovy怎么搞 (java and groovy)
2014-01-15 23:17 10937什么是groovy? 一种基于Java虚拟机的动态语言, ... -
java中记录方法调用时间,结果按照方法的层级树状的输出
2013-12-21 17:36 4669 在java中,最常用的埋点时间的方法就 ... -
一次CMS GC问题排查过程(理解原理+读懂GC日志)
2013-12-14 22:21 41334这个是之前处理过的一个线上问题,处理过程断断续续,经历了两 ... -
令牌桶算法和漏桶算法以及流量控制浅谈
2013-11-27 23:20 20770 在双十一等大促环节,系统需要限流,外部 ...
相关推荐
文档的描述暗示了HouseMD通过提供一系列强大的诊断和分析工具来帮助程序员更加高效地解决代码中出现的问题,它强调了使用正确的工具对于程序员来说是多么重要,能够大大减少调试过程中的不便和时间成本。
HouseMD是一款基于Scala开发的强大诊断工具,其设计目标是超越BTrace,为开发者提供更为高效、精准的问题排查手段。在Java生态系统中,诊断工具对于识别和解决应用性能问题至关重要,而HouseMD就是这类工具中的杰出...
housemd 类加载工具查看 查看类的加载包 定位类加载异常等问题
这款工具能够实时监控Java进程的运行状态,包括但不限于内存使用情况、线程状态、CPU占用率等关键指标。通过这些数据,开发者可以迅速定位到可能导致性能瓶颈或系统异常的部分。 其次,HouseMD提供了一套命令行接口...
很早的时候,我们使用BTrace排查问题,在感叹BTrace的强大之余,也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD,将 常用的几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala...
- **btrace**:动态追踪工具,无需重新编译或重启应用即可进行调试。 - **crash**:命令行工具,用于分析核心转储文件。 - **TProfiler**:阿里巴巴开源的性能分析工具,用于JVM应用的性能监控。 - **HouseMD**:...
集成开源java运维工具脚本:housemd,greys,sjk,jtop等 部分脚本的编写 运行/安装环境 Linux git1.7 + 安装 三种方法 curl -s ...
Ali-tomcat 基于Apache-‐Tomcat 7 – JDK6、JDK7 (websocket) 改动(减掉的) 1) 集群 2) 多应用部署 (只支持单个应用) ...3) 诊断⼯工具:HouseMD2 4) 统⼀一⽇日志框架:Taobao-‐logback