From a79c82efbd0eb6afcbf013db8a00e3c6b0985f6a Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Thu, 4 Jun 2020 14:24:25 +0800 Subject: [PATCH] fix stack command output null problem. #1231 --- .../taobao/arthas/core/util/ThreadUtil.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java b/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java index 6d094cc6c..370e93ec4 100644 --- a/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java +++ b/core/src/main/java/com/taobao/arthas/core/util/ThreadUtil.java @@ -2,6 +2,7 @@ package com.taobao.arthas.core.util; import com.taobao.arthas.core.view.Ansi; +import java.arthas.SpyAPI; import java.lang.management.*; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -339,6 +340,35 @@ abstract public class ThreadUtil { } + /** + * + * java.lang.Thread.getStackTrace(Thread.java:1559), + * com.taobao.arthas.core.util.ThreadUtil.getThreadStack(ThreadUtil.java:349), + * com.taobao.arthas.core.command.monitor200.StackAdviceListener.before(StackAdviceListener.java:33), + * com.taobao.arthas.core.advisor.AdviceListenerAdapter.before(AdviceListenerAdapter.java:49), + * com.taobao.arthas.core.advisor.SpyImpl.atEnter(SpyImpl.java:42), + * java.arthas.SpyAPI.atEnter(SpyAPI.java:40), + * demo.MathGame.print(MathGame.java), demo.MathGame.run(MathGame.java:25), + * demo.MathGame.main(MathGame.java:16) + * + */ + private static int MAGIC_STACK_DEPTH = 0; + + private static int findTheSpyAPIDepth(StackTraceElement[] stackTraceElementArray) { + if (MAGIC_STACK_DEPTH > 0) { + return MAGIC_STACK_DEPTH; + } + if (MAGIC_STACK_DEPTH > stackTraceElementArray.length) { + return 0; + } + for (int i = 0; i < stackTraceElementArray.length; ++i) { + if (SpyAPI.class.getName().equals(stackTraceElementArray[i].getClassName())) { + MAGIC_STACK_DEPTH = i + 1; + break; + } + } + return MAGIC_STACK_DEPTH; + } /** * 获取方法执行堆栈信息 @@ -347,15 +377,16 @@ abstract public class ThreadUtil { */ public static String getThreadStack(Thread currentThread) { StackTraceElement[] stackTraceElementArray = currentThread.getStackTrace(); + int magicStackDepth = findTheSpyAPIDepth(stackTraceElementArray); - StackTraceElement locationStackTraceElement = stackTraceElementArray[10]; + StackTraceElement locationStackTraceElement = stackTraceElementArray[magicStackDepth]; String locationString = String.format(" @%s.%s()", locationStackTraceElement.getClassName(), locationStackTraceElement.getMethodName()); StringBuilder builder = new StringBuilder(); builder.append(getThreadTitle(currentThread)).append("\n").append(locationString).append("\n"); - int skip = 11; + int skip = magicStackDepth + 1; for (int index = skip; index < stackTraceElementArray.length; index++) { StackTraceElement ste = stackTraceElementArray[index]; builder.append(" at ")