memscope-rs - Rust Memory Tracking & Analysis Library
memscope-rs is a Rust library for tracking memory allocations and generating analysis reports. Think of it as a friendly neighborhood memory detective ๐ต๏ธ that helps you understand what your variables are up to when you're not looking.
It provides simple macros for variable tracking and exports data in JSON and SVG formats. Perfect for those "wait, where did all my memory go?" moments.
โ ๏ธ Important: Multi-threading Support Status
Current Status: Single-threaded environments work reliably. Multi-threaded scenarios require additional design and optimization.
โ What Works Well (Single-threaded)
- Variable tracking with
track_var!
macro - Memory allocation and deallocation monitoring
- Smart pointer reference counting (Rc, Arc, Box)
- JSON/SVG/HTML export functionality
- Memory leak detection and analysis
- Interactive dashboard generation
โ ๏ธ Multi-threading Limitations
The current implementation has known issues in multi-threaded environments:
Root Cause: The global MemoryTracker
uses multiple Mutex<T>
instances that can lead to deadlocks:
Symptoms you might encounter:
- Application hangs when using
track_var!
in multi-threaded code - Deadlocks during memory tracking operations
- Inconsistent tracking results
- Performance degradation under high concurrency
๐ ๏ธ Current Workarounds
If you need to use memscope-rs in multi-threaded applications, we provide several mitigation options:
Option 1: Disable Global Tracking
# This completely bypasses global state, safe but limited functionality
Option 2: Enable Fast Mode
# Uses simplified tracking logic with reduced lock contention
Option 3: Async-Compatible Mode
# Skips heavy operations that can cause deadlocks
Option 4: Limit Test Concurrency
# Force single-threaded execution for testing
๐ฎ Future Plans
We are actively working on a lock-free multi-threaded implementation that will include:
- Lock-free data structures using atomic operations
- Per-thread local buffers with periodic aggregation
- Sampling-based tracking similar to profiling tools like
perf
- Better separation between fast-path operations and analysis
Core Features
1. Variable Tracking
- Non-intrusive tracking: Use
track_var!
macro to track variables without breaking your existing code (we promise!) - Smart pointer support: Full support for
Rc<T>
,Arc<T>
,Box<T>
- because Rust loves its smart pointers - Lifecycle analysis: Automatic recording of variable lifecycles from birth to... well, drop
- Reference count monitoring: Real-time tracking of smart pointer reference count changes (watch those Rc clones!)
2. Memory Analysis
- Memory leak detection: Find those sneaky leaks hiding in your code
- Fragmentation analysis: Basic heap fragmentation reporting
- Usage pattern detection: Simple memory usage pattern recognition
- Performance issue identification: Spot memory-related bottlenecks
3. Data Export & Interactive Visualization
- JSON export: Export detailed memory allocation data for programmatic analysis
- Binary export: Efficient binary format for large datasets with faster I/O
- SVG visualization: Generate memory usage charts and timelines (pretty pictures!)
- ๐ฏ HTML Interactive Dashboard: Full-featured web-based dashboard with clickable charts, filterable data, and real-time analysis
- Binary โ HTML: Convert binary snapshots directly to interactive HTML dashboards
- JSON โ HTML: Transform JSON analysis data into rich web visualizations
- Multiple export modes: Fast mode, detailed mode, and "let the computer decide" mode
4. Safety Analysis
- FFI boundary tracking: Monitor memory interactions between Rust and C/C++ code
- Security violation detection: Identify potential memory safety issues
- Use-after-free detection: Catch those "oops, I used it after freeing it" moments
Available Commands and Tools
Example Programs
# Basic usage demonstration
# Comprehensive memory analysis showcase
# Complex lifecycle showcase
# Memory stress test (warning: may stress your computer too)
# Multi-threaded stress test
# Performance test
# Realistic usage with extensions
# Large-scale binary comparison
# Unsafe/FFI safety demo (for the brave souls)
# Async basic test
# Simple binary test
# JSON export test
Usage Examples
Basic Usage
use ;
Smart Pointer Tracking
use Rc;
use Arc;
// Track reference counted pointers
let rc_data = new;
track_var!;
// Track atomic reference counted pointers (for when you need thread safety)
let arc_data = new;
track_var!;
// Cloning operations are also tracked (watch the ref count go up!)
let rc_clone = clone;
track_var!;
Export Configuration
use ExportOptions;
let options = new
.include_system_allocations // Fast mode (recommended)
.verbose_logging // For when you want ALL the details
.buffer_size; // 128KB buffer (because bigger is better, right?)
if let Err = tracker.export_to_json_with_options
Performance Testing & Benchmarks
๐ฏ Quick Start Commands
# Clone and setup
# Build and test basic functionality
# Generate HTML report
๐ Available Benchmarks
# Fast benchmarks (recommended)
# Comprehensive benchmarks
# Stress testing
Build & Installation
System Requirements
- Rust: 1.70 or later (we're not asking for much)
- OS: Linux, macOS, Windows (basically everywhere Rust runs)
- Memory: At least 4GB RAM recommended (for analyzing large projects)
From Source
# Clone the repository
# Build the project (grab a coffee, this might take a moment)
# Run tests (cross your fingers)
# Try an example
# Export to different formats
# View generated dashboards
# You can view the HTML interface examples in ./images/*.html
From Crates.io
# Add to your project
# Or manually add to Cargo.toml
Feature Flags
[]
= { = "0.1.5" }
Available features:
backtrace
- Enable stack trace collection (adds overhead, but gives you the full story)derive
- Enable derive macro support (experimental, use at your own risk)tracking-allocator
- Custom allocator support (enabled by default)
Output File Structure & Interactive Dashboard
After running programs, you'll find analysis results in the MemoryAnalysis/
directory:
โโโ basic_usage_memory_analysis.json // comprehensive memory data
โโโ basic_usage_lifetime.json // variable lifetime info
โโโ basic_usage_performance.json // performance metrics
โโโ basic_usage_security_violations.json // security analysis
โโโ basic_usage_unsafe_ffi.json // unsafe && ffi info
โโโ basic_usage_complex_types.json // complex types data
โโโ memory_report.html // interactive dashboard
๐ Interactive HTML Dashboard Features
The generated dashboard.html
provides a rich, interactive experience:
- ๐ Interactive Charts: Click and zoom on memory usage graphs
- ๐ Filterable Data Tables: Search and filter allocations by type, size, or lifetime
- ๐ Real-time Statistics: Live updating memory metrics and trends
- ๐ฏ Variable Drill-down: Click on any variable to see detailed lifecycle information
- ๐ฑ Responsive Design: Works on desktop, tablet, and mobile browsers
- ๐ Cross-references: Navigate between related allocations and smart pointer relationships
To view the dashboard:
# output html
# After running your tracked program
# Or simply double-click the HTML file in your file manager
Project Highlights
1. Non-intrusive Design
- Use macros for tracking without changing your code structure
- Variables work normally after tracking (no weird side effects)
- Selective tracking of key variables instead of global tracking (because sometimes less is more)
2. Smart Analysis
- Automatic identification of memory usage patterns and anomalies
- Smart pointer reference count change tracking
- Variable relationship analysis and dependency graph generation
3. Diverse Output Formats
- JSON data for programmatic processing and integration
- SVG charts for intuitive visualization
- HTML dashboard for interactive analysis (with actual buttons to click!)
4. Performance Optimization
- Fast export mode to reduce performance overhead
- Parallel processing support for large datasets
- Configurable buffer sizes for I/O optimization
5. Safety Analysis
- FFI boundary memory safety checks
- Automatic detection of potential security vulnerabilities
- Memory access pattern safety assessment
Comparison with Other Tools
Feature | memscope-rs | Valgrind | Heaptrack | jemalloc |
---|---|---|---|---|
Rust Native | โ | โ | โ | โ ๏ธ |
Variable Names | โ | โ | โ | โ |
Smart Pointer Analysis | โ | โ ๏ธ | โ ๏ธ | โ |
Visual Reports | โ | โ ๏ธ | โ | โ |
Production Ready | โ ๏ธ | โ | โ | โ |
Interactive Timeline | โ | โ | โ ๏ธ | โ |
Real-time Tracking | โ ๏ธ | โ | โ | โ |
Low Overhead | โ ๏ธ | โ ๏ธ | โ | โ |
Mature Ecosystem | โ | โ | โ | โ |
Honest Assessment
memscope-rs (this project)
- โ Strengths: Rust native, variable name tracking, smart pointer analysis, interactive visualization
- โ ๏ธ Current status: Experimental tool, good for development debugging, noticeable performance overhead
- โ Limitations: Not mature enough, not suitable for production, relatively limited functionality
Valgrind
- โ Strengths: Industry standard, battle-tested, comprehensive features, production-grade
- โ ๏ธ Limitations: Not Rust native, significant performance overhead, steep learning curve
- ๐ฏ Best for: Deep memory debugging, complex problem troubleshooting
Heaptrack
- โ Strengths: Mature profiling tool, good visualization, relatively low overhead
- โ ๏ธ Limitations: Mainly for C/C++, limited Rust-specific features
- ๐ฏ Best for: Performance analysis, memory usage optimization
jemalloc
- โ Strengths: Production-grade allocator, excellent performance, built-in analysis features
- โ ๏ธ Limitations: Mainly an allocator, basic analysis functionality
- ๐ฏ Best for: Production environments, performance optimization
When to Use memscope-rs
Good scenarios:
- ๐ Rust project development debugging - Want to understand specific variable memory usage
- ๐ Learning Rust memory management - Visualize ownership and borrowing concepts
- ๐งช Prototype validation - Quickly verify memory usage patterns
- ๐ฏ Smart pointer analysis - Deep dive into Rc/Arc reference count changes
Not recommended scenarios:
- ๐ซ Production monitoring - Use mature tools instead
- ๐ซ High-performance requirements - Tracking overhead might be unacceptable
- ๐ซ Complex memory issues - Valgrind and friends are better
- ๐ซ Large project comprehensive analysis - Functionality and stability not sufficient yet
Performance Characteristics
Based on actual testing (not marketing numbers):
Tracking Overhead
- Small programs: ~5-15% runtime overhead (not too bad!)
- Memory usage: ~10-20% additional memory for tracking data
- Large datasets: Performance degrades significantly (we're working on it)
Export Performance
- Small datasets (< 1000 allocations): < 100ms (blink and you'll miss it)
- Medium datasets (1000-10000 allocations): 100ms - 1s (time for a sip of coffee)
- Large datasets (> 10000 allocations): Several seconds (time for a full coffee break)
Known Limitations
- Thread safety: Basic support, may have issues under heavy concurrency
- Memory leaks: Tracking itself may leak memory in some scenarios (ironic, we know)
- Platform support: Limited testing on different platforms
- Error handling: Some errors are silently ignored (we're working on being more vocal)
Current Development Status
What works reliably:
- โ Single-threaded variable tracking: Core functionality works well in single-threaded environments
- โ
Multi-format data export:
- JSON export with complete allocation data
- Binary export for efficient large dataset handling
- Direct binary โ HTML conversion with interactive dashboards
- JSON โ HTML transformation with rich visualizations
- โ Interactive HTML dashboard: Feature-rich visualization with clickable elements, variable relationship graphs, 3D memory layout
- โ Smart pointer support: Full Rc, Arc, Box tracking with reference counting
- โ Memory analysis: Basic leak detection and pattern analysis
- โ CLI tools and examples: All demonstration programs run successfully
Known critical issues (honest assessment):
- โ ๏ธ Multi-threading deadlocks: Global tracker with multiple mutexes causes deadlocks(20 threads limit or be killed)
- โ ๏ธ Performance overhead: 5-15% runtime overhead, degrades significantly with large datasets
- โ ๏ธ 934 unsafe
unwrap()
calls: Potential panic points that need proper error handling- Risk: Application can panic unexpectedly during memory tracking operations
- Mitigation: Use
MEMSCOPE_TEST_MODE=1
for safer fallback behavior - Status: Active work in progress to replace with safe alternatives
- โ ๏ธ Thread safety: Basic support only, not thoroughly tested under concurrency
- โ ๏ธ Memory leaks in tracker itself: Tracking system can leak memory (ironic but true)
- โ ๏ธ Inconsistent API design: Some modules use different patterns and conventions
- โ ๏ธ Limited platform testing: Mainly tested on specific development environments
Production readiness:
- ๐ซ Not suitable for production: Current status is experimental/development tool only
- ๐ซ No stability guarantees: APIs may change, memory safety not fully validated
- โ Good for development debugging: Excellent for understanding memory patterns during development
- โ Educational value: Great for learning Rust memory management concepts
Planned improvements :
High Priority :
- ๐ Multi-threading safety: Implement lock-free tracking architecture
- ๐ Replace dangerous
unwrap()
calls: 154 calls need proper error handling - ๐ Performance optimization: Reduce overhead for large datasets
- ๐ Memory leak fixes: Fix tracker's own memory leaks
Medium Priority :
- ๐ API consistency: Standardize interfaces across modules
- ๐ Better error handling: Comprehensive error reporting system
- ๐ Cross-platform testing: Validate on Windows, macOS, Linux
- ๐ Documentation improvements: More examples and use cases
Future Goals :
- ๐ Production readiness: Stability and performance validation
- ๐ Advanced analysis: ML-based memory pattern detection
- ๐ Integration support: IDE plugins and CI/CD integration
- ๐ Real-time monitoring: Live memory tracking dashboard
Use Cases
โ Recommended Use Cases
Single-threaded Applications
Development debugging : Track memory usage during development
- Performance optimization : Identify memory bottlenecks and optimization opportunities
- Memory leak troubleshooting : Locate and fix memory leak issues
- Code review : Analyze code memory usage patterns
- Educational demos : Demonstrate Rust memory management mechanisms
- Algorithm analysis : Understand memory behavior of data structures and algorithms
โ ๏ธ Use with Caution
Multi-threaded Applications
- Only with workarounds : Use environment variables to disable problematic features
- Testing environments : Single-threaded test execution with
RUST_TEST_THREADS=1
- Development debugging : Limited tracking with
MEMSCOPE_DISABLE_GLOBAL=1
Required precautions for multi-threaded use:
# Choose one of these approaches:
# Safest: disables global tracking
# Skips heavy operations
# Uses simplified tracking
# Forces single-threaded execution
๐ซ Not Recommended
- Production environments: Not stable enough, use mature tools instead
- High-performance applications : Tracking overhead may be unacceptable
- Critical systems : Potential deadlocks and memory leaks in tracker itself
- Large-scale applications : Performance degrades significantly with large datasets
- Concurrent servers : Multi-threading limitations make it unsuitable
Technical Architecture
The project uses a modular design:
- core/: Core tracking functionality and type definitions
- analysis/: Memory analysis algorithms and pattern recognition
- export/: Data export and visualization generation
- cli/: Command-line tools and user interface
- bin/: Executable analysis tools
Troubleshooting
Common Issues
Application hangs or deadlocks in multi-threaded code:
# Use one of these environment variables:
# Completely disable global tracking
# Use simplified tracking logic
# Skip heavy operations
# Force single-threaded execution
Panic with "unwrap() called on None":
# Enable safer fallback behavior
# Or disable specific features
Export fails with large datasets:
// Use smaller buffer or exclude system allocations
let options = new
.include_system_allocations
.buffer_size;
High memory usage:
# Disable backtrace collection
Permission errors on output:
# Ensure write permissions
Performance degradation:
# Use fast mode with reduced tracking
# Or disable expensive operations
Contributing
This is experimental software, but we welcome contributions! Please:
- Test thoroughly - Make sure your changes don't break existing functionality
- Document limitations - Be honest about what doesn't work
- Performance test - Measure the impact of your changes
- Keep it simple - Avoid over-engineering (we have enough complexity already)
# Development workflow
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
at your option.
Development Roadmap
Next Major Focus: Multi-threading & Async Support
Current Status: Single-threaded environments work reliably, but multi-threading has critical limitations.
Planned Improvements:
-
Thread-Safe Architecture Redesign
- Replace global mutex-based tracker with thread-local storage
- Implement lock-free data structures for allocation tracking
- Add proper synchronization for cross-thread memory analysis
-
Async Runtime Support
- Tokio runtime integration with async-aware tracking
- Async allocation/deallocation monitoring
- Future-aware memory lifecycle analysis
-
Performance Optimization
- Reduce tracking overhead from current 5-15% to target <3%
- Optimize binary export format for large concurrent workloads
- Implement sampling modes for production environments
-
Safety & Reliability
- Replace 934 unsafe
unwrap()
calls with proper error handling - Add comprehensive concurrency testing
- Implement graceful degradation under high load
- Replace 934 unsafe
Target Timeline: These improvements are critical for production readiness and represent the primary development focus for upcoming releases.
Disclaimer
This software is experimental and not production-ready. Please read carefully:
- โ ๏ธ Multi-threading deadlock risk: Known deadlock issues in concurrent environments
- โ ๏ธ Memory safety not guaranteed: 934 unsafe
unwrap()
calls could cause panics - โ ๏ธ Performance impact: 5-15% runtime overhead, significant with large datasets
- โ ๏ธ Memory leaks: The tracker itself may leak memory during operation
- โ ๏ธ Limited testing: Not thoroughly tested across different platforms and scenarios
- โ ๏ธ API instability: Interfaces may change in future versions
Use at your own risk. This tool is suitable for development debugging and educational purposes only. For production monitoring, consider mature alternatives like Valgrind, Heaptrack, or jemalloc's built-in profiling.
*Made with โค๏ธ and ๐ฆ by developers who care about memory (maybe too much) *