How to get stack trace of a thread

15,225

Solution 1

See here for how to generate stack traces, including how to do this programatically. From the console, Ctrl+Break will dump the stack traces to stdout. See also this SO question for more details.

Solution 2

You could log the stack traces of all thread from time to time (or before killing the process) from within your application. To do that use:

Map<Thread, StackTraceElement[]> m = Thread.getAllStackTraces();
for(Map.Entry<Thread,  StackTraceElement[]> e : m.entrySet()) {
    log(e.getKey().toString());
    for (StackTraceElement s : e.getValue()) {
        log("  " + s);
    }
}

When running nightly automated tests, sometimes some one of the test cases gets into a deadlock. I added a "TimeBomb" daemon thread that waits 30 minutes, and if then logs all stack traces as above.

Solution 3

Before entering the deadlock region, set a field like,

thread = Thread.currentThread();

In your monitoring thread you can perform thread.getStackTrace(); to get the stack trace of that thread at any time.

Solution 4

You use JStack. Here is a nice blog entry that details how to get stack traces.

Share:
15,225
Palo
Author by

Palo

Updated on June 04, 2022

Comments

  • Palo
    Palo almost 2 years

    I have a multithreaded application. Several messages are coming to the application and are processed in separated threads. For this I am using classes ThreadPoolExecutor and FutureTask from package java.util.concurrent.

    Occasionally I have some deadlocks in the application. When a deadlock occurs I want to interrupt the blocking thread and I want to log the stack trace of this thread so that I can later resolve the deadlock.

    Is there any way how can we find the stack trace of a thread outside of that thread in Java?

  • Bombe
    Bombe over 13 years
    In UNIX environments, sending a “QUIT” (kill -QUIT <pid>) signal to the java process will also output the stack trace to the standard output.