stack trace - जावा में वर्तमान स्टैक ट्रेस प्राप्त करें




stack-trace java (14)

मैं जावा में वर्तमान स्टैक ट्रेस कैसे प्राप्त करूं, जैसे .NET आप Environment.StackTrace कर सकते हैं। Environment.StackTrace ?

बीटीडब्ल्यू, Thread.dumpStack() वह नहीं है जो मैं चाहता हूं - मैं स्टैक ट्रेस वापस प्राप्त करना चाहता हूं, इसे प्रिंट न करें।


अमरूद के साथ स्ट्रिंग करने के लिए:

Throwables.getStackTraceAsString(new Throwable())

आप Thread .currentThread().getStackTrace() उपयोग कर सकते हैं।

यह StackTraceElement s की एक सरणी देता है जो किसी प्रोग्राम के वर्तमान स्टैक ट्रेस का प्रतिनिधित्व करता है।


एंड्रॉइड पर इसका उपयोग करना एक आसान तरीका है:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 

एक और समाधान (केवल 35 31 वर्ण):

new Exception().printStackTrace();   
new Error().printStackTrace();

मुझे मूर्खतापूर्ण, यह Thread.currentThread().getStackTrace();


मेरा सुझाव है कि

  Thread.dumpStack()

एक आसान तरीका है और वास्तव में एक अपवाद या फेंकने का निर्माण नहीं करने का लाभ होता है जब कोई समस्या नहीं हो सकती है, और यह काफी हद तक अधिक है।


मैंने ऊपर से जवाब और स्वरूपण जोड़ा

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

यदि आप अपनी प्रक्रिया के वर्तमान कॉल स्टैक को देखना चाहते हैं तो आप jstack उपयोगिता का उपयोग कर सकते हैं।

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] [[email protected]]<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

शायद आप इसे आजमा सकते हैं:

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

स्ट्रिंग 'errorDetail' में स्टैकट्रैक होता है।


सभी धागे के स्टैक ट्रेस प्राप्त करने के लिए आप या तो जेस्टैक यूटिलिटी, जेकोनसोल का उपयोग कर सकते हैं या एक मार-विट सिग्नल (पॉज़िक्स ऑपरेटिंग सिस्टम पर) भेज सकते हैं।

हालांकि, अगर आप प्रोग्रामेटिक रूप से ऐसा करना चाहते हैं तो आप थ्रेडएमएक्सबीन का उपयोग करने का प्रयास कर सकते हैं:

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

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

जैसा कि बताया गया है, यदि आप केवल मौजूदा थ्रेड के स्टैक ट्रेस चाहते हैं तो यह बहुत आसान है - बस Thread.currentThread().getStackTrace() उपयोग करें। Thread.currentThread().getStackTrace() ;


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

इससे आपको लूप के बिना स्टैक ट्रेस प्रिंट करने में मदद मिलेगी।


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

सरणी का अंतिम तत्व ढेर के नीचे दर्शाता है, जो अनुक्रम में कम से कम हालिया विधि आमंत्रण है।

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

StackTraceElement के माध्यम से लूप और अपना वांछित परिणाम प्राप्त करें।

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

Thread.currentThread().getStackTrace();

ठीक है अगर आपको परवाह नहीं है कि स्टैक का पहला तत्व क्या है।

new Throwable().getStackTrace();

यदि आपकी मायने रखती है, तो आपकी वर्तमान विधि के लिए एक निर्धारित स्थिति होगी।


for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}