tags:

views:

989

answers:

8

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.

+1  A: 

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.

jjnguy
A: 

You cannot just do an exception.ToString() like in .NET and get everything?

Geoffrey Chetwood
yes, exceptions do that in java...but that is not the question here. rather, it is about printing a stack trace w/o there being an organically raised exception.
Stu Thompson
+2  A: 

Just creating an arbitrary exception does the trick for me:

System.out.println("Oops, the bad thing happened");
new IllegalStateException().printStackTrace();
Johan Lübcke
You should just use Thread.getStackTrace().
jjnguy
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.
Outlaw Programmer
Thread.dumpStack() is easier if you just want to send it to stderr (saves having to loop over the stack trace elements yourself).
Dan Dyer
This method is useful in JavaME which doesn't have getStackTrace or dumpStack methods on Thread.
izb
+3  A: 

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

Paul Tomblin
+5  A: 

Thread.dumpStack();

Dan Dyer
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().
Paul Tomblin
Use logging. Printing to stdout/stderr should only be done by OS utilities and "Hello World" apps.
Chris Nava
A: 

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.

Shouldn't one also step or recurse through e.getCause(), and get stack traces for all of those too?
slim
I don't believe there IS a cause when you do it like this.
Chris
+2  A: 

if your using log4j

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

will print the stacktrace to your log.

shsteimer
+1 for not using stdout/stderr
Chris Nava
+1  A: 

Just because I needed it myself:

As inspired by answer http://stackoverflow.com/questions/421280/in-java-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.

sleske