Case study

SignalLab

An iOS app for practicing real debugging with Xcode and Instruments, one reproducible bug at a time

Active · open source
SignalLab logo: a glowing blue and orange flask with a pulse waveform

A hands-on debugging lab for iOS developers.
Practice with Xcode and Instruments, investigate the evidence, and understand what changed.

The problem

Most debugging advice is about tools in the abstract. Here’s what a breakpoint is, here’s what the Memory Graph shows you. It reads fine, and then the first time something actually breaks you’re staring at a stack trace trying to remember which tool to reach for.

The solution

SignalLab is an iOS app for practicing debugging and performance investigation. Each lab provides a focused scenario and a repeatable workflow with Xcode or Instruments. Some reproduce a failure and compare broken and fixed implementations; others teach a diagnostic technique, such as following an ownership path in Memory Graph or comparing debugger stop behavior.

I built it for junior and intermediate iOS developers who want more practice with the debugger and Instruments, and for mentors or interview coaches who want concrete exercises instead of slides.

SignalLab's Crash Lab on iPhone: a dark interface with a Broken and Fixed toggle, Run scenario and Reset buttons, and cards listing the learning goals and reproduction steps. SignalLab's Exception Breakpoint Lab on iPhone: a Compare the two stops section with a Pass 1 default stop card and a Pass 2 exception breakpoint card, a Broken mode only note, and the learning goals.
Crash Lab and Exception Breakpoint Lab. The second one is built around comparing two passes at the same failure.

How a lab works

  • One lesson per lab. You should always know what the point is.
  • A symptom you can see. The app crashes, the UI freezes, a total is wrong, an object won’t go away, a search gets sluggish.
  • A fast trigger. If it takes ten minutes to reproduce, nobody learns anything.
  • A suggested first tool and some hints. Enough to point you somewhere without handing over the answer.
  • A comparison that fits the lesson. Where supported, compare Broken and Fixed modes. Diagnostic labs instead guide you through inspecting evidence or comparing investigation techniques.

The first six

  1. Crash Lab. A malformed local JSON import crashes the app. Find the first frame that’s yours and the bad assumption behind it.
  2. Exception Breakpoint Lab. The same kind of failure, but now you compare Xcode’s default stop with what an Exception Breakpoint gives you.
  3. Breakpoint Lab. An order total is wrong and nothing crashes. A line breakpoint on the discount calculation shows it applying 5% where 20% was expected.
  4. Memory Graph Lab. Follow one ownership path to see which object is keeping another one alive.
  5. Hang Lab. Heavy JSON work on the main thread freezes the UI. Pause during the freeze and see what’s actually running.
  6. CPU Hotspot Lab. A searchable list slows down because every keystroke repeats expensive work. Find it with Time Profiler.

Past those there’s a dozen more in the catalog: Thread Performance Checker, zombies, Thread Sanitizer, retain cycles, heap growth, deadlocks, scroll hitches, startup signposts, and a few others.

Inside the app

Development version of the SignalLab catalog showing lab descriptions, categories, and difficulty levels Earlier Breakpoint Lab filter exercise with Broken and Fixed controls, a repeatable scenario, and learning goals
Development screenshots: the lab catalog and an earlier Breakpoint Lab filter exercise. The current curriculum described above has since evolved. Select either image to view it at full size.

What it isn’t

SignalLab is deliberately not a tour of every Xcode feature, and it’s not a replacement for Apple’s documentation. I’m keeping it small on purpose: clear, reproducible, and strong on one lesson at a time.

I also wanted it to feel like a developer tool rather than a tutorial. It’s dark, calm, and fairly precise, and color is reserved for things that mean something, like warnings, faults, and memory.

Status

Still being built. The first six labs and the extra diagnostics labs are working in the app, and the code is public on GitHub.