| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -145,5 +145,8 @@ | |||
| 145 | 145 | <classpathentry kind="lib" path="lib/mq/activemq/activemq-all-5.11.1.jar" sourcepath="libsrc/mq/activemq/activemq-parent-5.11.1-source-release.zip"/> | |
| 146 | 146 | <classpathentry kind="lib" path="lib/mq/rabbitmq/rabbitmq-client-tests.jar"/> | |
| 147 | 147 | <classpathentry kind="lib" path="lib/mq/rabbitmq/rabbitmq-client.jar"/> | |
| 148 | + <classpathentry kind="lib" path="lib/btrace/btrace-agent.jar"/> | ||
| 149 | + <classpathentry kind="lib" path="lib/btrace/btrace-boot.jar"/> | ||
| 150 | + <classpathentry kind="lib" path="lib/btrace/btrace-client.jar"/> | ||
| 148 | 151 | <classpathentry kind="output" path="bin"/> | |
| 149 | 152 | </classpath> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,54 @@ | |||
| 1 | + package com.xdc.basic.api.btrace; | ||
| 2 | + | ||
| 3 | + import static com.sun.btrace.BTraceUtils.str; | ||
| 4 | + | ||
| 5 | + import java.sql.Connection; | ||
| 6 | + import java.util.Map; | ||
| 7 | + | ||
| 8 | + import com.sun.btrace.BTraceUtils; | ||
| 9 | + import com.sun.btrace.annotations.BTrace; | ||
| 10 | + import com.sun.btrace.annotations.Kind; | ||
| 11 | + import com.sun.btrace.annotations.Location; | ||
| 12 | + import com.sun.btrace.annotations.OnEvent; | ||
| 13 | + import com.sun.btrace.annotations.OnMethod; | ||
| 14 | + import com.sun.btrace.annotations.ProbeClassName; | ||
| 15 | + import com.sun.btrace.annotations.ProbeMethodName; | ||
| 16 | + import com.sun.btrace.annotations.Return; | ||
| 17 | + import com.sun.btrace.annotations.Self; | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 连接池泄露检测脚本,摘自网络,未验证 | ||
| 21 | + * | ||
| 22 | + * http://itindex.net/detail/50040-btrace-dbcp-%E6%95%B0%E6%8D%AE%E5%BA%93 | ||
| 23 | + * http://www.blogjava.net/chen4765654/archive/2014/12/16/421472.html | ||
| 24 | + */ | ||
| 25 | + @BTrace(unsafe = true) | ||
| 26 | + public class DataSourceTracer | ||
| 27 | + { | ||
| 28 | + private static Map<Object, Object> map = BTraceUtils.newHashMap(); | ||
| 29 | + | ||
| 30 | + @OnMethod(clazz = "org.apache.commons.dbcp.BasicDataSource", method = "getConnection", location = @Location(Kind.RETURN)) | ||
| 31 | + public static void traceExecute(@ProbeClassName String name, @ProbeMethodName String method, @Return Connection conn) | ||
| 32 | + { | ||
| 33 | + // BTraceUtils.println(strcat("获取连接:",BTraceUtils.str(conn))); | ||
| 34 | + Appendable buffer = BTraceUtils.Strings.newStringBuilder(); | ||
| 35 | + BTraceUtils.Strings.append(buffer, BTraceUtils.timestamp("yyyy-MM-dd HH:mm:ss")); | ||
| 36 | + BTraceUtils.Strings.append(buffer, " - "); | ||
| 37 | + BTraceUtils.Strings.append(buffer, BTraceUtils.jstackStr()); | ||
| 38 | + BTraceUtils.put(map, conn, str(buffer)); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + @OnMethod(clazz = "org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper", method = "close") | ||
| 42 | + public static void traceExecute2(@ProbeClassName String name, @ProbeMethodName String method, @Self Connection conn) | ||
| 43 | + { | ||
| 44 | + // BTraceUtils.println(strcat("释放连接:",BTraceUtils.str(conn))); | ||
| 45 | + BTraceUtils.remove(map, conn); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + @OnEvent | ||
| 49 | + public static void exit() | ||
| 50 | + { | ||
| 51 | + // 这里打印泄漏连接的方法堆栈,运行一段时间后通过Ctrl+C, 选择2, 发送事件打印 | ||
| 52 | + BTraceUtils.printMap(map); | ||
| 53 | + } | ||
| 54 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,32 @@ | |||
| 1 | + package com.xdc.basic.api.btrace; | ||
| 2 | + | ||
| 3 | + import java.util.Random; | ||
| 4 | + | ||
| 5 | + /** | ||
| 6 | + * 简单的java程序,供Btrace监控 | ||
| 7 | + */ | ||
| 8 | + public class HelloWorld | ||
| 9 | + { | ||
| 10 | + public static void main(String[] args) throws Exception | ||
| 11 | + { | ||
| 12 | + while (true) | ||
| 13 | + { | ||
| 14 | + Random random = new Random(); | ||
| 15 | + execute(random.nextInt(4000)); | ||
| 16 | + } | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + public static void execute(int sleepTime) | ||
| 20 | + { | ||
| 21 | + System.out.println("Start to sleep, sleep time is=>" + sleepTime); | ||
| 22 | + try | ||
| 23 | + { | ||
| 24 | + Thread.sleep(sleepTime); | ||
| 25 | + } | ||
| 26 | + catch (InterruptedException e) | ||
| 27 | + { | ||
| 28 | + e.printStackTrace(); | ||
| 29 | + } | ||
| 30 | + System.out.println("End to sleep, sleep time is=>" + sleepTime); | ||
| 31 | + } | ||
| 32 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,52 @@ | |||
| 1 | + package com.xdc.basic.api.btrace; | ||
| 2 | + | ||
| 3 | + import com.sun.btrace.BTraceUtils; | ||
| 4 | + import com.sun.btrace.annotations.BTrace; | ||
| 5 | + import com.sun.btrace.annotations.Kind; | ||
| 6 | + import com.sun.btrace.annotations.Location; | ||
| 7 | + import com.sun.btrace.annotations.OnMethod; | ||
| 8 | + import com.sun.btrace.annotations.ProbeClassName; | ||
| 9 | + import com.sun.btrace.annotations.ProbeMethodName; | ||
| 10 | + import com.sun.btrace.annotations.TLS; | ||
| 11 | + | ||
| 12 | + /** | ||
| 13 | + * Btrace简单样例 | ||
| 14 | + */ | ||
| 15 | + @BTrace(unsafe = true) | ||
| 16 | + public class HelloWorldTracer | ||
| 17 | + { | ||
| 18 | + // 注意: | ||
| 19 | + // 这个方法输出在Btrace上: BTraceUtils.println("Log in Btrace start-------------------------------------------"); | ||
| 20 | + // 这个方法输出在java程序上:System.out.println("Log in target java start-------------------------------------------"); | ||
| 21 | + | ||
| 22 | + @TLS | ||
| 23 | + private static long startTime = 0; | ||
| 24 | + | ||
| 25 | + @OnMethod(clazz = "com.xdc.basic.api.btrace.HelloWorld", method = "execute") | ||
| 26 | + public static void startMethod() | ||
| 27 | + { | ||
| 28 | + BTraceUtils.println("Log in Btrace start-------------------------------------------"); | ||
| 29 | + System.out.println("Log in target java start-------------------------------------------"); | ||
| 30 | + | ||
| 31 | + startTime = BTraceUtils.timeMillis(); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @OnMethod(clazz = "com.xdc.basic.api.btrace.HelloWorld", method = "execute", location = @Location(Kind.RETURN)) | ||
| 35 | + public static void endMethod() | ||
| 36 | + { | ||
| 37 | + BTraceUtils.println(BTraceUtils.strcat("the class method execute time=>", | ||
| 38 | + BTraceUtils.str(BTraceUtils.timeMillis() - startTime))); | ||
| 39 | + | ||
| 40 | + System.out.println("Log in target java end-------------------------------------------"); | ||
| 41 | + BTraceUtils.println("Log in Btrace end-------------------------------------------"); | ||
| 42 | + BTraceUtils.println(); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + @OnMethod(clazz = "com.xdc.basic.api.btrace.HelloWorld", method = "execute", location = @Location(Kind.RETURN)) | ||
| 46 | + public static void traceExecute(@ProbeClassName String name, @ProbeMethodName String method, int sleepTime) | ||
| 47 | + { | ||
| 48 | + BTraceUtils.println(BTraceUtils.strcat("the class name=>", name)); | ||
| 49 | + BTraceUtils.println(BTraceUtils.strcat("the class method=>", method)); | ||
| 50 | + BTraceUtils.println(BTraceUtils.strcat("the class method params=>", BTraceUtils.str(sleepTime))); | ||
| 51 | + } | ||
| 52 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,28 @@ | |||
| 1 | + 介绍 | ||
| 2 | + Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪(监控)工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。 | ||
| 3 | + In a way, BTrace scripts are very similar to AOP's aspects, but can be attached to any existing Java code (or better, bytecode) at runtime and without any configuration or modification at development time. | ||
| 4 | + | ||
| 5 | + 背景 | ||
| 6 | + 在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数、返回值、全局变量、堆栈信息等。为了获取这些数据信息,我们可以 通过改写代码,增加日志信息的打印,再发布到生产环境。通过这种方式,一方面将增大定位问题的成本和周期,对于紧急问题无法做到及时响应;另一方面重新部 署后环境可能已被破坏,很难重新问题的场景。 | ||
| 7 | + | ||
| 8 | + BTrace功能 | ||
| 9 | + BTrace天生就为解决这类问题而来,它可以动态地跟踪java运行程序。通过hotswap技术,动态将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计。 | ||
| 10 | + BTrace在使用上有很多限制条件,如不能创建对象、数组、抛出和捕获异常、循环等,具体限制条件参考用户文档中的BTrace Restrictions。用户文档地址: http://kenai.com/projects/btrace/pages/UserGuide。 | ||
| 11 | + 根据官方声明,不当地使用btrace可能导致jvm崩溃,如BTrace使用错误的.class文件,Hotspot JVM自身存在的hotswap bug等。可以先在本地验证BTrace脚本的正确性,再传到生产环境中定位问题。 | ||
| 12 | + | ||
| 13 | + 工具的使用:存在两种使用方式 | ||
| 14 | + (1)单独的工具包:解压btrace-bin.zip即可用 | ||
| 15 | + btrace.bat <java_pid> HelloWorldTracer.java | ||
| 16 | + | ||
| 17 | + (2)jvisualvm插件:安装指导:jvisualvm--工具--插件--可用插件--BTrace Workbench | ||
| 18 | + 右键左侧的应该java程序列表--Trace application...--打开之前编写好的java脚本。 | ||
| 19 | + | ||
| 20 | + 常见错误: | ||
| 21 | + /HelloWorldTracer.java:21:method calls are not allowed - only calls to BTraceUtils are allowed | ||
| 22 | + | ||
| 23 | + 这个错误说的是在BTrace脚本中只能使用BTraceUtils中的方法,这个主要是尽量减少对被调试的java程序的影响。 | ||
| 24 | + 如果是开发环境而非生产环境,可以关闭安全校验,BTrace的功能将大大增强。 | ||
| 25 | + | ||
| 26 | + 总共需要注意的是三点: | ||
| 27 | + 1、修改bin\btrace.bat:-Dcom.sun.btrace.unsafe=true 注意:修改只针对初次运行生效,二次运行请重启pid对应服务。因内存中仍为上次值,不推荐此方法。 | ||
| 28 | + 2、修改脚本注解:@BTrace(unsafe=true) | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments