# Using `delouse`
First, edit your `Cargo.toml` to add the `delouse` crate as an optional
dependency, and add a new feature ("`debug`").
```toml
[dependencies]
...
delouse = { version = "0", optional = true }
...
[features]
...
debug = ["dep:delouse"]
...
```
Next, during the startup in your `main` or similar, put in:
```rust
...
async fn main() -> Result<()> {
#[cfg(feature = "debug")]
{
delouse::init().unwrap();
}
...
}
...
```
# Running your program
When building with `cargo build` or running with `cargo run`, add an additional
`--features debug` flag to enable `delouse`.
# Using `delouse`
By default, and due to no toggles existing yet, `delouse` will bind to
`127.0.0.1:7132`. The interface is OpenAPI/JSON based, so you can shave
that yak how you'd like, but I tend to just use cURL. Here's some commands
for bad days:
| What | Command | Platform Restrictions | Notes |
| - | - | - | - |
| Rust Stacktrace | curl http://localhost:7132/stacktrace/rust | jq -r .stacktrace
| | |
| ELF Information | curl http://localhost:7132/elf/info | jq .
| Linux 🐧 | |
| Request a coredump | curl http://localhost:7132/coredump
| Linux 🐧 | Process will exit |
| Tokio Stacktrace | curl http://localhost:7132/stacktrace/tokio | jq -r .stacktrace
| Linux 🐧, `tokio_unstable` | This endpoint is *very* flaky. If this locks up `tokio`'s runtime, this will panic the process with the stacktrace. |
# tokio specific notes
A lot of the surface we need is unstable. The following table is a list
of endpoints and required `cfg` directives.
| Endpoint | cfgs |
| - | - |
| `stacktrace/tokio` | `tokio_unstable`, `tokio_taskdump` |
In the author's very humble opinion, the following `.cargo/config.toml`
settings are encouraged, in the absense of overriding convictions or
specific engineering restrictions when running with `tokio`:
```toml
[build]
rustflags = ["--cfg", "tokio_unstable"]
[target.x86_64-unknown-linux-gnu]
rustflags = ["--cfg", "tokio_unstable", "--cfg", "tokio_taskdump"]
```
If this is not possible, `delouse` will gracefully degrade and not
serve any endpoints which can not be run.