簡體   English   中英

如何強制 java 顯示完整的堆棧跟蹤

[英]How to force java to show full stack trace

我正在嘗試調試引發異常的應用程序的問題,即使我使用-XX:MaxJavaStackTraceDepth=16777216 (或那里的任何其他值,如-12048 ),堆棧跟蹤也會被切斷。

它像這樣被切斷:

Caused by: java.lang.IllegalStateException: unexpected message type: DefaultLastHttpContent
    at io.netty.handler.codec.http.HttpObjectEncoder.encode(HttpObjectEncoder.java:124)
    at io.netty.handler.codec.http.HttpClientCodec$Encoder.encode(HttpClientCodec.java:167)
    at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89)
    ... 89 more

我希望看到更多堆棧跟蹤元素而不是... 89 more如何實現?

這是在 Java 8 中,使用 SLF4J + Logback 進行日志記錄,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
            </Pattern>
        </layout>
    </appender>
    <root level="info">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

當您有這樣的示例程序時:

public class ExceptionExample {
    public static void main(String[] args) {
        foo();
    }
    static void foo() {
        bar();
    }
    static void bar() {
        try { baz(); }
        catch(Exception ex) { throw new RuntimeException("secondary", ex); }
    }
    static void baz() {
        throw new RuntimeException("primary");
    }
}

它將產生:

Exception in thread "main" java.lang.RuntimeException: secondary
    at ExceptionExample.bar(ExceptionExample.java:11)
    at ExceptionExample.foo(ExceptionExample.java:7)
    at ExceptionExample.main(ExceptionExample.java:4)
Caused by: java.lang.RuntimeException: primary
    at ExceptionExample.baz(ExceptionExample.java:14)
    at ExceptionExample.bar(ExceptionExample.java:10)
    ... 2 more

由於在bar中,導致異常的方法調用與包裝輔助異常的構造位於不同的行,因此它出現在兩個堆棧跟蹤中。 bar的調用鏈,即main > foo是相同的,因此在原因中被省略。

堆棧跟蹤仍然記錄在 throwable 中,僅影響打印。 這就是為什么有關記錄的 JVM 選項不會影響這一點的原因。 例如

public class ExceptionExample {
    public static void main(String[] args) {
        try {
            foo();
        }
        catch(Throwable t) {
            for(; t != null; t = t.getCause()) {
                System.err.println(t);
                for(StackTraceElement e: t.getStackTrace())
                    System.err.println("\tat "+e);
            }
        }
    }
    static void foo() {
        bar();
    }
    static void bar() {
        try { baz(); }
        catch(Exception ex) { throw new RuntimeException("secondary", ex); }
    }
    static void baz() {
        throw new RuntimeException("primary");
    }
}

將打印

java.lang.RuntimeException: secondary
    at ExceptionExample.bar(ExceptionExample.java:20)
    at ExceptionExample.foo(ExceptionExample.java:16)
    at ExceptionExample.main(ExceptionExample.java:5)
java.lang.RuntimeException: primary
    at ExceptionExample.baz(ExceptionExample.java:23)
    at ExceptionExample.bar(ExceptionExample.java:19)
    at ExceptionExample.foo(ExceptionExample.java:16)
    at ExceptionExample.main(ExceptionExample.java:5)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM