IT이야기

자바에서 예외를 던지지 않고 스택 추적을 버리는 방법이 있는가?

cyworld 2022. 5. 20. 21:39
반응형

자바에서 예외를 던지지 않고 스택 추적을 버리는 방법이 있는가?

내 Java 응용 프로그램에 대한 디버그 도구를 만들까 생각 중이야.

이렇게 스택 추적이 가능한지 궁금하다.Exception.printStackTrace()예외 없이?

내 목표는, 어떤 방법으로든, 메서드 호출자가 누구인지 보기 위해 스택을 버리는 것이다.

그래, 그냥 사용해.

Thread.dumpStack()

너도 시도할 수 있다.Thread.getAllStackTraces()살아 있는 모든 스레드에 대한 스택 추적 맵을 얻으십시오.​​​​​​

Ram의 제안대로 시스템의 모든 스레드가 아닌 현재 스레드에 대한 추적을 원할 경우 다음을 수행하십시오.

스레드.전류스레드().getStackTrace()

호출자를 찾으려면 다음을 수행하십시오.

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

그리고 발신자가 누구인지 알아야 하는 방법 내에서 그 방법을 호출한다.그러나, 경고의 한 마디: 리스트 내의 호출 프레임의 지수는 JVM에 따라 달라질 수 있다!이 모든 것은 추적이 생성되는 지점에 도달하기 전에 getStackTrace 내에 얼마나 많은 통화 계층이 있는지 여부에 달려 있다.더 강력한 해결책은 추적한 후 getCallingMethodName 프레임을 찾아 반복한 다음 두 단계 더 올라가서 진정한 발신자를 찾는 것이다.

다음과 같은 스택 추적을 얻을 수 있다.

Throwable t = new Throwable();
t.printStackTrace();

프레임에 액세스하려면 t.getStackTrace()를 사용하여 스택 프레임 배열을 가져오십시오.

Hotspot 컴파일러가 사물을 최적화하느라 바빴을 경우 이 스택 트레이스(다른 것과 마찬가지로)에 일부 프레임이 누락되었을 수 있다는 점에 유의하십시오.

Thread.dumpStack()은 실제로 다음과 같은 예외를 발생시킨다는 점에 유의하십시오.

new Exception("Stack trace").printStackTrace();

Java 9는 스택을 걷기 위한 및 지원 클래스를 도입했다.

자바도크에서 온 몇 가지 작은 조각들이 있다.

메소드는 현재 스레드에 대해 의 순차 스트림을 연 다음 지정된 기능을 적용하여StackFrame물줄기가 흐르다스트림은 스택이 생성된 실행 지점을 나타내는 맨 위 프레임부터 맨 아래 프레임까지 스택 프레임 요소를 순서대로 보고한다.StackFrame걷기 방법이 반환되면 스트림이 닫힌다.닫힌 스트림을 재사용하려는 경우,IllegalStateException내동댕이쳐질 것이다.

...

  1. 현재 스레드의 상위 10개 스택 프레임을 스냅숏하려면,

    List<StackFrame> stack = StackWalker.getInstance().walk(s ->
     s.limit(10).collect(Collectors.toList()));
    

또한 JUT 신호를 프로세스에 전송하여 실행 중인 Java 프로세스에서 Trad.getAllStackTraces()를 실행하도록 JVM에 신호를 전송할 수도 있다.

Unix/Linux 사용 시:

kill -QUIT process_id여기서 process_id는 Java 프로그램의 프로세스 번호 입니다.

윈도우즈에서는 콘솔 프로세스를 실행하지 않는 한 일반적으로 표시되지 않지만 응용 프로그램에서 Ctrl-Break를 누를 수 있다.

JDK6는 컴퓨터에서 실행 중인 JDK6 프로세스의 스택을 표시하는 또 다른 옵션인 jstack 명령을 도입했다.

jstack [-l] <pid>

이러한 옵션은 프로덕션 환경에서 실행 중이고 쉽게 수정할 수 없는 애플리케이션에 매우 유용하다.특히 런타임 교착 상태나 성능 문제를 진단하는 데 유용하다.

http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html

캡처 출력이 필요한 경우

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();

마르코에 의한 대답은 만약 당신이 출력하는 것이 행복하다면 단연 최고다.stderr.

이 에 있는 하하면에 .String일반 추적에 따라 새 행을 사용하면 다음과 같은 작업을 수행할 수 있다.

Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );

HPROP 자바 프로파일러

암호로 이럴 필요조차 없다.Java HPROP을 프로세스에 첨부할 수 있으며, 응용프로그램 코드를 손상시키지 않고 언제든지 Control-\를 눌러 힙 덤프, 실행 중인 스레드 등을 출력할 수 있다.이것은 좀 구식이고, 자바 6은 GUI jconsole과 함께 제공되지만, 나는 여전히 HPROP이 매우 유용하다고 생각한다.

참조URL: https://stackoverflow.com/questions/944991/is-there-a-way-to-dump-a-stack-trace-without-throwing-an-exception-in-java

반응형