首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java-堆栈打印

java-堆栈打印

原创
作者头像
cg错过
修改2020-11-23 11:13:48
修改2020-11-23 11:13:48
2.4K00
代码可运行
举报
文章被收录于专栏:程序笔记程序笔记
运行总次数:0
代码可运行
前言

在做调试bug的时候, 想测试知道这些流程是怎么调用的, 就需要打印其堆栈信息 这里只是封装了一个工具函数, 看自己使用

代码如下

代码语言:javascript
代码运行次数:0
运行
复制
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获取当时的堆栈, 同时, 也可以获取所有线程的堆栈信息, 调用的是

代码语言:javascript
代码运行次数:0
运行
复制
Thread.getAllStackTraces();

返回一个Map, 遍历其就可以了

使用的话, 直接在想要打印的地方插入一行调用该方法

代码语言:javascript
代码运行次数:0
运行
复制
@Test
public void showStackTrace() {
	printCallStack(10);
//  printCallStack(10, false);
}

如输出


文章首发来自公众号: 程序员品

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档