# rbspy
[![crates.io](https://badgen.net/crates/v/rbspy)](https://crates.io/crates/rbspy)
[![ci](https://github.com/rbspy/rbspy/actions/workflows/ci.yml/badge.svg)](https://github.com/rbspy/rbspy/actions/workflows/ci.yml)
Have a running Ruby program that you want to profile without restarting it? Want to profile a Ruby
command line program really easily? You want `rbspy`! rbspy can profile any Ruby program just by
running 1 simple command.
`rbspy` lets you profile Ruby processes that are already running. You give it a PID, and it starts
profiling. It's a sampling profiler, which means it's **low overhead** and **safe to run in
production**.
`rbspy` lets you record profiling data, save the raw profiling data to disk, and then analyze it in
a variety of different ways later on.
## only wall-clock profiling
There are 2 main ways to profile code -- you can either profile everything the
application does (including waiting), or only profile when the application is using the CPU.
rbspy profiles everything the program does (including waiting) -- there's no
option to just profile when the program is using the CPU.
## Documentation
=> https://rbspy.github.io
## Requirements
rbspy supports Linux\*, Mac, Windows, and FreeBSD.
* kernel version 3.2+ required. For Ubuntu, this means Ubuntu 12.04 or newer.
## Add a testimonial
Did rbspy help you make your program faster? An awesome way to thank the project is to add a [success story to this GitHub issue](https://github.com/rbspy/rbspy/issues/62)
where people talk about ways rbspy has helped them! Hearing that rbspy is working for people is good
motivation :)
## Installing
### Standalone binary
On Mac, you can install with Homebrew: `brew install rbspy`.
On Linux:
1. Download recent release of `rbspy` from [the GitHub releases page](https://github.com/rbspy/rbspy/releases).
* The binaries tagged with `musl` are statically linked against musl libc and can be used on most systems. The ones tagged with `gnu` are dynamically linked against GNU libc, so you will need it to be installed.
2. Unpack it
3. Move the `rbspy` binary to `/usr/local/bin`
Or have a look at [Installing rbspy](https://rbspy.github.io/installing.html) on our documentation.
### As a Rust library
To use rbspy in your Rust project, add the following to your Cargo.toml:
```toml
[dependencies]
rbspy = "0.8"
```
**WARNING**: The rbspy crate's API is not stable yet. We will follow [semantic versioning](https://semver.org/) after rbspy reaches version 1.0.
## Contributing
Pull requests that improve usability, fix bugs, or help rbspy support more operating systems are
very welcome. If you have a question, the best way to ask is to [create a GitHub issue](https://github.com/rbspy/rbspy/issues/new)!
If you're not a very experienced Rust programmer, you're very welcome to contribute. A major reason
rbspy is written in Rust is that Rust is more approachable for beginners than C/C++.
https://www.rust-lang.org/ has great resources for learning Rust.
## Building rbspy
1. Install cargo from [crates.io](https://crates.io/)
1. `cargo build` to build
1. `cargo test` to test
The built binary will end up at `target/debug/rbspy`