- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在探索 jdk9 中引入的 StackWalking API。使用或不使用选项 StackWalker.Option.SHOW_HIDDEN_FRAMES
,我看不出输出有任何差异。
根据 API documentation :
A Java Virtual Machine implementation may hide implementation specific frames in addition to reflection frames. A StackWalker with this SHOW_HIDDEN_FRAMES option will show all hidden frames (including reflection frames)
谁能帮我理解 JVM 除了反射帧之外还能隐藏哪些帧?这个选项的具体用途是什么?
这是我的演示代码:
class DemoClass {
public static void a() {
b();
}
static void b() {
c();
}
static void c() {
d();
}
static void d() {
StackWalker sw = StackWalker.getInstance(Set.of(StackWalker.Option.RETAIN_CLASS_REFERENCE, StackWalker.Option.SHOW_HIDDEN_FRAMES));
sw.forEach(System.out::println);
}
}
public class StackWalkerAPI {
public static void main(String[] args) {
try {
Method methodA = Class.forName("DemoClass").getMethod("a");
methodA.invoke(null, (Object[]) null);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(StackWalkerAPI.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
最佳答案
不确定不能在 Java 9 中工作是什么意思。在这里,使用 this sample code , 详细解释与您类似的代码的输出:
StackWalker.Option.RETAIN_CLASS_REFERENCE
displays the Class object in StackFrames walked by this StackWalker.
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
StackWalker.Option.SHOW_REFLECT_FRAMES
Shows all reflection frames
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
注意这里的声明 java.base/java.lang.reflect.Method.invoke(Method.java:564)
,正如文档中提到的那样选项显示所有反射帧,包括 Method.invoke(o1,o2)
和 Constructor.newInstance(o)
。
StackWalker.Option.SHOW_HIDDEN_FRAMES
Shows all hidden frames.
internal/experiment.StackWalkerDemo.lambda$d$0(StackWalkerDemo.java:29)
internal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)
java.base/java.lang.Iterable.forEach(Iterable.java:75)
internal/experiment.StackWalkerDemo.d(StackWalkerDemo.java:28)
internal/experiment.StackWalkerDemo.c(StackWalkerDemo.java:20)
internal/experiment.StackWalkerDemo.b(StackWalkerDemo.java:16)
internal/experiment.StackWalkerDemo.a(StackWalkerDemo.java:12)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
internal/experiment.StackWalkerAPI.main(StackWalkerAPI.java:15)
寻找 internal/experiment.StackWalkerDemo$$Lambda$23/1358444045.accept(Unknown Source)
,这是一个用于对 lambda(实现特定的框架),并且可以使用此选项访问。
关于java - StackWalker.Option SHOW_HIDDEN_FRAMES 在 Java 9 中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45637205/
你知道如何在delphi中读取另一个进程堆栈吗?? 最佳答案 是的。 您可以使用 Toolhelp 枚举线程功能;使用 GetThreadContext() 获取上下文;并使用 ReadProcess
快速总结 简而言之,我希望访问有关堆栈的调试信息,最好是将信息传递给 Logger。 我希望信息告诉我函数名、行号和文件名。 我有这些符号,我正在尝试访问其中的垃圾值并将它们转换为英语。但是似乎没有任
有没有人知道比“StackWalk”更好/更快的获取调用堆栈的方法?我还认为 stackwalk 在有很多变量的方法上也会变慢......(我想知道商业分析员是做什么的?)我在 Windows 上使用
我可以构建 google breakpad 客户端,stackwalker 可以将转储转换为人类可读的 txt 文件。但是没有制作vs2008解决方案的gyp文件。有谁知道如何在 Windows 上构
我可能做错了什么,但我无法弄清楚这一点。 我有一个简单的崩溃小型转储,在 Windows 上生成。 如果我在 Visual Studio 中打开转储,它会毫无问题地加载并显示崩溃线。 但是我无法在 m
我正在尝试使用 Java 9 的 Stackwalking API,并注意到收集的帧少于实际堆栈跟踪给出的帧。我想知道是否有可能获得相同数量的框架和元素? 看看下面的测试: @Test public
我正在尝试使用 Java 9 的 Stackwalking API,并注意到收集的帧少于实际堆栈跟踪给出的帧。我想知道是否有可能获得相同数量的框架和元素? 看看下面的测试: @Test public
这是一个错误吗?我至少期望出现异常而不是空字符串: jshell> ((Supplier)(()->StackWalker.getInstance(StackWalker.Option.RETAIN_
我习惯于使用 gprof 来分析我的 C 代码,但我想开始使用基于 GUI 的 Windows 应用程序,例如 Luke Stackwalker。 gprof 在我的二进制文件上工作得很好,但是 Lu
需要通过线程句柄打印 C++ 应用程序线程的调用堆栈,我求助于 StackWalker这在以前的 stackoverflow 答案中提到过。 然而,the StakWalker code日期为 200
Java9 的新 StackWalker 特性让我意识到,如果 Eclipse(最好是 IntelliJ)可以配置为使用自定义 StackWalker,它可以修改 IDE 调试器中的正常调用堆栈 Vi
我正在尝试在异常 block 中打印堆栈遍历器,但它仅显示当前类 public class Test1 { public void test() throws Exception{
我一直在探索 jdk9 中引入的 StackWalking API。使用或不使用选项 StackWalker.Option.SHOW_HIDDEN_FRAMES,我看不出输出有任何差异。 根据 API
我是一名优秀的程序员,十分优秀!