CLI Reference

April 27, 2026 ยท View on GitHub

crucible init

crucible init <program_name> [-C <HARNESS_DIR>]

Creates a standalone fuzz workspace in fuzz/<program_name>/ by default, or directly in -C/--harness-dir.

crucible run

crucible run <program_name> <test_name> [OPTIONS]
FlagDescription
--binary-in <PATH>Run a prebuilt harness binary directly
--releaseBuild in release mode (recommended)
--coverageEnable coverage reporting
--timeout <SECS>Stop after N seconds
--cores N / -j NRun N parallel fuzzer workers
--corpus-in <DIR>Load seed corpus from directory
--corpus-out <DIR>Write corpus to directory
--crashes-out <DIR>Custom crash output directory
--replay <FILE>Replay a single input file
--dry-runValidate setup without fuzzing
--seed <N>Random seed for reproducible fuzzing
--symbols <PATH>Path to debug binary with DWARF symbols (for source-level coverage)
--no-tracingDisable SVM register tracing (~2x faster, no coverage)
--stop-on-crashStop fuzzing on first crash
--max-actions <N>Max actions per iteration (default: 8 stateless, 100 stateful)
--statefulStateful fuzzing: single action per iteration with state pool
--max-depth <N>Maximum state depth (action chain length) in stateful mode (default: 15)
--pool-size <N>State pool capacity in stateful mode (default: 256000)
--program-so <PATH>Override the program .so loaded by the harness
--mode <MODE>Remote fuzzing operational mode (see Remote Fuzzing Integration)
--lcov-out <PATH>Custom LCOV coverage output file path

Examples:

# Basic fuzzing
crucible run myproject invariant_test --release --timeout 60

# Run a prebuilt harness directly
crucible run myproject invariant_test --binary-in ./fuzz/myproject/target/release/invariant_test

# Multi-core fuzzing (4 workers)
crucible run myproject invariant_test --release -j 4

# Coverage report
crucible run myproject invariant_test --release --coverage --timeout 120

# Coverage with custom output path
crucible run myproject invariant_test --release --coverage --lcov-out ./output/coverage.lcov

# Custom harness directory
crucible run myproject invariant_test -C ./custom-harness --release

# Dry-run validation
crucible run myproject invariant_test --dry-run

# Replay a crash
crucible run myproject invariant_test --replay ./crashes/invariant_test/abc123

# Reproducible fuzzing
crucible run myproject invariant_test --release --seed 12345

# Stateful mode
crucible run myproject invariant_test --release --stateful

# Stateful with custom depth and multi-core
crucible run myproject invariant_test --release --stateful --max-depth 20 -j 4

Environment variables:

VariableDescription
FUZZ_VERBOSE=1Enable verbose harness output
FUZZ_STATS_CSV=<path>Write per-second stats to CSV file for benchmarking

crucible list

crucible list <program_name>   # List tests for a program
crucible list -C ./fuzz/myproject  # List tests from a harness dir
crucible list                  # List all fuzz harnesses

crucible show

crucible show <program>                                    # List all crashes
crucible show <program> <crash_file>                       # View metadata
crucible show <program> <crash_file> --replay              # Replay crash
crucible show <program> --crashes-dir <DIR>                # List crashes from custom dir
crucible show <program> <crash_file> --crashes-dir <DIR>   # View metadata from custom dir
crucible show . <crash_file>                               # Auto-detect from current dir

Use "." as the program name to auto-detect the fuzz harness when running from within the fuzz directory.

-C/--harness-dir is a global option for locating a custom harness directory on init, run, list, show, tmin, and cmin.

FlagDescription
--replayActually replay the crash by running the binary
--regenRegenerate crash metadata (requires --replay)
--crashes-dir <DIR>Custom crashes directory to read from (supports flat and nested layouts)

crucible cmin

Minimize corpus to smallest set preserving all coverage.

crucible cmin <program> <test> <corpus_dir> --release
crucible cmin <program> <test> <corpus_dir> --corpus-out ./corpus_min --release
crucible cmin <program> <test> --corpus-in <DIR> --release
FlagDescription
--releaseBuild in release mode
--corpus-in <DIR>Input corpus directory (alternative to positional arg)
--corpus-out <DIR>Output directory (default: overwrite input)

crucible tmin

Minimize a crash to the smallest action sequence that still reproduces the violation.

crucible tmin <program> <test> <crash_file> [OPTIONS]
crucible tmin <program> <test> --all [OPTIONS]
FlagDescription
--releaseBuild in release mode
--allMinimize all crashes for this test

Only works with structured/invariant tests (action sequences). Overwrites crash files in place.

# Minimize a single crash
crucible tmin myproject invariant_test crash_abc123 --release

# Minimize all crashes
crucible tmin myproject invariant_test --all --release

Execution Modes

  1. Normal Fuzzing (default) - Continuous input generation and mutation
  2. Dry-Run (--dry-run) - Single iteration to validate harness setup
  3. Input Replay (--replay) - Execute one specific input file
  4. Coverage-Only (--coverage --corpus-in) - Run corpus once for coverage report
  5. Seeded Fuzzing (--corpus-in) - Start from pre-existing corpus
  6. Multi-Core (--cores N) - Parallel fuzzer workers with shared coverage
  7. Stateful (--stateful) - Single action per iteration with state pool
  8. Corpus Minimization (crucible cmin) - Reduce corpus to minimal set preserving coverage
  9. Crash Minimization (crucible tmin) - Reduce crash to minimal reproducing action sequence

Stateful Mode

Stateful mode (--stateful) uses a state-pool approach where each fuzzer iteration executes a single action on a state selected from a pool, rather than replaying an entire action sequence from scratch.

  • States form a tree: each state has a parent and a depth (action chain length)
  • New states are created by applying an action to an existing state
  • The state pool is bounded; states are evicted based on coverage novelty
  • --max-depth <N> controls maximum chain length (default: 100)
  • Works with both single-core and multi-core (-j N)
  • Crashes record the full action chain from root to violation
# Basic stateful fuzzing
crucible run myproject invariant_test --release --stateful

# With custom depth limit
crucible run myproject invariant_test --release --stateful --max-depth 50

# Multi-core stateful
crucible run myproject invariant_test --release --stateful -j 4

Remote Fuzzing Integration

For running Crucible as a managed engine on a remote fuzzing platform, see the dedicated Remote Fuzzing Integration Guide covering:

  • All five operational modes (dry_run, explore, reproduce, coverage, corpus_merge)
  • Directory conventions (./corpus, ./input, ./output)
  • Structured output protocol ([FUZZ_PULSE], [FUZZ_FINDING], [FUZZ_ERROR])
  • Bundle layout and manifest configuration
  • Exit code semantics per mode