mirror of
https://github.com/alibaba/arthas.git
synced 2024-04-21 10:21:39 +00:00
fix stack command output null problem. #1231
This commit is contained in:
@@ -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 ")
|
||||
|
||||
Reference in New Issue
Block a user