Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to debug a multi-threaded app in IntelliJ?

I'm having a strange issue with multiple threads and breakpoints in IntelliJ IDEA 14.0.2. Code after the breakpoint is executed before it stops on it.

import java.util.concurrent.atomic.AtomicInteger;   public class Main {      private static final int NUM_CLIENTS = 1000;      static class TestRunnable implements Runnable {         AtomicInteger lock;         @Override         public void run() {             synchronized (this.lock) {                 int curCounter = this.lock.addAndGet(1);                 System.out.println("Thread: " + Thread.currentThread().getName() + "; Count: " + curCounter);                 if (curCounter >= NUM_CLIENTS) {                     lock.notifyAll();                 }             }         }     }      public static void main(final String args[]) {         final AtomicInteger lock = new AtomicInteger(0);         for (int i = 0; i < NUM_CLIENTS; i++) {             TestRunnable tr1 = new TestRunnable();             tr1.lock = lock;             new Thread(tr1).start();         }         synchronized (lock) {             try {                 lock.wait();             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println("Main woken up");         }     } } 

When I put a breakpoint (Suspend All) at line 12, synchronized (this.lock), System.out.println still executes (sometimes several times). Here's a screenshot:

enter image description here

As far as I know, all threads should stop at the breakpoint.

like image 636
m0skit0 Avatar asked Jan 05 '15 17:01

m0skit0


People also ask

How do I debug an application in IntelliJ?

Run the program in debug modeClick the Run icon in the gutter, then select Modify Run Configuration. Enter arguments in the Program arguments field. Click the Run button near the main method. From the menu, select Debug.

How do I view threads in IntelliJ debugger?

Press the little gearwheel and you will see all active threads. And on each breakpoint you can set the Suspend Policy. You can either make the Thread alternative the default for all breakpoints or you can set them individually on each breakpoint.

Why it is difficult to debug multi threaded programs?

Parallel processing using many threads can greatly improve program performance, but it may also make debugging more difficult because you're tracking many threads. Multithreading can introduce new types of potential bugs.


1 Answers

The documentation reads confusingly, but this is the relevant block. What it distills down to is setting the property to suspend on threads, and not the entire application instead. This will cause you to hit the break point on each individual thread instead of an arbitrary, indeterminate thread.

Suspend box checked with Thread radio button selected.

  • Suspend Policy: All
    • When a breakpoint is hit, all threads are suspended.
  • Suspend Policy: Thread
    • When the breakpoint is hit, the thread where the breakpoint is hit is suspended.
like image 153
Makoto Avatar answered Oct 06 '22 03:10

Makoto