tree: c9b42cdc67aa8f3eb0b01ad85d877c840c6637c4
  1. src/
  2. tests/
  3. Cargo.lock
  4. Cargo.toml
  5. README.md
  6. rust-toolchain.toml
src/tools/miri/priroda/README.md

Priroda

Priroda is a step-through debugger for Rust programs running under Miri.

Current focus:

  • simple CLI prototype
  • single-threaded stepping with Miri's interpreter
  • source-location output after stepping
  • source-location breakpoint prototype
  • source-local listing prototype
  • runtime local state and value rendering
  • range-limited byte output for indirect locals

Setup

From miri/, install the pinned toolchain and the local cargo-miri command:

./miri toolchain
./miri install

Then build the Miri sysroot and export it for Priroda:

cargo +miri miri setup
export MIRI_SYSROOT="$(cargo +miri miri setup --print-sysroot)"

Run

Priroda currently reads MIRI_SYSROOT directly. After setup, run Priroda from miri/priroda/:

cargo run -- ../tests/pass/empty_main.rs

DAP Prototype

Priroda's --dap mode speaks a bounded Debug Adapter Protocol prototype over stdio. It currently supports the startup handshake, stops at the first user-relevant source location after configurationDone, reports one current stack frame, exposes one flat Locals scope, and maps list_locals() into DAP variables with no child expansion.

The next and stepIn requests are wired to Priroda's existing source-line step so VS Code can drive one visible step. They are not true DAP step-over or step-in semantics yet.

Test

Priroda's CLI tests also need MIRI_SYSROOT. Run them from miri/priroda/:

cargo test

If the CLI tests fail due to mismatched output, you can update the expected output files by running the tests with the --bless flag:

cargo test -- --bless

or

RUSTC_BLESS=1 cargo test

Commands

CommandDescription
Enter, si, stepiExecute one Miri interpreter step.
s, stepStep until the displayed source location changes.
c, continueContinue until the program finishes or reaches a breakpoint.
b <path>:<line>, break <path>:<line>Add a source-location breakpoint.
l, localsList source-level locals in the current frame by name.
p <local>, print <local>Print one MIR local by numeric id.
f <alloc> <offset>, follow <alloc> <offset>Render allocation bytes from an offset, including the full allocation size.
q, quitExit Priroda.

Value Output

Immediate values use Miri's Immediate display representation. Indirect locals are rendered as the bytes belonging to the current value range, not as the entire backing allocation:

[01 02 03]
[?? ?? ??]

?? means the byte is uninitialized. A value whose runtime size cannot be determined is reported as <unsupported-unsized>.

Pointer/provenance spans are planned as part of the raw byte output, using a compact dump-like marker such as:

[<ptr alloc5+0> 2a 00 00 00]

Automatic pointer following is future work and should be explicit, not part of ordinary value printing. Typed field rendering and dereference/projection-aware printing are also future work.

EOF also exits Priroda cleanly.

Example:

(priroda) break tests/pass/empty_main.rs:3
(priroda) continue