thedivergentai/godot-debugging-profiling
Expert debugging and profiling for leaks, GPU/Visual Profiler, headless CI QA, orphan nodes, thread-safe logs, and custom Debugger monitors — not print/breakpoint tutorials. Trigger on OBJECT_ORPHAN_NODE_COUNT, ObjectDB growth, Visual Profiler GPU spikes, flaky headless exits, or remote device consoles. Keywords: orphan nodes, Performance.get_monitor, Visual Profiler, Time.get_ticks_usec, EditorDebuggerPlugin, headless QA, push_error, backtrace.
npx skills add https://github.com/thedivergentai/GD-Agentic-Skills --skill godot-debugging-profiling
Symptom → monitor/API → script routing for leaks, GPU, and CI — Official Docs cover print/breakpoint basics.
print() without descriptive context — print(value) is useless. Use print("Player health:", health) with labels.if OS.is_debug_build() or use custom DEBUG const. Prints slow down release.push_warning() messages — Warnings indicate potential bugs (null refs, deprecated APIs). Fix them before they become errors.assert() for runtime validation in release — Asserts are disabled in release builds. Use if not condition: push_error() for runtime checks.--release flag.Engine.capture_script_backtraces(true) is cheap — Capturing locals allocates significant memory and can prevent objects from being deallocated, causing artificial leaks [19].push_error() or print() inside a custom Logger._log_message override — This causes infinite recursion and crashes as the logger intercepts its own output [20].OS.get_ticks_msec() for microbenchmarking — Milliseconds lack precision for logic timing; ALWAYS use Time.get_ticks_usec() for microsecond precision [22].OBJECT_ORPHAN_NODE_COUNT works in production — This monitor is strictly debug-only; it safely returns 0 in release builds, potentially hiding leaks [23].print_stack() or print_debug() in release builds — These are often stripped or useless outside the debugger. Use structured logging for production [25].EditorDebuggerPlugin in _exit_tree() — Failing to clean up leaves "ghost" connections in the engine's debugging loop [27].> MANDATORY for the matching row. Do NOT Load every debug script for one bug.
| Symptom | Monitor / API | Script |
|---------|---------------|--------|
| Nodes removed but RAM climbs | OBJECT_ORPHAN_NODE_COUNT (debug) | MANDATORY orphan_node_detector.gd |
| ObjectDB / instance growth | custom monitors + dump | memory_usage_threshold_alert.gd, scene_tree_dump.gd |
| GPU / overdraw mystery | Visual Profiler (briefly) | Pair with perf skill; use performance_plotter.gd for trends — do not leave Visual Profiler on |
| Flaky headless / CI exit | exit codes + asserts | MANDATORY automated_qa_suite.gd, push_error_safe_exit.gd |
| Microbenchmark lies | Time.get_ticks_usec | MANDATORY high_precision_benchmarker.gd |
| Crash needs locals | backtraces (debug only) | advanced_backtrace_recorder.gd, stack_trace_logger.gd |
| Engine errors to backend | Logger intercept | engine_error_interceptor.gd — never print inside Logger |
| Custom Debugger metrics | Monitors tab | custom_editor_monitor.gd, debugger_tab_plugin.gd |
| Mobile/console no stdout | in-game console | remote_debug_console.gd, debug_overlay.gd (debug builds only) |
| Thread races / log corruption | mutex logger / asserts | thread_safe_logger.gd, thread_safety_assert.gd |
| Invisible logic (AI/physics) | debug draw / gizmos | custom_debug_draw.gd, property_watcher_gizmo.gd |
| Conditional halt | hardcoded break | break_on_condition.gd |
| Editor vs runtime paths | Engine.is_editor_hint | engine_editor_hint_logic.gd |
_exit_tree()--release with V-Sync off; never trust Debug-build timings.print_stack() in anything that might ship.godot-performance-optimization after the symptom tree identifies the bottleneck class.> MANDATORY for print/breakpoint workflow depth, profiler interpretation, and expert CI/GPU/thread patterns: debug-workflows.md. Do NOT Load when the symptom → script table above already routes you.
> Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain — do not preload the whole lattice.
print / push_warning / push_error surface in the editor and why noisy release logs hide real faults.Performance.add_custom_monitor so game-specific metrics appear next to engine monitors.Logger registration, file sinks, and recursion hazards when logging from inside log handlers.--script / export flags for automated QA and CI exit-code runners.OBJECT_ORPHAN_NODE_COUNT, memory, render) used by overlays and leak detectors.assert/push_error, and Time APIs underpin benchmarks, breakpoints, and stack helpers.quit exit codes.Take thedivergentai/godot-debugging-profiling from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.