vignette 0.1.0

A sampling profiler as a library. Particularly oriented towards shipping software where symbols need to be hydrated later.
# Vignette

(Still needs to be published to crates.io. Also needs better documentation.)

Vignette is a sampling profiler as a library.

![sample profile screenshot](./speedscope-rayon-life.png)

The primary use case is to ship it linked to your application in a release
configuration. While most sampling profilers require debugging symbols in the
binary being profiled, vignette does not have that requirement. It is
specifically designed to capture un-symbolicated profiles, which can be
resolved externally, usually on another machine.

This is very useful for desktop applications running on machines outside
developer control. The application can profile itself at certain points and
upload profiles to a telemetry server.

## Status

The Linux profiling process is implemented end-to-end. I know how to implement
it on Windows and Mac, but haven't gotten around to writing the backends yet.

## Sample workflow

### Integrate vignette

Link vignette into your application. For non-Rust applications, a C FFI
interface still needs to be written (contributions welcome!).

Then use the Profiler struct at points in your program where you'd like to
capture a profile. See examples/sample_once.rs for how to do this.

A larger example is this [fork of the Game of Life](https://github.com/nikhilm/rayon/commit/e7049b6bd9d2ba5091a510a41c3822e8b5839832) from Rayon.

### Build

During the build process, debugging information that are generated is saved on
servers, then stripped from the release binary.

Vignette currently only supports the use of the breakpad .sym format, but it
uses the symbolic crate and can conceivably support other input formats.

Use the src/bin/generate_symbols.rs binary that wraps `dump_syms` (from
Breakpad) on your binaries, or directly run `dump_syms` on all your libraries
to generate sym files.

### Release

Write the profile somewhere and upload it/request it from a user somehow.

### Resolve symbols

Using the breakpad symbols generated before, and the profile, resolve the
instruction pointers in the samples to function and file names.
src/bin/resolve.rs can do this.

This will generate a resolved json file. An example is
profiles/rayon-life.resolved.vignette.

### Viewing profiles

Right now vignette only outputs to a format understood by
[Speedscope](https://speedscope.app). The src/bin/speedscope.rs binary will
convert a resolved profile to a speedscope file. This can be loaded into the
website. An example is profiles/rayon-life.speed.

## License

Licensed under either of

 * Apache License, Version 2.0
   ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
 * MIT license
   ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

## Contribution

Contributions are welcome!

Any contribution intentionally submitted for inclusion in the work by you, as
defined in the Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.