前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java-堆栈打印

java-堆栈打印

原创
作者头像
cg错过
修改2020-11-23 11:13:48
2.1K0
修改2020-11-23 11:13:48
举报
文章被收录于专栏:程序笔记
前言

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

代码如下

代码语言:javascript
复制
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
复制
Thread.getAllStackTraces();

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

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

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

如输出


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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档