mirror of https://github.com/alibaba/arthas.git
parent
5029b752b6
commit
b2652715a2
@ -0,0 +1,142 @@
|
|||||||
|
package com.taobao.arthas.bytekit.asm.interceptor;
|
||||||
|
|
||||||
|
import com.taobao.arthas.bytekit.asm.binding.Binding;
|
||||||
|
import com.taobao.arthas.bytekit.asm.interceptor.annotation.AtEnter;
|
||||||
|
import com.taobao.arthas.bytekit.asm.interceptor.annotation.AtExceptionExit;
|
||||||
|
import com.taobao.arthas.bytekit.asm.interceptor.annotation.AtExit;
|
||||||
|
import com.taobao.arthas.bytekit.asm.interceptor.annotation.ExceptionHandler;
|
||||||
|
import com.taobao.arthas.bytekit.utils.Decompiler;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
import org.springframework.boot.test.rule.OutputCapture;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* testcase for IINC
|
||||||
|
*/
|
||||||
|
public class InlineWhileTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public ExpectedException expectedEx = ExpectedException.none();
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public OutputCapture capture = new OutputCapture();
|
||||||
|
|
||||||
|
public static class Sample {
|
||||||
|
|
||||||
|
public int hello(String str, boolean exception) {
|
||||||
|
if (exception) {
|
||||||
|
throw new RuntimeException("test exception");
|
||||||
|
}
|
||||||
|
return str.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TestPrintSuppressHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(inline = true)
|
||||||
|
public static void onSuppress(@Binding.Throwable Throwable e, @Binding.Class Object clazz) {
|
||||||
|
System.err.println("exception handler: " + clazz);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class EnterInterceptor {
|
||||||
|
|
||||||
|
@AtEnter(inline = true,
|
||||||
|
suppress = RuntimeException.class,
|
||||||
|
suppressHandler = TestPrintSuppressHandler.class
|
||||||
|
)
|
||||||
|
public static long onEnter(
|
||||||
|
@Binding.This Object object, @Binding.Class Object clazz,
|
||||||
|
@Binding.MethodName String methodName,
|
||||||
|
@Binding.MethodDesc String methodDesc
|
||||||
|
) {
|
||||||
|
System.err.println("onEnter, object:" + object);
|
||||||
|
System.err.println("onEnter, methodName:" + methodName);
|
||||||
|
System.err.println("onEnter, methodDesc:" + methodDesc);
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
while (i++ < 3) {
|
||||||
|
System.err.println("enter: "+i);
|
||||||
|
}
|
||||||
|
return 123L;
|
||||||
|
}
|
||||||
|
|
||||||
|
@AtExit(inline = true,
|
||||||
|
suppress = RuntimeException.class,
|
||||||
|
suppressHandler = TestPrintSuppressHandler.class
|
||||||
|
)
|
||||||
|
public static void onExit(
|
||||||
|
@Binding.This Object object, @Binding.Class Object clazz,
|
||||||
|
@Binding.MethodName String methodName,
|
||||||
|
@Binding.MethodDesc String methodDesc
|
||||||
|
) {
|
||||||
|
System.err.println("onExit, object:" + object);
|
||||||
|
System.err.println("onExit, methodName:" + methodName);
|
||||||
|
System.err.println("onExit, methodDesc:" + methodDesc);
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
while (i++ < 3) {
|
||||||
|
System.err.println("exit: "+i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AtExceptionExit
|
||||||
|
public static void onException(@Binding.This Object object, @Binding.Class Object clazz,
|
||||||
|
@Binding.MethodName String methodName,
|
||||||
|
@Binding.MethodDesc String methodDesc,
|
||||||
|
@Binding.Throwable Throwable ex) {
|
||||||
|
System.err.println("onException: "+ex);
|
||||||
|
int i=0;
|
||||||
|
i+=3;
|
||||||
|
System.err.println("exception: "+i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test1() throws Exception {
|
||||||
|
TestHelper helper = TestHelper.builder().interceptorClass(EnterInterceptor.class).methodMatcher("hello")
|
||||||
|
.reTransform(true);
|
||||||
|
byte[] bytes = helper.process(Sample.class);
|
||||||
|
|
||||||
|
System.err.println(Decompiler.decompile(bytes));
|
||||||
|
|
||||||
|
new Sample().hello("abc", false);
|
||||||
|
|
||||||
|
String actual = capture.toString();
|
||||||
|
assertThat(actual).contains("onEnter, object:");
|
||||||
|
assertThat(actual).contains("enter: 3");
|
||||||
|
assertThat(actual).contains("onExit, object:");
|
||||||
|
assertThat(actual).contains("exit: 3");
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test2() throws Exception {
|
||||||
|
TestHelper helper = TestHelper.builder().interceptorClass(EnterInterceptor.class).methodMatcher("hello")
|
||||||
|
.reTransform(true);
|
||||||
|
byte[] bytes = helper.process(Sample.class);
|
||||||
|
|
||||||
|
System.err.println(Decompiler.decompile(bytes));
|
||||||
|
|
||||||
|
try {
|
||||||
|
new Sample().hello("abc", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
String actual = capture.toString();
|
||||||
|
assertThat(actual).contains("onEnter, object:");
|
||||||
|
assertThat(actual).contains("enter: 3");
|
||||||
|
assertThat(actual).contains("onException: java.lang.RuntimeException: test exception");
|
||||||
|
assertThat(actual).contains("exception: 3");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue