1128 Stimmen

Wie kann ich den aktuellen Stack-Trace in Java abrufen?

Wie erhalte ich die aktuelle Stapelverfolgung in Java, so wie man in .NET Folgendes tun kann Environment.StackTrace ?

Ich fand Thread.dumpStack() aber das ist nicht das, was ich will - ich möchte den Stack-Trace zurückbekommen, nicht ausdrucken.

8voto

butterchicken Punkte 13015
try {
}
catch(Exception e) {
    StackTraceElement[] traceElements = e.getStackTrace();
    //...
}

oder

Thread.currentThread().getStackTrace()

5voto

Sampath Punkte 1019

Sie können das Dienstprogramm jstack verwenden, wenn Sie den aktuellen Aufrufstapel Ihres Prozesses überprüfen möchten.

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

5voto

Zar E Ahmer Punkte 32557
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();

Das letzte Element des Arrays stellt das unterste Element des Stapels dar, also den jüngsten Methodenaufruf in der Sequenz.

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

Schleife durch StackTraceElement und erhalten Sie das gewünschte Ergebnis.

for (StackTraceElement ste : stackTraceElements ) 
{
    //do your stuff here...
}

5voto

Dinesh Kumar Punkte 2415

Vielleicht können Sie dies versuchen:

catch(Exception e)
{
    StringWriter writer = new StringWriter();
    PrintWriter pw = new PrintWriter(writer);
    e.printStackTrace(pw);
    String errorDetail = writer.toString();
}

Die Zeichenkette 'errorDetail' enthält den Stacktrace.

4voto

Ich habe die Antworten von oben verwendet und Formatierungen hinzugefügt

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);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X