diff --git a/core/src/main/java/com/taobao/arthas/core/command/view/TraceView.java b/core/src/main/java/com/taobao/arthas/core/command/view/TraceView.java index 65e92ad3e..d262617ee 100644 --- a/core/src/main/java/com/taobao/arthas/core/command/view/TraceView.java +++ b/core/src/main/java/com/taobao/arthas/core/command/view/TraceView.java @@ -10,7 +10,7 @@ import com.taobao.arthas.core.util.DateUtils; import com.taobao.arthas.core.util.StringUtils; import com.taobao.arthas.core.view.Ansi; -import java.util.List; +import java.util.*; import static java.lang.String.format; @@ -44,7 +44,15 @@ public class TraceView extends ResultView { final StringBuilder treeSB = new StringBuilder(2048); final Ansi highlighted = Ansi.ansi().fg(Ansi.Color.RED); + final Ansi tipsColor = Ansi.ansi().fg(Ansi.Color.GREEN); + + final Map depthMaxCostNodeMap = new TreeMap(new Comparator() { + @Override + public int compare(Integer left, Integer right) { + return left.compareTo(right); + } + }); recursive(0, true, "", root, new Callback() { @Override @@ -55,10 +63,30 @@ public class TraceView extends ResultView { treeSB.append(" [").append(node.getMark()).append(node.marks() > 1 ? "," + node.marks() : "").append("]"); } treeSB.append("\n"); + if(node instanceof MethodNode) { + MethodNode newNode = (MethodNode) node; + MethodNode oldNode = depthMaxCostNodeMap.get(deep); + if(oldNode == null || oldNode.getCost() < newNode.getCost()){ + depthMaxCostNodeMap.put(deep, newNode); + } + } } }); + if(depthMaxCostNodeMap.size() != 0 ){ + Set classNameSet = new LinkedHashSet(); + Set methodNameSet = new LinkedHashSet(); + for( MethodNode methodNode: depthMaxCostNodeMap.values()) { + classNameSet.add(methodNode.getClassName()); + methodNameSet.add(methodNode.getMethodName()); + } + treeSB.append(tipsColor.a(new StringBuilder("Tips: trace -E ") + .append(StringUtils.join(classNameSet.toArray(), "|")).append(' ') + .append(StringUtils.join(methodNameSet.toArray(), "|")).append('\n')) + .reset().toString()); + } + return treeSB.toString(); }