Debugging with Valgrind + Nextest
When you encounter crashes, segfaults, or memory errors in tests, use valgrind for proper debugging.
Quick Usage
# Run a specific test under valgrind
cargo nextest run --profile valgrind -p PACKAGE --test TEST_FILE TEST_NAME
# Example
cargo nextest run --profile valgrind -p facet-format-json --test jit_deserialize test_jit_option_some
How It Works
The project has valgrind pre-configured in .config/nextest.toml:
Wrapper script: Defined as [scripts.wrapper.valgrind]
- Command:
valgrind --leak-check=full --show-leak-kinds=all ...
- Automatically wraps test execution
Profile: [profile.valgrind] applies the wrapper to all tests on Linux
Running: Use --profile valgrind flag with nextest
Benefits
- ā
Automatic setup - no manual valgrind commands needed
- ā
Proper configuration - leak checking, error codes pre-configured
- ā
Integrated - works with nextest filtering and test selection
- ā
Clean output - nextest captures and formats valgrind output
Don't Do This
ā Running valgrind manually: valgrind ./target/debug/deps/test-binary
ā Using raw --no-run + valgrind commands
ā Playing hunt-the-segfault without proper tools
Do This Instead
ā
Use the pre-configured profile: cargo nextest run --profile valgrind <filters>
ā
Let nextest handle the wrapper script integration
ā
Get clean, actionable valgrind output immediately
Debugging Workflow
- Test crashes with SIGSEGV
- Run:
cargo nextest run --profile valgrind -p PACKAGE --test FILE TEST_NAME
- Valgrind shows exact line where invalid read/write occurs
- Fix the bug
- Verify with regular tests
See Also