Obter a localização actual da pilha em Java

como é que eu consigo o traço actual da pilha em Java, como em . Net tu consegues fazer Environment.StackTrace?

BTW, Thread.dumpStack() não é o que eu quero - eu quero recuperar o stack trace, não imprimi-lo.

Author: Blorgbeard, 2009-07-01

22 answers

Pode usar Thread.currentThread().getStackTrace().

Que devolve um conjunto de StackTraceElements que representam o traço atual da pilha de um programa.

 1021
Author: jjnguy, 2014-08-02 16:22:17
Thread.currentThread().getStackTrace();

Está bem se você não se importa qual é o primeiro elemento da pilha.

new Throwable().getStackTrace();

Terá uma posição definida para o seu método actual, se isso for importante.

 235
Author: Yishai, 2009-07-01 13:29:12
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}
 162
Author: Leif Gruenwoldt, 2012-10-04 06:46:24
Thread.currentThread().getStackTrace();

Está disponível desde JDK1. 5.

Para uma versão mais antiga, você pode redirecionar {[[2]} para um StringWriter() :

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
 54
Author: RealHowTo, 2010-04-20 15:32:45

Você pode usar o Apache commons para isso:

String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
 35
Author: stikkos, 2016-04-03 19:43:43

No android uma maneira muito mais fácil é usar isto:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 
 21
Author: Vicky Kapadia, 2015-10-26 22:25:07

Para obter o traço da pilha de todos os tópicos, poderá usar o utilitário jstack, o JConsole ou enviar um sinal kill-quit (num sistema operativo Posix).

No entanto, se quiser fazer isto programaticamente, pode tentar usar ThreadMXBean:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);

for (ThreadInfo info : infos) {
  StackTraceElement[] elems = info.getStackTrace();
  // Print out elements, etc.
}

Como mencionado, se você só quer o traço de pilha do tópico atual é muito mais fácil-basta usar Thread.currentThread().getStackTrace();

 18
Author: Adamski, 2011-05-20 14:43:45

Outra solução (apenas 35 31 caracteres):

new Exception().printStackTrace();   
new Error().printStackTrace();
 16
Author: kukis, 2016-03-18 06:57:28
Que tolice a minha.Thread.currentThread().getStackTrace();
 12
Author: ripper234, 2009-07-01 13:31:33
Tony, como comentário à resposta aceite, deu o que parece ser a melhor resposta que realmente responde à pergunta da OP.:
Arrays.toString(Thread.currentThread().getStackTrace());

... a operação Não pergunte como obter um String da pilha de um Exception. E embora eu seja um grande fã do Apache Commons, quando há algo tão simples quanto o acima não há nenhuma razão lógica para usar uma biblioteca externa.

 9
Author: mike rodent, 2017-06-07 20:02:05

Para colar com goiaba:

Throwables.getStackTraceAsString(new Throwable())
 8
Author: Zitrax, 2014-02-24 12:45:26

Sugiro que

  Thread.dumpStack()

É uma maneira mais fácil e tem a vantagem de não construir realmente uma exceção ou descartável quando pode não haver um problema em tudo, e é consideravelmente mais para o ponto.

 8
Author: Thomas Adkins, 2017-07-18 01:55:40

Tenho um método utilitário que devolve um texto com o stacktrace:

static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw, true);
    t.printStackTrace(pw);
    pw.flush();
    sw.flush();
    return sw.toString();
}
E faz logit...
... 
catch (FileNotFoundException e) {
    logger.config(getStackTrace(e));
}
 7
Author: Salvador Valencia, 2012-05-06 23:54:10

Em Java 9 há uma nova maneira:

public static void showTrace() {

  List<StackFrame> frames =
    StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
               .walk( stream  -> stream.collect( Collectors.toList() ) );

  for ( StackFrame stackFrame : frames )
    System.out.println( stackFrame );
}
 7
Author: Christian Ullenboom, 2017-02-28 20:47:44
try {
}
catch(Exception e) {
    StackTraceElement[] traceElements = e.getStackTrace();
    //...
}

Ou

Thread.currentThread().getStackTrace()
 6
Author: butterchicken, 2009-07-01 13:19:06
Talvez pudesses tentar isto.
catch(Exception e)
{
    StringWriter writer = new StringWriter();
    PrintWriter pw = new PrintWriter(writer);
    e.printStackTrace(pw);
    String errorDetail = writer.toString();
}

O texto 'errorDetail' contém o stacktrace.

 4
Author: user1782556, 2015-04-20 15:11:59
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

O último elemento do array representa o fundo da pilha, que é a invocação do método menos recente na sequência.

A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().

Passa pelo StackTraceElement e obtém o resultado desejado.

for (StackTraceElement ste : stackTraceElements ) 
{
    //do your stuff here...
}
 4
Author: Xar E Ahmer, 2015-07-23 08:09:07

Pode usar o utilitário jstack se quiser verificar a pilha de chamadas actual do seu processo.

Usage:
    jstack [-l] <pid>
        (to connect to running process)
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process)
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file)
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server)

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message
 2
Author: Sampath, 2016-06-24 09:24:16

Usei respostas de cima e adicionei formatação

public final class DebugUtil {

    private static final String SEPARATOR = "\n";

    private DebugUtil() {
    }

    public static String formatStackTrace(StackTraceElement[] stackTrace) {
        StringBuilder buffer = new StringBuilder();
        for (StackTraceElement element : stackTrace) {
            buffer.append(element).append(SEPARATOR);
        }
        return buffer.toString();
    }

    public static String formatCurrentStacktrace() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return formatStackTrace(stackTrace);
    }
}
 2
Author: , 2017-08-23 15:44:27

Obter stacktrace:

StackTraceElement[] ste = Thread.currentThread().getStackTrace();

Imprimir o stacktrace (JAVA 9+):

Arrays.asList(ste).stream().forEach(System.out::println);

Imprimir o stacktrage (JAVA 7):

StringBuilder sb = new StringBuilder();

for (StackTraceElement st : ste) {
    sb.append(st.toString() + System.lineSeparator());
}
System.out.println(sb);
 0
Author: Witold Kaczurba, 2018-08-22 11:50:23
Este é um post antigo, mas aqui está a minha solução:
Thread.currentThread().dumpStack();

Mais informação e mais métodos lá : http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html

 -1
Author: Manov, 2016-06-25 03:14:51

System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));

Isto irá ajudá-lo a imprimir o traço da pilha sem loop.

 -1
Author: Bhuvanwaitz, 2017-06-06 11:15:46