btrace 常见的代码
btrace 官方教程 https://github.com/btraceio/btrace/blob/develop/docs/BTraceTutorial.md
通常一个 btrace 代码长这样:
import org.openjdk.btrace.core.annotations.*;
import static org.openjdk.btrace.core.BTraceUtils.*;
import org.openjdk.btrace.core.BTraceUtils.Strings;
@BTrace
public class ClosedByInterruptExceptionTracer {
@OnMethod( clazz="/java\\.nio\\.channels\\.ClosedByInterruptException/", method="<init>" )
public static void createException() {
println(Strings.strcat("current thread: ", name(currentThread())));
println(jstackStr());
}
@OnMethod( clazz="/com\\.tianxiaohui\\.Example/", method="/methodA/" )
public static void createException(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod, Object param1) {
println(Strings.strcat("praram1 is: ", BTraceUtils.classOf(param1)));
BTraceUtils.printFields(param1);
}
}
其它常用的代码:
获得当前线程
println(Strings.strcat("current thread name: ", name(currentThread()))); println(str(currentThread()));
打印某个对象的自身属性
str(obj);
打印返回值
@BTrace public class CaptureReturn { @OnMethod(clazz = "/com\\.tianxiaohui\\.ProcessToken/", method = "/validate/", location=@Location(Kind.RETURN) ) public static void capture(@Return Object result) { BTraceUtils.printFields(result); println(jstackStr()); } }
打印当前时间
println("current time " + BTraceUtils.timestamp("yyyy-MM-dd' 'HH:mm:ss"));
对字符串操作可以用 BTraceUtils.Strings 的方法, 比如
if (Strings.startsWith(fileName, "MIME")) {
- 创建很多 class 造成 metaspace 满 https://github.com/btraceio/btrace/blob/4f9f1c446da2105cd7e83dba63e26761a629103e/btrace-dist/src/main/resources/samples/Classload.java
- 创建新线程: https://github.com/btraceio/btrace/blob/4f9f1c446da2105cd7e83dba63e26761a629103e/btrace-dist/src/main/resources/samples/ThreadStart.java
- 更多例子: https://github.com/btraceio/btrace/tree/4f9f1c446da2105cd7e83dba63e26761a629103e/btrace-dist/src/main/resources/samples
另外一个例子:
import org.openjdk.btrace.core.annotations.*; import static org.openjdk.btrace.core.BTraceUtils.*; import org.openjdk.btrace.core.BTraceUtils.Strings; @BTrace public class ThreadInterruptTrace { @OnMethod( clazz="/java\\.nio\\.channels\\.ClosedByInterruptException/", method="<init>" ) public static void createException() { println(Strings.strcat(name(currentThread()), " --- get ClosedByInterruptException ")); println(jstackStr()); } @OnMethod( clazz="/java\\.lang\\.Thread1/", method="/interrupt/" ) public static void t1r(@ProbeClassName String probeClass, @Self Thread self) { if (Strings.startsWith(name(self), "RxIoScheduler")) { println(Strings.strcat(Strings.strcat(name(currentThread()), " try to interrupt -> "), str(self))); println(jstackStr()); } } }
打印方法执行时间例子
import org.openjdk.btrace.core.annotations.*; import static org.openjdk.btrace.core.BTraceUtils.*; import org.openjdk.btrace.core.BTraceUtils.Strings; @BTrace public class ExecDuration { @OnMethod(clazz = "/org\\.monstor\\.client\\.impl\\.CallControllerBase/", method = "/execute/", location = @Location(Kind.RETURN)) public static void executeDuration(@Duration long duration) { if (duration / 1000000 > 100) { println("CallControllerBase.execute:" + duration); } } @OnMethod(clazz = "/org\\.monstor\\.client\\.impl\\.MonstorService\\$ServiceCallImpl/", method = "/call/", location = @Location(Kind.RETURN)) public static void callDuration(@Duration long duration) { if (duration / 1000000 > 100) { println("ServiceCallImpl.call:" + duration); } } }