Skip to content

Commit 770b334

Browse files
authored
Merge pull request #284 from alibaba/develop-for-20200113
Develop for 20200113
2 parents c6db30d + ce0cbef commit 770b334

File tree

10 files changed

+363
-19
lines changed

10 files changed

+363
-19
lines changed

sandbox-core/src/main/java/com/alibaba/jvm/sandbox/core/enhance/weaver/asm/EventWeaver.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ public MethodVisitor visitMethod(final int access, final String name, final Stri
144144

145145
private final Label beginLabel = new Label();
146146
private final Label endLabel = new Label();
147+
private final Label startCatchBlock = new Label();
148+
private final Label endCatchBlock = new Label();
149+
private int newlocal = -1;
147150

148151
// 用来标记一个方法是否已经进入
149152
// JVM中的构造函数非常特殊,super();this();是在构造函数方法体执行之外进行,如果在这个之前进行了任何的流程改变操作
@@ -271,30 +274,28 @@ public void code() {
271274
}
272275
}
273276

274-
/**
275-
* 加载异常
276-
*/
277-
private void loadThrow() {
278-
dup();
279-
}
280-
281277
@Override
282278
public void visitMaxs(int maxStack, int maxLocals) {
283279
mark(endLabel);
284-
visitTryCatchBlock(beginLabel, endLabel, mark(), ASM_TYPE_THROWABLE.getInternalName());
280+
mv.visitLabel(startCatchBlock);
281+
visitTryCatchBlock(beginLabel, endLabel, startCatchBlock, ASM_TYPE_THROWABLE.getInternalName());
285282

286283
codeLockForTracing.lock(new CodeLock.Block() {
287284
@Override
288285
public void code() {
289-
loadThrow();
286+
newlocal = newLocal(ASM_TYPE_THROWABLE);
287+
storeLocal(newlocal);
288+
loadLocal(newlocal);
290289
push(namespace);
291290
push(listenerId);
292291
invokeStatic(ASM_TYPE_SPY, ASM_METHOD_Spy$spyMethodOnThrows);
293292
processControl();
293+
loadLocal(newlocal);
294294
}
295295
});
296296

297297
throwException();
298+
mv.visitLabel(endCatchBlock);
298299
super.visitMaxs(maxStack, maxLocals);
299300
}
300301

@@ -431,11 +432,14 @@ public void visitTryCatchBlock(Label start, Label end, Label handler, String typ
431432
asmTryCatchBlocks.add(new AsmTryCatchBlock(start, end, handler, type));
432433
}
433434

435+
436+
434437
@Override
435438
public void visitEnd() {
436439
for (AsmTryCatchBlock tcb : asmTryCatchBlocks) {
437440
super.visitTryCatchBlock(tcb.start, tcb.end, tcb.handler, tcb.type);
438441
}
442+
super.visitLocalVariable("t",ASM_TYPE_THROWABLE.getDescriptor(),null,startCatchBlock,endCatchBlock,newlocal);
439443
super.visitEnd();
440444
}
441445

sandbox-core/src/main/java/com/alibaba/jvm/sandbox/core/manager/impl/DefaultModuleEventWatcher.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ private void finishProgress(final Progress progress, final int cCnt, final int m
8282
/*
8383
* 形变观察所影响的类
8484
*/
85-
private void reTransformClasses(final int watchId,
86-
final List<Class<?>> waitingReTransformClasses,
87-
final Progress progress) {
85+
private void reTransformClasses(
86+
SandboxClassFileTransformer transformer,
87+
final int watchId,
88+
final List<Class<?>> waitingReTransformClasses,
89+
final Progress progress) {
8890

8991
// 需要形变总数
9092
final int total = waitingReTransformClasses.size();
@@ -116,6 +118,10 @@ private void reTransformClasses(final int watchId,
116118
);
117119
}
118120
}
121+
// 在真正做retransform 前的一刻,做addTransformer,避免java.lang.ClassCircularityError
122+
if(null != transformer){
123+
inst.addTransformer(transformer, true);
124+
}
119125
inst.retransformClasses(waitingReTransformClass);
120126
logger.info("watch={} in module={} single reTransform {} success, at index={};total={};",
121127
watchId, coreModule.getUniqueId(), waitingReTransformClass,
@@ -179,9 +185,6 @@ private int watch(final Matcher matcher,
179185
// 注册到CoreModule中
180186
coreModule.getSandboxClassFileTransformers().add(sandClassFileTransformer);
181187

182-
// 注册到JVM加载上ClassFileTransformer处理新增的类
183-
inst.addTransformer(sandClassFileTransformer, true);
184-
185188
// 查找需要渲染的类集合
186189
final List<Class<?>> waitingReTransformClasses = classDataSource.findForReTransform(matcher);
187190
logger.info("watch={} in module={} found {} classes for watch(ing).",
@@ -197,7 +200,7 @@ private int watch(final Matcher matcher,
197200
try {
198201

199202
// 应用JVM
200-
reTransformClasses(watchId, waitingReTransformClasses, progress);
203+
reTransformClasses(sandClassFileTransformer,watchId, waitingReTransformClasses, progress);
201204

202205
// 计数
203206
cCnt += sandClassFileTransformer.getAffectStatistic().cCnt();
@@ -264,7 +267,7 @@ public void delete(final int watcherId,
264267
beginProgress(progress, waitingReTransformClasses.size());
265268
try {
266269
// 应用JVM
267-
reTransformClasses(watcherId, waitingReTransformClasses, progress);
270+
reTransformClasses(null, watcherId, waitingReTransformClasses, progress);
268271
} finally {
269272
finishProgress(progress, cCnt, mCnt);
270273
}

sandbox-core/src/main/java/com/alibaba/jvm/sandbox/core/util/SandboxClassUtils.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,37 @@ && isSandboxPrefix(internalClassName)) {
3030

3131
// 类被com.alibaba.jvm.sandbox开头的ClassLoader所加载
3232
if (null != loader
33-
&& isSandboxPrefix(loader.getClass().getName())) {
33+
// fix issue #267
34+
&& isSandboxPrefix(normalizeClass(loader.getClass().getName()))) {
3435
return true;
3536
}
3637

3738
return false;
3839

3940
}
4041

42+
/**
43+
* 标准化类名
44+
* <p>
45+
* 入参:com.alibaba.jvm.sandbox
46+
* 返回:com/alibaba/jvm/sandbox
47+
* </p>
48+
*
49+
* @param className 类名
50+
* @return 标准化类名
51+
*/
52+
private static String normalizeClass(String className) {
53+
return className.replace(".", "/");
54+
}
55+
56+
/**
57+
* 是否是sandbox自身的类
58+
* <p>
59+
* 需要注意internalClassName的格式形如: com/alibaba/jvm/sandbox
60+
*
61+
* @param internalClassName 类资源名
62+
* @return true / false
63+
*/
4164
private static boolean isSandboxPrefix(String internalClassName) {
4265
return internalClassName.startsWith(SANDBOX_FAMILY_CLASS_RES_PREFIX)
4366
&& !isQaTestPrefix(internalClassName);

sandbox-core/src/test/java/com/alibaba/jvm/sandbox/qatest/core/enhance/CalculatorImplByAdviceListenerTestCase.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.alibaba.jvm.sandbox.qatest.core.enhance.listener.TracingAdviceListener;
55
import com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator;
66
import com.alibaba.jvm.sandbox.qatest.core.util.JvmHelper;
7+
import com.alibaba.jvm.sandbox.qatest.core.util.JvmHelper.ThirdTransformer;
8+
79
import org.junit.Test;
810

911
import static com.alibaba.jvm.sandbox.api.ProcessController.returnImmediately;
@@ -975,4 +977,25 @@ protected void before(Advice advice) throws Throwable {
975977
"AFTER|com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator.<init>(com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator$TestCase)|TRUE"
976978
);
977979
}
980+
981+
@Test
982+
@Override
983+
public void cal$report$multiEnhance() throws Throwable {
984+
final TracingAdviceListener listener;
985+
final Class<?> calculatorClass = JvmHelper
986+
.createJvm()
987+
.defineClass(
988+
Calculator.class,
989+
new JvmHelper.Transformer(
990+
CALCULATOR_REPORT_FILTER,
991+
listener = new TracingAdviceListener()
992+
),new ThirdTransformer(CALCULATOR_REPORT_FILTER,null)
993+
).loadClass(CALCULATOR_CLASS_NAME);
994+
report(newInstance(calculatorClass), "test");
995+
listener.assertTracing(
996+
"BEFORE|com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator.report(java.lang.String)|TRUE",
997+
"RETURN|com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator.report(java.lang.String)|TRUE",
998+
"AFTER|com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator.report(java.lang.String)|TRUE"
999+
);
1000+
}
9781001
}

sandbox-core/src/test/java/com/alibaba/jvm/sandbox/qatest/core/enhance/CalculatorImplByEventListenerTestCase.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import com.alibaba.jvm.sandbox.api.event.BeforeEvent;
44
import com.alibaba.jvm.sandbox.api.event.Event;
55
import com.alibaba.jvm.sandbox.qatest.core.enhance.listener.LineNumTracingEventListener;
6+
import com.alibaba.jvm.sandbox.qatest.core.enhance.listener.TracingAdviceListener;
67
import com.alibaba.jvm.sandbox.qatest.core.enhance.listener.TracingEventListener;
78
import com.alibaba.jvm.sandbox.qatest.core.enhance.target.Calculator;
89
import com.alibaba.jvm.sandbox.qatest.core.util.JvmHelper;
10+
import com.alibaba.jvm.sandbox.qatest.core.util.JvmHelper.ThirdTransformer;
11+
912
import org.junit.Ignore;
1013
import org.junit.Test;
1114

@@ -972,4 +975,25 @@ public void onEvent(Event event) throws Throwable {
972975
RETURN
973976
);
974977
}
978+
979+
@Test
980+
@Override
981+
public void cal$report$multiEnhance() throws Throwable {
982+
final TracingEventListener listener;
983+
final Class<?> calculatorClass = JvmHelper
984+
.createJvm()
985+
.defineClass(
986+
Calculator.class,
987+
new JvmHelper.Transformer(
988+
CALCULATOR_REPORT_FILTER,
989+
listener = new TracingEventListener(),
990+
BEFORE, RETURN, THROWS
991+
),new JvmHelper.ThirdTransformer(CALCULATOR_REPORT_FILTER,null)
992+
).loadClass(CALCULATOR_CLASS_NAME);
993+
report(newInstance(calculatorClass), "test");
994+
listener.assertEventTracing(
995+
BEFORE,
996+
RETURN
997+
);
998+
}
975999
}

sandbox-core/src/test/java/com/alibaba/jvm/sandbox/qatest/core/enhance/ICalculatorTestCase.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.alibaba.jvm.sandbox.qatest.core.enhance;
22

3+
import org.junit.Test;
4+
35
/**
46
* Calculator类测试用例接口
57
* <p>
@@ -269,4 +271,10 @@ public interface ICalculatorTestCase {
269271
*/
270272
void cal$init_with_TestCase$before$changeParameters() throws Throwable;
271273

274+
/**
275+
* {@code <init>(TestCase)}:调用跟踪 测试多次增强
276+
*
277+
* @throws Throwable 用例抛出异常
278+
*/
279+
void cal$report$multiEnhance() throws Throwable;
272280
}

sandbox-core/src/test/java/com/alibaba/jvm/sandbox/qatest/core/enhance/target/Calculator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,11 @@ public static void settCaseInStatic(TestCase tCase){
147147
tCaseInStatic=tCase;
148148
}
149149

150+
/**
151+
* 空方法
152+
*/
153+
public void report(String param){
154+
155+
}
156+
150157
}

0 commit comments

Comments
 (0)