6 releases

0.3.0 Oct 13, 2019
0.2.0 Jan 28, 2019
0.1.3 Aug 22, 2018
0.1.1 Jul 10, 2018
0.1.0 Nov 22, 2017

#49 in #stack-trace

Download history 6146/week @ 2024-03-14 5314/week @ 2024-03-21 4747/week @ 2024-03-28 5683/week @ 2024-04-04 4995/week @ 2024-04-11 6067/week @ 2024-04-18 5554/week @ 2024-04-25 6043/week @ 2024-05-02 6212/week @ 2024-05-09 6274/week @ 2024-05-16 6937/week @ 2024-05-23 7135/week @ 2024-05-30 7275/week @ 2024-06-06 7450/week @ 2024-06-13 6931/week @ 2024-06-20 5368/week @ 2024-06-27

28,126 downloads per month

MIT/Apache

34KB
778 lines

Retrieve stack traces of all threads of the process.

This is implemented using the rstack crate, which itself uses ptrace to unwind the threads of the process. Because processes cannot ptrace themselves, we're forced to use spawn a child process which does that work. Multiple unwinding implementations are supported via Cargo features:

By default, the libunwind backend is used. You can switch to libdw via Cargo:

[dependencies]
rstack-self = { version = "0.1", features = ["dw"], default-features = false }

Example

extern crate rstack_self;

use std::env;
use std::process::Command;
use std::thread;

fn main() {
    if env::args_os().count() > 1 {
        let _ = rstack_self::child();
        return;
    }

    // spawn a second thread just for fun
    thread::spawn(background_thread);

    let exe = env::current_exe().unwrap();
    let trace = rstack_self::trace(Command::new(exe).arg("child")).unwrap();

    println!("{:#?}", trace);
}

fn background_thread() {
    loop {
        thread::park();
    }
}

Dependencies

~3–5MB
~104K SLoC