March 4, 2026
A wakeup call for wakeups
Show HN: I made a zero-copy coroutine tracer to find my scheduler's lost wakeups
Dev drops a bug-busting tracer, commenters warn it might sleep through the alarm
TLDR: A dev built coroTracer to catch tasks stuck waiting forever, and it worked. The crowd cheered, then warned the tracer’s own signal might miss alarms without stricter safeguards, sparking a lively debate about speed vs. correctness in debugging tricky concurrency bugs.
The dev behind coroTracer just pulled a classic Show HN move: build a tool to catch the nightmare bug your own app keeps hiding. In simple terms, his program watches “coroutines” (little tasks) across languages without slowing them down, then points out where they got stuck. It helped him find a “lost wakeup,” where tasks were waiting forever on a closed file—like hanging by the phone after the line’s been cut. Cue applause… and then the popcorn. The hottest take? The tracer that hunts lost wakeups might lose wakeups itself. One top commenter dropped a surgical critique, pointing out the tracer’s signal could miss alarms unless it adds a stricter memory “fence” (aka a guardrail so threads don’t get out of sync). The vibe turned from “bravo!” to “buddy, check your own wakeups.”
Memes rolled in: “Tracer needs a tracer,” “Schrödinger’s resume,” and “zero-copy, zero chill.” Some cheered the lock-free, shared-memory speed; others warned about the classic trap of “fast, until it’s wrong.” Still, the crowd loved the clean dashboard, the no-serialization design, and the fact it actually nailed a real bug. It’s tech theater: build a hero tool, then defend it from the same monster it slays.
Key Points
- •coroTracer is an out-of-process, zero-copy tracer for M:N coroutine schedulers designed to detect logical deadlocks, state machine breaks, and coroutine leaks.
- •The SDK writes state changes to lock-free shared memory, while a Go engine reads them to build scheduler topology without network overhead or context switching.
- •Implementation uses mmap with 1024-byte alignment and 64-byte cache line–aligned slots to prevent padding issues and false sharing.
- •A Smart UDS Wakeup sends a 1-byte signal only when the engine is sleeping, minimizing syscalls under high throughput.
- •In testing, coroTracer identified 47 coroutines stuck at co_await AsyncRead(fd) due to a closed socket without resuming dependent coroutines, exposing a lost wakeup bug.