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.