Rust Terminal Development Cheatsheet
Quick reference for terminal-based Rust development on Ubuntu.
Cargo Basics
Command
Description
cargo new myproj
Create new binary project
cargo new mylib --lib
Create new library project
cargo build
Build debug
cargo build --release
Build release
cargo run
Build and run
cargo run --release
Build and run release
cargo check
Fast syntax/type check (no codegen)
cargo test
Run tests
cargo test -- --nocapture
Tests with stdout
cargo test test_name
Run specific test
cargo doc --open
Generate and open docs
cargo clean
Remove target directory
cargo update
Update dependencies
Code Quality
Command
Description
cargo fmt
Format code
cargo fmt --check
Check formatting (CI)
cargo clippy
Run linter
cargo clippy -- -D warnings
Clippy with warnings as errors
cargo clippy --fix
Auto-fix lint issues
cargo fix
Auto-fix compiler warnings
Fast Feedback Loop
Command
Description
cargo watch -c -x check
Auto-check on save
cargo watch -c -x test
Auto-test on save
cargo watch -c -x 'run -- args'
Auto-run on save
bacon
TUI for cargo watch
bacon test
Bacon in test mode
bacon clippy
Bacon in clippy mode
cargo nextest run
Fast parallel test runner
Command
Description
rustup update
Update all toolchains
rustup default stable
Set default toolchain
rustup toolchain list
List installed toolchains
rustup component add rust-src
Add component
rustup component list --installed
List components
cargo +nightly build
Use nightly for one command
rustup run nightly cargo build
Alternative syntax
rustc --print sysroot
Print toolchain location
rustup doc
Open local Rust documentation
Compiler Inspection (Source → Binary Pipeline)
Macro Expansion
cargo expand # Full expansion
cargo expand main # Expand main only
cargo expand path::to::module # Expand specific module
HIR (High-level IR) [Nightly]
cargo +nightly rustc -- -Zunpretty= hir
cargo +nightly rustc -- -Zunpretty= hir,typed # With type annotations
MIR (Mid-level IR) [Nightly]
cargo +nightly rustc -- -Zunpretty= mir # Print MIR
cargo +nightly rustc -- -Zdump-mir= all # Dump all MIR passes
cargo +nightly rustc -- -Zdump-mir= all -Zdump-mir-dir= ./mir_dump
cargo +nightly rustc -- -Zmir-opt-level= 0 # Unoptimized MIR
LLVM IR
# Via rustc
cargo rustc --release -- --emit= llvm-ir -C debuginfo = 0 -C codegen-units= 1
# Output: target/release/deps/*.ll
# Via cargo-show-asm
cargo asm --lib --llvm function_name
Assembly
# Via rustc (Intel syntax)
cargo rustc --release -- --emit= asm -C llvm-args= -x86-asm-syntax= intel
# Output: target/release/deps/*.s
# Via cargo-show-asm (recommended)
cargo asm --lib # List available functions
cargo asm --lib function_name # Show assembly for function
cargo asm --lib --rust func_name # Interleaved with Rust source
cargo asm --lib --mir func_name # MIR via cargo-show-asm
Type and Memory Layout [Nightly]
RUSTFLAGS = "-Zprint-type-sizes" cargo +nightly build 2 >& 1 | grep print-type-size
Binary Size Analysis
cargo bloat --release # Function sizes
cargo bloat --release -n 20 # Top 20 functions
cargo bloat --release --crates # Size by crate
All --emit Options
--emit= asm # Assembly
--emit= llvm-ir # LLVM IR
--emit= llvm-bc # LLVM bitcode
--emit= mir # MIR
--emit= obj # Object file
--emit= link # Final binary (default)
--emit= dep-info # Dependency info
Debugging with rust-gdb
Starting a Session
# Build with debug symbols (default for dev builds)
cargo build
# Start debugger
rust-gdb target/debug/myprogram
rust-gdb --args target/debug/myprogram arg1 arg2
Essential GDB Commands
Command
Description
r / run
Run program
c / continue
Continue after breakpoint
n / next
Step over (next line)
s / step
Step into function
finish
Run until function returns
q / quit
Exit GDB
Breakpoints
Command
Description
b main
Break at main
b main.rs:42
Break at file:line
b module::function
Break at function
b 42
Break at line in current file
info breakpoints
List breakpoints
delete 1
Delete breakpoint #1
disable 1
Disable breakpoint
enable 1
Enable breakpoint
Inspecting State
Command
Description
bt / backtrace
Show call stack
bt full
Backtrace with locals
frame 3
Select stack frame
info locals
Show local variables
info args
Show function arguments
p variable
Print variable
p *pointer
Dereference pointer
p struct.field
Print struct field
ptype variable
Print variable type
Memory Inspection
Command
Description
x/10x $sp
10 hex words from stack
x/s ptr
Print as string
x/i $pc
Disassemble at PC
info registers
Show registers
TUI Mode
Command
Description
layout src
Show source window
layout asm
Show assembly window
layout split
Source + assembly
layout regs
Show registers
tui disable
Exit TUI mode
Ctrl-x a
Toggle TUI mode
Binary Inspection (Post-Compilation)
objdump
objdump -d target/debug/myprogram | less # Disassemble
objdump --demangle -d target/debug/myprogram # With demangled names
objdump -t target/debug/myprogram # Symbol table
objdump -h target/debug/myprogram # Section headers
readelf
readelf -h target/debug/myprogram # ELF header
readelf -S target/debug/myprogram # Section headers
readelf -s target/debug/myprogram # Symbol table
readelf -d target/debug/myprogram # Dynamic section
readelf -l target/debug/myprogram # Program headers
nm (Symbol Table)
nm target/debug/myprogram # All symbols
nm --demangle target/debug/myprogram # Demangled
nm --demangle --size-sort target/debug/myprogram # Sorted by size
nm -C target/debug/myprogram | grep my_func # Find function
size
size target/debug/myprogram # Section sizes summary
size -A target/debug/myprogram # Detailed breakdown
cargo nm --release # nm via cargo
cargo objdump --release -- -d # objdump via cargo
cargo size --release # size via cargo
Standard Library Source
Location
# Print std source path
rustc --print sysroot
# Full path: $(rustc --print sysroot)/lib/rustlib/src/rust/library/
# Directory structure:
# library/
# ├── core/ # #![no_std] basics
# ├── alloc/ # Vec, Box, String
# └── std/ # Full standard library
Searching
# Search with ripgrep
rg "fn drop" --type rust $( rustc --print sysroot) /lib/rustlib/src/rust/library/
# Search specific crate
rg "pattern" $( rustc --print sysroot) /lib/rustlib/src/rust/library/alloc/
Command
Description
cargo audit
Check for vulnerabilities
cargo deny check
Check dependency policies
cargo tarpaulin
Generate test coverage
cargo tarpaulin --out Html
HTML coverage report
Environment Variables
Variable
Description
RUST_BACKTRACE=1
Enable backtraces
RUST_BACKTRACE=full
Full backtraces
RUST_LOG=debug
Log level (with env_logger)
RUSTFLAGS="-Z..."
Pass flags to rustc
CARGO_INCREMENTAL=0
Disable incremental compilation
Vim Quick Reference
Key
Action
\b
:make build
\r
:make run
\t
:make test
\c
:make check
]q
Next quickfix error
[q
Previous quickfix error
:copen
Open quickfix window
:cclose
Close quickfix window
Shell Aliases (from setup script)
# Basic
cb # cargo build
cbr # cargo build --release
cc # cargo check
cr # cargo run
ct # cargo test
ctn # cargo nextest run
# Watch
cw # cargo watch -c -x check
cwt # cargo watch -c -x test
# Inspection
mir # View MIR
hir # View HIR
casm # cargo asm --lib
casmr # cargo asm --lib --rust
# Functions
mir_dump [ dir] # Dump all MIR passes
llvm_ir # Emit and view LLVM IR
emit_asm # Emit and view assembly
std_search "query" # Search std library source
rust_stats # Show environment info
Project Structure Best Practices
myproject/
├── .cargo/
│ └── config.toml # Cargo configuration
├── src/
│ ├── main.rs # Thin entry point
│ ├── lib.rs # Application logic
│ └── prelude.rs # Common re-exports
├── tests/ # Integration tests
├── benches/ # Benchmarks
├── Cargo.toml
├── Cargo.lock
├── rust-toolchain.toml # Pinned toolchain
├── rustfmt.toml # Formatting rules
├── clippy.toml # Linter config
└── README.md
Quick Debugging Workflow
# 1. Check for errors fast
cargo check
# 2. Run tests
cargo nextest run
# 3. If crash/panic, get backtrace
RUST_BACKTRACE = 1 cargo run
# 4. Debug specific issue
cargo build && rust-gdb target/debug/myprogram
( gdb) b main.rs:42
( gdb) r
( gdb) bt
( gdb) info locals
# 5. Inspect generated code
cargo asm --lib --rust problematic_function
Quick Inspection Workflow
# See what macros generate
cargo expand my_module
# See the control flow (MIR)
cargo +nightly rustc -- -Zunpretty= mir 2 >& 1 | less
# See the assembly
cargo asm --lib --rust my_function
# Check type sizes
RUSTFLAGS = "-Zprint-type-sizes" cargo +nightly build 2 >& 1 | grep MyType