如何使用Java中的StackWalker API打印不同的堆栈帧?


prtyaa
prtyaa 2024-01-08 23:08:06 62588 赞同 0 反对 0
分类: 资源 标签: 运维
Java 9 定义了一个StackWalkerAPI,它提供惰性和帧过滤。 StackWalker对象允许我们遍历和访问堆栈,并包含一个有用的方法:walk()。此方法为当前线程打开一个StackFrame流,然后将该函数应用于该StackFrame流。我们需要获取StackWalker对象,然后使用StackWalker.getInstance()方法。 在下面的示例中,我们可以打印不同的内容堆栈帧:所有堆栈帧、跳过某些堆栈帧以及使用StackWalkerAPI 限制堆栈帧

示例

import java.lang.StackWalker.StackFrame;
import java.util.*;
import java.util.stream.*;

public class StackWalkerTest {
public static void main(String args[]) {
new StackWalkerTest().walk();
}
private void walk() {
new Walker1().walk();
}
private class Walker1 {
public void walk() {
new Walker2().walk();
}
}
private class Walker2 {
public void walk() {
Method1();
}
void Method1() {
Method2();
}
void Method2() {
StackWalker stackWalker = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES), 16);
Stream stackStream = StackWalker.getInstance().walk(f -> f);

System.out.println(“— Walk all StackFrames —“);
List stacks = walkAllStackframes();
System.out.println(stacks);

System.out.println(“— Skip some StackFrames —“);
List stacksAfterSkip = walkSomeStackframes(3);
System.out.println(stacksAfterSkip);

System.out.println(“— Limit StackFrames —“);
List stacksByLimit = walkLimitStackframes(3);
System.out.println(stacksByLimit);
}
private List walkAllStackframes() {
return StackWalker.getInstance().walk(s -> s.map(frame -> “n” + frame.getClassName() + “/” + frame.getMethodName()).collect(Collectors.toList()));
}
private List walkSomeStackframes(int numberOfFrames) {
return StackWalker.getInstance().walk(s -> s.map(frame -> “n” + frame.getClassName() + “/” + frame.getMethodName()).skip(numberOfFrames).collect(Collectors.toList()));
}
private List walkLimitStackframes(int numberOfFrames) {
return StackWalker.getInstance().walk(s -> s.map(frame -> “n” + frame.getClassName() + “/” + frame.getMethodName()).limit(numberOfFrames).collect(Collectors.toList()));
}
}
}

输出

— Walk all StackFrames —
[
StackWalkerTest$Walker2/walkAllStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1,
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main
]
— Skip some StackFrames —
[
StackWalkerTest$Walker2/walk,
StackWalkerTest$Walker1/walk,
StackWalkerTest/walk,
StackWalkerTest/main
]
— Limit StackFrames —
[
StackWalkerTest$Walker2/walkLimitStackframes,
StackWalkerTest$Walker2/Method2,
StackWalkerTest$Walker2/Method1
]

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL0
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD  81
以openkylin为例编译安装内核  76
分享解决宏碁电脑关机时自动重启的方法  73
统信uosboot区分未挂载导致更新备份失败  63
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作  63
统信uos安装mysql的实例参考  60
格之格打印机dp3300系列国产系统uos打印机驱动选择  57
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。  51
MySQL国产平替最佳选择---万里数据库(GreatDB)  45
最近下载排行榜
银河麒麟桌面操作系统V10SP1-2403-update1版本中,通过“麒麟管家-设备管理-硬件信息-硬盘”查看硬盘类型时,显示的是HDD(机械硬盘),而实际上该笔记本的硬盘类型为SSD 0
以openkylin为例编译安装内核 0
分享解决宏碁电脑关机时自动重启的方法 0
统信uosboot区分未挂载导致更新备份失败 0
分享如何解决报错:归档 xxx.deb 对成员 control.tar.zst 使用了未知的压缩,放弃操作 0
统信uos安装mysql的实例参考 0
格之格打印机dp3300系列国产系统uos打印机驱动选择 0
在银河麒麟高级服务器操作系统V10SP3中,需要将默认shell类型修改为csh。 0
MySQL国产平替最佳选择---万里数据库(GreatDB) 0
作者收入月榜
1

prtyaa 收益400.83元

2

zlj141319 收益237.91元

3

哆啦漫漫喵 收益231.52元

4

IT-feng 收益219.92元

5

1843880570 收益214.2元

6

风晓 收益208.24元

7

777 收益173.17元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!