PIMP MY IDEBack to dispatches
October 10, 2026 / debugging / reproducible systems

A debugger cannot replay what you forgot.

Rewind VM turns a Nix build into a deterministic run you can scrub, fork, and inspect. The bigger lesson is simpler. Debugging starts with custody of the whole execution.

Keep the executable, inputs, symbols, source map, schedule evidence, and run record attached. A stack trace without that closure is a clue. It is not a replay.

The build graph can carry the debugger

Farid Zakaria built Rewind VM to replay Linux work under different thread schedules. His latest field note makes a useful architectural point. A debugger needs the exact program, its inputs, debug symbols, source files, and a way to move that set to another machine. A Nix derivation already describes much of that set.[1]

In the article's bank example, two threads can overwrite each other's deposits. Zakaria reports that the native program lost money in 396 of 1,000 runs on his 16-core laptop. Rewind's perturbed schedules narrowed the deciding change to step 3,237 in 11 seconds. Those are author measurements for one fixture, not general debugger benchmarks.

The useful artifact is not the screenshot of the failure. It is the failure plus everything needed to ask it another question.

Symbols need an address, not a wish

Source views work only when a debugger can connect machine code to the right debug information and source. The elfutils debuginfod service uses build IDs to distribute ELF files, DWARF data, and source over HTTP. GDB has supported it since version 10.1.[3]

Rewind's design document describes a local debuginfod service for Nix separateDebugInfo outputs. Its release files also wire a debug server and kernel symbols into the package. We inspected those implementation paths at revision 2bc7aaeb29ff9fce661656963cf42075c4cd54f8.[2]

Determinism creates a place to stand

Rewind records a run, replays it, and can fork from a chosen step under another schedule. That makes comparisons sharper because the passing and failing runs can share a prefix. The project still has a boundary. It targets x86-64 Linux with readable KVM, and AMD hosts need a documented branch-counter setup.[2]

Do not translate that into "Nix makes every build deterministic" or "a replay proves the root cause." A build recipe can preserve declared inputs while hidden host state, hardware behavior, network access, missing symbols, or a weak test still leave gaps. Record what was captured and what stayed outside the run.

A handoff should survive the original machine

Rewind bookmarks travel with its exported run. That is the right shape for a debugging handoff. Save the run identity, deciding step, observed divergence, source and symbol route, fixture, environment, and the exact command that opens the evidence. Keep interpretation separate from observation.

The forklift below writes that structure. It does not install Rewind, execute a VM, inspect a binary, or prove that a failure replays. Its completed state means four evidence sections were selected for a real handoff.

Interactive teaching fixture

Debug closure forklift

Traditional purpose: a setup note and debug checklist. This version joins an ordered investigation stage, four evidence locks, a physical lift readout, and one copyable handoff packet.

Capture inputsMap sourceFind divergenceHandoff run

Set the lift

Choose the current investigation stage. Select only the evidence sections the real packet will require.

Capture inputs
Capture the executionPin the program, declared inputs, fixture, environment, and original result before changing the schedule.
Debug closure sections
STRUCTURE OPEN0 of 4 sections selected

Closure readout

No evidence section is selected. The lift is parked at capture.

Inputs
open
Symbols
open
Schedule
open
Run
open
HANDOFF STRUCTURE OPENSelect the sections the handoff must contain. Real identifiers, files, commands, and replay results remain required.
Sources read / October 11, 2026 UTC

Source log

Open the evidence boundary
  1. Farid Zakaria, "Nix wrote half of my debugger", published October 7 and read October 11, 2026. This supports the bank fixture, author-reported run counts and timing, Nix input and symbol integration, schedule forks, comparisons, and portable bookmarks.
  2. Rewind VM repository at revision 2bc7aaeb29ff9fce661656963cf42075c4cd54f8, inspected October 11, 2026. GitHub's API reported the MIT license and main as the default branch. We read the README, design document, tutorial, Nix release files, kernel packaging, and selected checks. We did not run the KVM workload or install the package.
  3. elfutils debuginfod documentation, read October 11, 2026. This supports the build-ID-based ELF, DWARF, and source retrieval description, the client/server model, and the listed GDB support version.
  4. Hacker News discussion for the Rewind article, item 50017247, verified through the Hacker News API and read October 11, 2026. It was a discovery route and does not support the engineering claims above.
  5. Chrome for Developers, "New in DevTools - October 2026", read October 11, 2026. It was reviewed during this editorial pass for adjacent debugger and source-inspection work. It does not verify Rewind.

Evidence boundary: Pimp My IDE inspected the named article, repository revision, implementation paths, documentation, and discussion. We did not install Rewind, boot its VM, reproduce the bank race, audit all code, or independently verify the author's measurements. The interactive fixture only drafts a packet structure.