12

What's the easiest way to print a stacktrace from a debugging printout? Often during testing you would like to know the callstack leading up to the situation provoking a debug message.

8 Answers 8

20

If you're using log4j

Exception e = new Exception();
log.error("error here", e);

will print the stacktrace to your log.

Sign up to request clarification or add additional context in comments.

Comments

12

Thread.dumpStack();

2 Comments

The downside is that dumpStack() only goes to stderr, and you can't send it somewhere else like you can with an exception or Thread.getStackTrace().
Use logging. Printing to stdout/stderr should only be done by OS utilities and "Hello World" apps.
6

If you want to save the stack trace into a String you can do this;

String exception = "";
for (StackTraceElement element : e.getStackTrace())
   exception += element.toString() + "\n";

Where e is, obviously, an exception.

Besides, it sounds very weird to autogenerate an own Exception just to find get a stack trace for a debug. Get Eclipse and use it's debug mode, it's really awesome.

3 Comments

Shouldn't one also step or recurse through e.getCause(), and get stack traces for all of those too?
I don't believe there IS a cause when you do it like this.
Use StringBuilder instead of String for multiple concatenations.
4

Just creating an arbitrary exception does the trick for me:

System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();

3 Comments

I believe that this method will cause a warning in some IDEs, such as IntelliJ, because you're creating an exception but not throwing it. I recommend the Thread.getStackTrace() method which has the same logic but it's hidden from the developer.
Thread.dumpStack() is easier if you just want to send it to stderr (saves having to loop over the stack trace elements yourself).
This method is useful in JavaME which doesn't have getStackTrace or dumpStack methods on Thread.
3

As well as what @jjnguy said, if you don't have an exception, you can also call Thread.getStackTrace().

Comments

2

You should be catching the exception in a try-catch block.

e.getStackTrace();

That returns StackTraceElement[] that you can then interpret.

Also:

e.printStackTrace()

will...print the stacktrace.

Comments

2

To simply print the current stack trace to stderr, you can call:

Thread.dumpStack();

which itself just calls:

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

To output to stdout rather than stderr, pass System.out to printStackTrace():

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

Comments

1

Just because I needed it myself:

As inspired by answer How do I find the caller of a method using stacktrace or reflection? , you can retrieve the call stack using

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace()

Then you process and print/log whatever you are interested in. More work than using Thread.dumpStack(), but more flexible.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.