Skip to content

Commit

Permalink
1. 修复在阿里HotCode下无法启动的bug
Browse files Browse the repository at this point in the history
2. 修复ptrace命令'#cost'条件不准确的情况
  • Loading branch information
oldmanpushcart@gmail.com committed Nov 7, 2016
1 parent 8c33e40 commit 00e1dd3
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 26 deletions.
@@ -0,0 +1,36 @@
package com.github.ompc.greys.agent;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
* Agent ClassLoader
* Created by vlinux on 2016/11/7.
*/
public class AgentClassLoader extends URLClassLoader {


public AgentClassLoader(final String agentJar) throws MalformedURLException {
super(new URL[]{new URL("file:" + agentJar)});
}

@Override
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
final Class<?> loadedClass = findLoadedClass(name);
if (loadedClass != null) {
return loadedClass;
}

try {
Class<?> aClass = findClass(name);
if (resolve) {
resolveClass(aClass);
}
return aClass;
} catch (Exception e) {
return super.loadClass(name, resolve);
}
}

}
26 changes: 2 additions & 24 deletions agent/src/main/java/com/github/ompc/greys/agent/AgentLauncher.java
@@ -1,8 +1,6 @@
package com.github.ompc.greys.agent;

import java.lang.instrument.Instrumentation;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.JarFile;

/**
Expand Down Expand Up @@ -42,27 +40,7 @@ private static ClassLoader loadOrDefineClassLoader(String agentJar) throws Throw

// 如果未启动则重新加载
else {
classLoader = new URLClassLoader(new URL[]{new URL("file:" + agentJar)}) {

@Override
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
final Class<?> loadedClass = findLoadedClass(name);
if (loadedClass != null) {
return loadedClass;
}

try {
Class<?> aClass = findClass(name);
if (resolve) {
resolveClass(aClass);
}
return aClass;
} catch (Exception e) {
return super.loadClass(name, resolve);
}
}

};
classLoader = new AgentClassLoader(agentJar);

// 获取各种Hook
final Class<?> adviceWeaverClass = classLoader.loadClass("com.github.ompc.greys.core.advisor.AdviceWeaver");
Expand Down Expand Up @@ -151,7 +129,7 @@ private static synchronized void main(final String args, final Instrumentation i
if (!isBind) {
try {
classOfGaServer.getMethod("bind", classOfConfigure).invoke(objectOfGaServer, objectOfConfigure);
} catch(Throwable t) {
} catch (Throwable t) {
classOfGaServer.getMethod("destroy").invoke(objectOfGaServer);
throw t;
}
Expand Down
Expand Up @@ -157,6 +157,7 @@ public PointCut getPointCut() {
public AdviceListener getAdviceListener() {
return new ReflectAdviceListenerAdapter() {

private final InvokeCost topInvokeCost = new InvokeCost();
private final InvokeCost invokeCost = new InvokeCost();

private final ThreadLocal<PathTrace> pathTraceRef = new ThreadLocal<PathTrace>() {
Expand Down Expand Up @@ -213,6 +214,11 @@ public Entity init() {
}
});

// top invoke
if(entity.deep <= 0) {
topInvokeCost.begin();
}

entity.tTree.begin(advice.getClazz().getCanonicalName() + ":" + advice.getMethod().getName() + "()");
entity.deep++;
}
Expand Down Expand Up @@ -255,9 +261,12 @@ public void afterFinishing(Advice advice) throws Throwable {

if (entity.deep <= 0) {

// top invoke cost
final long topCost = topInvokeCost.cost();

// 是否有匹配到条件
// 之所以在这里主要是需要照顾到上下文参数对齐
if (isInCondition(advice, cost)) {
if (isInCondition(advice, topCost)) {
// 输出打印内容
if (isTimeTunnel) {
printer.println(entity.tTree.rendering() + entity.tfTable.rendering());
Expand Down
@@ -1 +1 @@
1.7.6.3
1.7.6.4

0 comments on commit 00e1dd3

Please sign in to comment.