fix stack command output null problem. #1231

This commit is contained in:
hengyunabc
2020-06-04 14:24:25 +08:00
parent 4bcf45a5e7
commit a79c82efbd
@@ -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 {
}
/**
* </pre>
* 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)
* </pre>
*/
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 ")