Java 스택 추적 덤프의 표시 줄 수를 늘리려면 어떻게합니까?


답변:


122

그럴 필요가 없습니다. 해당 정보는 스택 추적의 다른 곳에 있습니다. 문서에서 printStackTrace():

문자가 포함 된 줄이 있는지 확인합니다 "...". 이러한 행은이 예외에 대한 스택 추적의 나머지 부분이이 예외 ( "포함"예외)로 인해 발생한 예외의 스택 추적 맨 아래에서 표시된 프레임 수와 일치 함을 나타냅니다.

이 약식은 "원인 예외"가 포착 된 것과 동일한 메서드에서 래핑 된 예외가 throw되는 일반적인 경우에 출력 길이를 크게 줄일 수 있습니다.

즉, "... x more"연결 예외에만 표시되며 x스택 추적 의 마지막 줄이 다른 연결 예외 스택 추적의 일부로 이미 존재 하는 경우에만 나타납니다 .

메소드가 예외 Foo를 포착하고이를 예외 Bar에 랩핑하고 Bar를 던진다 고 가정하십시오. 그러면 Foo의 스택 추적이 짧아집니다. 어떤 이유로 든 전체 트레이스를 원하면 ...Foo의 스택 트레이스 앞의 마지막 줄을 가져와 Bar의 스택 트레이스에서 찾는 것입니다. 그 라인 아래의 모든 것은 Foo의 스택 트레이스에 인쇄되었을 것입니다.


마지막 단락은 오해의 소지가 있습니다. 겹치는 부분이 없으며 앞의 줄 ...이 다른 첫 번째 프레임입니다. 그러나 적어도 그것을 찾는 데 도움이되는 동일한 클래스에있을 것입니다.
Marcono1234

5

당신을위한 방법에 대한 빠른 추측.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

Throwable.printStackTrace () 문서에서 스택 추적을 가져옵니다 .

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

원인은 맨 아래에 가장 많이 중첩 된 원인 ( "근본 원인")부터 인쇄 된 스택 추적이 속한 원인까지 표시됩니다.

이 경우 근본 원인은 LowLevelException원인 MidLevelException, 원인 HighLevelException입니다.

전체 스택 추적을 얻으려면 둘러싸는 예외 (및 둘러싸는 예외)의 프레임을 확인해야합니다.

  1. 생략 된 프레임 수를보십시오 : "... X more"
  2. 둘러싸는 예외에서 생략 된 프레임을 찾습니다.
    1. 생략 된 프레임 수를보십시오 : "... Y more"
    2. 스택 추적에 첫 번째 X-Y 프레임 추가
  3. Y> 0이면 생략 된 프레임 수로 2 단계를 반복합니다.

따라서 전체 스택 추적을 얻으려면 LowLevelException다음을 수행합니다.

  1. 생략 된 프레임 수를보십시오. "... 3 개 더"
  2. 둘러싸는 예외 ( MidLevelException) 에서 생략 된 프레임을 찾습니다.
    1. 1 개의 프레임이 생략되었습니다 ( "... 1 개 더")
    2. 스택 추적에 처음 2 (3-1) 프레임을 추가합니다.
  3. 생략 된 프레임 수로 1을 사용하여 2 단계를 반복합니다.
    1. MidLevelException( HighLevelException) 의 둘러싸는 예외를보십시오.
    2. 스택 추적에 처음 1 개 프레임 추가

전체 스택 추적은 다음과 같습니다.

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

참고 사항 :

  • 다음과 같이 프레임이 나열되지 않은 경우가있을 수 있습니다.

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    원인이 같은 줄에 생성 된 경우 발생할 수 있습니다 new HighLevelException(new MidLevelException()).. 이것에 대해 혼동하지 마십시오. 위에서 설명한 접근 방식은 여전히 ​​작동합니다. 예외에서 사용할 프레임이 없으며 둘러싸는 프레임을 계속합니다.

  • 어떤 경우에는 생략되지 않은 첫 번째 프레임 (위의 줄 ... X more) 을보고 계산을 직접 저장할 수 있습니다 . 해당 줄에서 메서드를 호출하는 메서드를 알고있는 경우 둘러싸는 예외의 프레임에서 호출자를 직접 검색 할 수 있습니다.

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.