All Goroutines Are Asleep — Deadlock

fatal error: all goroutines are asleep - deadlock!

Quick Answer

Every goroutine in your program is blocked waiting for something, so no progress can be made. Check for circular channel dependencies or missing sends.

Why This Happens

Go detects a deadlock when all goroutines are blocked and none can proceed. This typically happens when you read from a channel that nothing will ever write to, lock a mutex that is already held by the same goroutine, or have circular dependencies between goroutines waiting on each other.

The Problem

func main() {
    ch := make(chan int)
    ch <- 42 // blocks forever, no receiver
    fmt.Println(<-ch)
}

The Fix

func main() {
    ch := make(chan int)
    go func() {
        ch <- 42
    }()
    fmt.Println(<-ch)
}

Step-by-Step Fix

  1. 1

    Identify the blocked goroutines

    Read the panic output which shows the stack trace of each blocked goroutine and what it is waiting on.

  2. 2

    Find the circular dependency

    Map out which goroutine is waiting for which channel or lock, and find the cycle.

  3. 3

    Break the cycle

    Use a separate goroutine for the send or receive, use buffered channels, or restructure the synchronization logic.

Bugsly catches this automatically

Bugsly's AI analyzes this error pattern in real-time, explains what went wrong in plain English, and suggests the exact fix — before your users even report it.

Try Bugsly free