programing tip

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

itbloger 2020. 9. 4. 07:00
반응형

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


Throwable.printStackTrace(PrintStream s)마지막 줄 너머를 볼 수 있도록 전체 스택 추적 인쇄 하는 방법 "... 40 more"있습니까?


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

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

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

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

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


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

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

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()).. 이것에 대해 혼동하지 마십시오. 위에서 설명한 접근 방식은 여전히 ​​작동합니다. 예외에서 사용할 프레임이 없으며 둘러싸는 프레임을 계속합니다.

  • In some cases you can save yourself the counting by looking at the first frame which was not omitted (the line above ... X more). If you know which methods call the method in that line you can directly search for the callers in the frames of the enclosing exception:

    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
    

참고URL : https://stackoverflow.com/questions/1167888/how-do-i-increase-the-number-of-displayed-lines-of-a-java-stack-trace-dump

반응형