在做调试bug
的时候, 想测试知道这些流程是怎么调用的, 就需要打印其堆栈信息 这里只是封装了一个工具函数, 看自己使用
代码如下
public static void printCallStack() {
printCallStack(0);
}
public static void printCallStack(int elementMax) {
printCallStack(elementMax, true);
}
/**
* 打印堆栈
*
* @param elementMax 打印的调用链数, 默认0: 无限制
* @param currentThread 是否仅当前线程, 默认true
*/
public static void printCallStack(int elementMax, boolean currentThread) {
if (currentThread) {
StackTraceElement[] stackElements = Thread.currentThread().getStackTrace();
printElement(elementMax, stackElements);
return;
}
Map<Thread, StackTraceElement[]> stackElementsMap = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> entry : stackElementsMap.entrySet()) {
String threadName = entry.getKey().getName();
StackTraceElement[] elements = entry.getValue();
System.out.println("thread name: " + threadName);
printElement(elementMax, elements);
}
}
private static void printElement(int elementMax, StackTraceElement[] stackElements) {
if (stackElements == null) {
return;
}
int num = 0;
for (StackTraceElement element : stackElements) {
if (elementMax != 0 && num >= elementMax) {
return;
}
String msg = "%s(%s:%s)-%s()";
msg = String.format(msg, element.getClassName(), element.getFileName(), element.getLineNumber(), element.getMethodName());
System.out.println(msg);
num++;
}
}
其实也只是使用线程来根据当前所在的Thread
获取当时的堆栈, 同时, 也可以获取所有线程的堆栈信息, 调用的是
Thread.getAllStackTraces();
返回一个Map
, 遍历其就可以了
使用的话, 直接在想要打印的地方插入一行调用该方法
如
@Test
public void showStackTrace() {
printCallStack(10);
// printCallStack(10, false);
}
如输出
文章首发来自公众号: 程序员品
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。