gpt4 book ai didi

java - Stackwalker 的帧数少于 stacktrace 的元素数

转载 作者:行者123 更新时间:2023-12-02 02:49:05 31 4
gpt4 key购买 nike

我正在尝试使用 Java 9 的 Stackwalking API,并注意到收集的帧少于实际堆栈跟踪给出的帧。我想知道是否有可能获得相同数量的框架和元素?

看看下面的测试:

@Test
public void test() {
NaughtyBusiness nb = new NaughtyBusiness();
try {
//This method throws an exception
nb.callMeForGoodTime(NaughtyBusiness.AlcoholTolerance.LOW);
} catch (Exception e) {
StackTraceElement[] stackTrace = e.getStackTrace();

StackWalker stackWalker = StackWalker.getInstance(StackWalker.Option.SHOW_HIDDEN_FRAMES);
List<StackWalker.StackFrame> frames =
stackWalker.walk(stackFrameStream -> stackFrameStream.collect(toList()));

System.out.println(frames);
}
}

现在,如果我调试代码,我会看到以下内容:

enter image description here

第一个明显的区别是 StacktraceElements 与 StackFrames 的数量(26 与 23)。但更令人惊讶的是,丢失的帧(以红色标记)是真正有趣的帧,即来 self 的自定义代码,而两者之间共享的绿色部分只是样板。

因此,问题是,我如何使用 StackWalking API 获取“丢失”的帧?我尝试了 3 个选项 SHOW_HIDDEN_FRAMESRETAIN_CLASS_REFERENCESHOW_REFLECT_FRAMES,但没有任何效果。

最佳答案

StackWalker.walk 方法从调用它的地方构建堆栈帧。在本例中,您从 test() 方法调用它,因此它构建了从该方法开始的一系列堆栈帧。

StackWalker 根本不知道你捕获的异常。异常是从不同的地方抛出的,即 NaughtyBusiness.playStupidGamesWinStupidPrizes 方法,这就是它的堆栈帧不同的原因。

要获取与异常堆栈帧相同的 StackWalker 帧,您需要从引发异常的同一方法调用 StackWalker.walk

关于java - Stackwalker 的帧数少于 stacktrace 的元素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62352819/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com