.NET에서와 같이 Java에서 현재 스택 추적 을 얻는 방법은 무엇 Environment.StackTrace
입니까?
발견 Thread.dumpStack()
했지만 원하는 것은 아닙니다. 스택 추적을 다시 인쇄하고 싶지는 않습니다.
.NET에서와 같이 Java에서 현재 스택 추적 을 얻는 방법은 무엇 Environment.StackTrace
입니까?
발견 Thread.dumpStack()
했지만 원하는 것은 아닙니다. 스택 추적을 다시 인쇄하고 싶지는 않습니다.
답변:
사용할 수 있습니다 Thread.currentThread().getStackTrace()
.
StackTraceElement
프로그램의 현재 스택 추적을 나타내는의 배열을 반환합니다 .
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
stackoverflow.com/a/10620951/11236
new Throwable().getStackTrace()
를 확인 this != Thread.currentThread()
하고 무시 할 필요가 없기 때문에 훨씬 빠릅니다.Exception extends Throwable
Thread.currentThread().getStackTrace();
스택의 첫 번째 요소가 무엇인지 신경 쓰지 않으면 괜찮습니다.
new Throwable().getStackTrace();
중요한 경우 현재 방법에 대해 정의 된 위치를 갖습니다.
(new Throwable()).getStackTrace()
실행 속도도 빠릅니다 ( bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 참조 )
(new Exception()).getStackTrace()
요청 된 스택 추적이 현재 스레드에있을 때 수행하는 것처럼 보입니다 (항상Thread.currentThread().getStackTrace();
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
System.out.println(ste);
}
new Exception().printStackTrace(System.out)
있습니다. 기억할 수 있습니다. for 루프는 아마도 오버 헤드가 적을 수도 있지만 어쨌든 이것을 디버깅으로 사용해야합니다 ...
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
Thread.currentThread().getStackTrace();
JDK1.5부터 사용 가능합니다.
이전 버전의 경우, 리디렉션 할 수 있습니다 exception.printStackTrace()
A를 StringWriter()
:
StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();
new Throwable().getStackTrace()
JDK1.4 이후부터 가능합니다…
이를 위해 Apache 공통점을 사용할 수 있습니다.
String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
가져 오기 사용 - 내가 처음에 간과하는 lang3
대신 lang
, 대체합니다 getFullStackTrace
와 getStackTrace
.
ExceptionUtils.getStackTrace(new Throwable())
스택 추적을 얻기 위해 표현식을 사용하는 것이 좋습니다 .
안드로이드에서 훨씬 쉬운 방법은 이것을 사용하는 것입니다.
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
모든 스레드의 스택 추적을 얻으려면 jstack 유틸리티 인 JConsole을 사용하거나 kill -quit 신호를 보내십시오 (Posix 운영 체제에서).
그러나 프로그래밍 방식 으로이 작업을 수행하려면 ThreadMXBean을 사용해보십시오.
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);
for (ThreadInfo info : infos) {
StackTraceElement[] elems = info.getStackTrace();
// Print out elements, etc.
}
언급했듯이 현재 스레드의 스택 추적 만 원한다면 훨씬 쉽습니다 Thread.currentThread().getStackTrace()
.
System.err.println(elems[i])
각각 수행 하는 경우). 스 니펫의 두 번째 줄은 bean.
전에 누락 dumpAllThreads
되었지만 대부분의 사람들이 해결할 수 있다고 생각합니다.
다른 솔루션 ( 35 31 자만 해당) :
new Exception().printStackTrace();
new Error().printStackTrace();
허용 된 답변에 대한 의견으로 Tony는 실제로 OP의 질문에 대답하는 가장 좋은 답변 인 것처럼 보였습니다 .
Arrays.toString(Thread.currentThread().getStackTrace()).replace( ',', '\n' );
... 영업 이익은 않았다 NOT 을 얻는 방법을 물어 String
에서 스택 추적에서 Exception
. 그리고 나는 Apache Commons의 열렬한 팬이지만 위와 같은 간단한 것이있을 때 외부 라이브러리를 사용해야하는 논리적 인 이유가 없습니다.
Thread.getAllStackTraces()
어느 것을 사용하는지 확인하십시오 Map<Thread, StackTraceElement[]>
. 핫스팟은 하나를 보호해야 할 때마다 모든 스레드를 보호합니다. Zing은 다른 스레드를 방해하지 않고 개별 스레드를 안전한 지점으로 가져올 수 있습니다. 스택 트레이스를 얻으려면 안전 점이 필요합니다. Thread.getAllStackTraces()
모든 스택 추적을 가져오고 모든 스레드를 한 번만 중지합니다. 물론, 실제로 어떤지도에 관심이 있는지 찾아야합니다.
제안합니다
Thread.dumpStack()
더 쉬운 방법이며 실제로 문제가 발생하지 않을 때 실제로 예외를 구성하지 않거나 던질 수 없다는 이점이 있으며, 훨씬 더 중요합니다.
new Exception("Stack trace").printStackTrace();
실제로 Throwable
스택 트레이스 얻기 :
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
스택 추적 인쇄 (JAVA 8+) :
Arrays.asList(ste).forEach(System.out::println);
스택 트레이 지 인쇄 (JAVA 7) :
StringBuilder sb = new StringBuilder();
for (StackTraceElement st : ste) {
sb.append(st.toString() + System.lineSeparator());
}
System.out.println(sb);
Java 9에는 새로운 방법이 있습니다.
public static void showTrace() {
List<StackFrame> frames =
StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
.walk( stream -> stream.collect( Collectors.toList() ) );
for ( StackFrame stackFrame : frames )
System.out.println( stackFrame );
}
스택 추적으로 문자열을 반환하는 유틸리티 메서드가 있습니다.
static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
그리고 그냥 로그처럼 ...
...
catch (FileNotFoundException e) {
logger.config(getStackTrace(e));
}
java.util.logging.Logger#log(Level, String, Throwable)
이미이 작업을 수행합니다. 이것은 Java 표준 라이브러리에 이미 존재하는 것들을 불필요하게 다시 작성하고 있으며 새로운 개발자를 잘못된 방향으로 가리키고 있습니다. 이를 통해 Stacktrace가 특정 방식으로 포맷되도록 강요했습니다. logging
API를 통해 사용자가 지정한대로 로그 문의 포맷을 동적으로 변경할 수 있습니다. 내 지식으로 log4j
는 비슷한 행동이 있습니다. 내가 설명 한 것과 같은 것을 잃어 버릴 수 있기 때문에 바퀴를 재발 명하지 마십시오.
Throwable
받는 오프 Handler
받는 사람을 통해들 Formatter
보다 내가 여기에 나열된 것보다 Java7했다 2012 년에들 그리고 이러한 기능은 훨씬 더 Java7가 주변에있다보다 거슬러 올라간다;. 따라서 J2SE 5.0의 javadoc)
try {
}
catch(Exception e) {
StackTraceElement[] traceElements = e.getStackTrace();
//...
}
또는
Thread.currentThread().getStackTrace()
아마도 당신은 이것을 시도 할 수 있습니다 :
catch(Exception e)
{
StringWriter writer = new StringWriter();
PrintWriter pw = new PrintWriter(writer);
e.printStackTrace(pw);
String errorDetail = writer.toString();
}
문자열 'errorDetail'에는 스택 추적이 포함됩니다.
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
배열의 마지막 요소는 스택의 맨 아래를 나타내며 시퀀스에서 가장 최근의 메소드 호출입니다.
A StackTraceElement has getClassName(), getFileName(), getLineNumber() and getMethodName().
StackTraceElement를 반복하고 원하는 결과를 얻습니다.
for (StackTraceElement ste : stackTraceElements )
{
//do your stuff here...
}
위의 답변을 사용하고 형식을 추가했습니다.
public final class DebugUtil {
private static final String SEPARATOR = "\n";
private DebugUtil() {
}
public static String formatStackTrace(StackTraceElement[] stackTrace) {
StringBuilder buffer = new StringBuilder();
for (StackTraceElement element : stackTrace) {
buffer.append(element).append(SEPARATOR);
}
return buffer.toString();
}
public static String formatCurrentStacktrace() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
return formatStackTrace(stackTrace);
}
}
프로세스의 현재 호출 스택을 확인하려는 경우 jstack 유틸리티를 사용할 수 있습니다.
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
이것은 오래된 게시물이지만 내 해결책은 다음과 같습니다.
Thread.currentThread().dumpStack();
더 많은 정보와 더 많은 방법 : http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
Thread.dumpStack()
정적 메소드 때문에 직접 호출해야합니다 .