agentleFS
wado-langwado-lang/wado/.claude/skills/debugger/SKILL.md

debugger

Skill120 starsChanged 14 days agoMITView on GitHub

Use rust-gdb to inspect variables and step through code without modifying it. Prefer it over print debugging for any investigation into what the compiler is actually doing (lldb is unavailable on Claude Code Web).

32 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use security-engineer, planner and 5 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • belokonmSkill

    security-engineer

    Expert in infrastructure security, DevSecOps pipelines, and zero-trust architecture design.

    Also in 4 projects that use this

  • am-willSkill

    planner

    Create comprehensive, phased implementation plans with sprints and atomic tasks. Use when user says: "make a plan", "create a plan", "plan this out", "plan the implementation", "help me plan", "design a plan", "draft a plan", "write a plan", "outline the steps", "break this down into tasks", "what's the plan for", or any similar planning request. Also triggers on explicit "/planner" or "/plan" commands.

    Also in 3 projects that use this

  • VercelSkill

    technical-writer

    Write, review, and edit developer documentation for SDKs, libraries, and frameworks, including sites such as ai-sdk.dev and chat-sdk.dev. Use for getting-started guides, tutorials, API references, conceptual explanations, integration guides, migration guides, troubleshooting, and code examples.

    Also in 4 projects that use this

  • leonardomsoSkill

    test-writer

    Generate comprehensive Vitest tests for code examples in JavaScript concept documentation pages, following project conventions and referencing source lines

    Also in 3 projects that use this

  • GitHubSkill

    documentation-writer

    Diátaxis Documentation Expert. An expert technical writer specializing in creating high-quality software documentation, guided by the principles and structure of the Diátaxis technical documentation authoring framework.

    Also in 3 projects that use this

  • AnthropicSkill

    system-design

    Design systems, services, and architectures. Trigger with "design a system for", "how should we architect", "system design for", "what's the right architecture for", or when the user needs help with API design, data modeling, or service boundaries.

    Also in 3 projects that use this

The file

Files
SKILL.md

Debugger

Debug wado compiler with rust-gdb.

Build first

dev sets debug = "line-tables-only" and raises the workspace crates to opt-level = 1, so info locals / info args come back empty in every compiler frame. Build the debugger profile instead — full DWARF, no optimization on the crates being stepped through, its own target/debugger/ dir so the dev cache stays warm:

cargo build --profile debugger --bin wado

Usage

cat > scratchpad/gdb_commands.txt << 'EOF'
file ./target/debugger/wado
set pagination off
break emit_function
run compile -o scratchpad/out.wasm example/hello.wado
info locals
print func.name
bt 5
quit
EOF
rust-gdb --batch -x scratchpad/gdb_commands.txt

Break on a function name, not a file:line: a line number drifts with the next edit above it. gdb matches a bare name in every module, so qualify one that more than one module defines.

Ask one question per run, not one per build

A breakpoint that fires thousands of times and gets greped answers one question and costs a rebuild for the next. Make the breakpoint itself select:

break wado_compiler::wir_build::calls::local_get if $_streq(name->data_ptr, "…")
break substitute_types_in_expr
commands
silent
bt 6
continue
end

bt at a conditional hit gives the origin outright — the thing print debugging cannot produce without guessing where to put the next eprintln!.

Printing Rust values

printf "%s", s fails on a Rust String (it is a struct, not a char*) and aborts the whole command file with Value can't be converted to integer. Use print, which rust-gdb's pretty printers handle:

print fq              # "core:prelude/string.wado/String^Eq::eq"
print *expr
print info.struct_name

$_streq(s->data_ptr, "lit") is the way to compare one inside a breakpoint condition.

Batch runs

rust-gdb --batch exits on the first command error, so a typo in a commands block silently truncates the rest of the run — check the tail of the output for Error in sourced command file before trusting an empty result. Redirect to a file and grep it; the DWO-loading noise otherwise buries the hits:

rust-gdb --batch -x scratchpad/gdb_commands.txt > scratchpad/gdb.log 2>&1
grep -a '^\$[0-9]* = ' scratchpad/gdb.log | sort -u

When a guard beats a breakpoint

The debugger answers "what is this value here". When the question is "where else does this invariant break", an assertion at the point the invariant must hold enumerates every violation in one run and keeps doing so afterwards — the same reason a newtype that makes an illegal name unconstructible beats chasing one miscompile at a time. Reach for debug_assert! / assert! in the merge or registration step first, and for gdb once it fires and you need the values behind it.

Common commands

CommandDescription
info localsShow local variables
info argsShow function arguments
print *exprDereference and print pointer
bt 5Backtrace (top 5 frames)
continueResume execution

Notes

lldb does not work in Claude Code Web due to ptrace restrictions:

error: Cannot launch '...': personality get failed: Invalid argument

Use rust-gdb instead.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.