자바에서 예외를 던지지 않고 스택 추적을 버리는 방법이 있는가?
내 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
내동댕이쳐질 것이다....
현재 스레드의 상위 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' );
암호로 이럴 필요조차 없다.Java HPROP을 프로세스에 첨부할 수 있으며, 응용프로그램 코드를 손상시키지 않고 언제든지 Control-\를 눌러 힙 덤프, 실행 중인 스레드 등을 출력할 수 있다.이것은 좀 구식이고, 자바 6은 GUI jconsole과 함께 제공되지만, 나는 여전히 HPROP이 매우 유용하다고 생각한다.
'IT이야기' 카테고리의 다른 글
중복 키를 해시맵에 넣으면 어떻게 되는가? (0) | 2022.05.20 |
---|---|
제출의 필드를 비우십시오(ve-validated vue). (0) | 2022.05.20 |
Java에서 반복적으로 파일 나열 (0) | 2022.05.20 |
Java에서 마지막 N 요소를 포함하는 크기 제한 대기열 (0) | 2022.05.19 |
Vue 플러그인 내에 Vuex 스토어를 캡슐화할 수 있는 방법(설치 기능)이 있는가? (0) | 2022.05.19 |