Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách lấy stack trace dùng thread trong Java 9?

Java 9 thêm lớp StackWalker cung cấp API chuẩn truy cập stack của thread hiện tại. Phiên bản Java trước dùng Throwable::getStackTrace, Thread::getStackTrace, và SecurityManager::GetClassContext để lấy thread stack.

Phương thức Thread.getStackTrace() trả về mảng stack trace element đại diện cho stack dump của thread (StackTraceElement[]). Phần tử đầu mảng là đỉnh stack (gọi phương thức cuối cùng), phần tử cuối là đáy stack (gọi phương thức đầu tiên).

Cú pháp

public StackTraceElement[] getStackTrace()

Ví dụ

import java.lang.StackWalker.Option;

public class GetStackTraceTest {
    public static void main(String args[]) {
        GetStackTraceTest.testPrintCurrnentStackTrace();
        GetStackTraceTest.testShowReflectFrames();
    }

    // get StackTrace using Thread
    public static void testPrintCurrnentStackTrace() {
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        for (StackTraceElement element : stack) {
            System.out.println(element);
        }
    }

    // SHOW_REFLECT_FRAMES
    public static void print(StackWalker stackWalker) {
        stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n", stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
    }

    public static void testShowReflectFrames() {
        final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
        print(stackWalker);
    }
}

Kết quả

java.base/java.lang.Thread.getStackTrace(Thread.java:1654)
GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10)
GetStackTraceTest.main(GetStackTraceTest.java:5)
17| GetStackTraceTest -> print
25| GetStackTraceTest -> testShowReflectFrames
6| GetStackTraceTest -> main