답변:
Ram의 제안과 같이 시스템의 모든 스레드가 아닌 현재 스레드에 대한 추적을 원한다면 다음을 수행하십시오.
Thread.currentThread (). getStackTrace ()
발신자를 찾으려면 다음을 수행하십시오.
private String getCallingMethodName() {
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
return callingFrame.getMethodName();
}
그리고 호출자가 누구인지 알아야하는 메소드 내에서 해당 메소드를 호출하십시오. 그러나 경고 단어 : 목록 내 호출 프레임의 색인은 JVM에 따라 다를 수 있습니다! 추적이 생성되는 지점에 도달하기 전에 getStackTrace 내에있는 호출 계층 수에 따라 다릅니다. 보다 강력한 솔루션은 추적을 가져 와서 getCallingMethodName에 대한 프레임을 찾은 후 반복하여 진정한 호출자를 찾기위한 것입니다.
다음과 같은 스택 추적을 얻을 수 있습니다.
Throwable t = new Throwable();
t.printStackTrace();
프레임에 액세스하려면 t.getStackTrace ()를 사용하여 스택 프레임의 배열을 얻을 수 있습니다.
핫스팟 컴파일러가 작업 최적화에 바쁘면이 스택 추적 (다른 것과 마찬가지로)에 일부 프레임이 누락 될 수 있습니다.
t.printStackTrace
와 함께 t.printStackTrace(System.out)
.
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Thread.dumpStack ()은 실제로 예외를 발생시킵니다.
new Exception("Stack trace").printStackTrace();
프로세스에 QUIT 신호를 보내 실행중인 Java 프로세스에서 Thread.getAllStackTraces ()를 실행하도록 신호를 JVM에 보낼 수도 있습니다.
유닉스 / 리눅스에서 :
kill -QUIT process_id
여기서 process_id는 Java 프로그램의 프로세스 번호입니다.
Windows에서는 콘솔 프로세스를 실행하지 않으면 일반적으로 표시되지 않지만 응용 프로그램에서 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();
자바 9는 StackWalker
는 스택을 걷기위한 클래스 및 지원 클래스를 .
다음은 Javadoc의 일부 스 니펫입니다.
이
walk
메소드StackFrames
는 현재 스레드 에 대한 순차 스트림을 연 다음 주어진 함수를 적용하여StackFrame
스트림 을 걷습니다 . 스트림은 스택이 생성 된 실행 지점을 나타내는 최상위 최상위 프레임부터 최상위 프레임까지 순서대로 스택 프레임 요소를보고합니다.StackFrame
스트림은 때 도보 메소드가 반환을 닫힙니다. 닫힌 스트림을 재사용하려고하면 처리IllegalStateException
됩니다....
현재 스레드의 상위 10 개 스택 프레임을 스냅 샷하려면
List<StackFrame> stack = StackWalker.getInstance().walk(s -> s.limit(10).collect(Collectors.toList()));
코드 에서이 작업을 수행 할 필요조차 없습니다. Java HPROF를 프로세스에 연결하고 언제든지 Control- \를 눌러 힙 덤프, 실행중인 스레드 등을 출력 할 수 있습니다. . . 응용 프로그램 코드를 정리하지 않고. 이것은 약간 구식이지만 Java 6에는 GUI jconsole이 제공되지만 여전히 HPROF가 매우 유용하다는 것을 알았습니다.
Rob Di Marco 의 답변 은 (으)로 출력하기에 가장 좋습니다 stderr
.
String
일반 추적에 따라 새 줄 을 사용하여를 캡처하려면 다음을 수행하십시오.
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );