代码之家  ›  专栏  ›  技术社区  ›  corgrath

在java中,有没有一种方法可以在不抛出异常的情况下转储堆栈跟踪?

  •  208
  • corgrath  · 技术社区  · 16 年前

    我想知道是否有可能获得堆栈跟踪,就像 Exception.printStackTrace()

    10 回复  |  直到 10 年前
        1
  •  72
  •   Jonas Czech luksch    10 年前

    Thread.dumpStack()
    
        2
  •  204
  •   jjnguy Julien Chastang    16 年前

    Thread.getAllStackTraces() 获取所有活动线程的堆栈跟踪图。

        3
  •  35
  •   Tom Anderson    16 年前

    线程.currentThread()。 getStackTrace()

    private String getCallingMethodName() {
        StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
        return callingFrame.getMethodName();
    }
    

    并从需要知道其调用者是谁的方法中调用该方法。但是,有一句警告:列表中调用帧的索引可能因JVM而异!这完全取决于在生成跟踪之前getStackTrace中有多少层调用。一个更稳健的解决方案是获取跟踪,并对其进行迭代,寻找getCallingMethodName的帧,然后再向前走两步,找到真正的调用者。

        4
  •  28
  •   Gerco Dries    16 年前

    你可以得到这样的堆栈跟踪:

    Throwable t = new Throwable();
    t.printStackTrace();
    

    如果你想访问帧,你可以使用t.getStackTrace()来获取堆栈帧数组。

        5
  •  12
  •   Ariel T    12 年前

    请注意,Thread.dumpStack()实际上抛出了一个异常:

    new Exception("Stack trace").printStackTrace();
    
        6
  •  6
  •   Andrew Newdigate    16 年前

    Java 9引入了 StackWalker

    以下是Javadoc中的一些片段:

    walk StackFrames 对于当前线程,然后应用给定的函数遍历 StackFrame 溪流。流按顺序报告堆栈帧元素,从表示生成堆栈的执行点的最顶部帧到最底部帧。这 调用栈 IllegalStateException 将被抛出。

    ...

    1. List<StackFrame> stack = StackWalker.getInstance().walk(s ->
       s.limit(10).collect(Collectors.toList()));
      
        7
  •  4
  •   Ricardo Jl Rufino    8 年前

    kill -QUIT process_id

    JDK6引入了另一个选项,jstack命令,它将显示计算机上任何正在运行的JDK6进程的堆栈:

    jstack [-l] <pid>

    这些选项对于在生产环境中运行且不易修改的应用程序非常有用。它们对于诊断运行时死锁或性能问题特别有用。

    http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html

        8
  •  2
  •   mkobit    7 年前

    如果您需要捕获输出

    StringWriter sw = new StringWriter();
    new Throwable("").printStackTrace(new PrintWriter(sw));
    String stackTrace = sw.toString();
    
        9
  •  0
  •   Kenster marc_s    8 年前

    answer by Rob Di Marco stderr .

    如果你想捕捉到 String ,使用正常跟踪的新行,您可以这样做:

    Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );