Quick answer: Godot debugger breakpoints in Thread-spawned code never fire? The script debugger hooks the main thread; secondary threads run unobserved.

A background asset loader runs on a thread. Breakpoints inside its callback never trigger; the only diagnostic is printing.

Single-Thread Debugger

GDScript’s debugger attaches to the main interpreter. Thread.start spawns a new interpreter context that the debugger doesn’t see — breakpoints are inert.

Use Prints / Log

print("[thread] step", OS.get_ticks_msec())

Log liberally in thread code during debug. Output appears in the Output panel even from background threads.

Marshal to Main

For complex debugging, marshal work back to main via call_deferred. The deferred call runs on the main thread — breakpoints work there.

WorkerThreadPool

WorkerThreadPool.add_task runs on engine’s thread pool. Same debugger limitation. Avoid until necessary; main-thread async is easier to debug.

Verifying

Logging gives you the visibility you need. Critical paths marshalled to main thread are debuggable.

“Debugger watches main thread. For background work, log or marshal to main.”

Treat threads as performance optimizations, not architecture — you keep debuggability without losing the speedup.