PythonSpy

Struct PythonSpy 

Source
pub struct PythonSpy {
    pub pid: Pid,
    pub process: Process,
    pub version: Version,
    pub interpreter_address: usize,
    pub threadstate_address: usize,
    pub python_filename: PathBuf,
    pub version_string: String,
    pub config: Config,
    pub short_filenames: HashMap<String, Option<String>>,
    pub python_thread_ids: HashMap<u64, Tid>,
    pub python_thread_names: HashMap<u64, String>,
    pub dockerized: bool,
}
Expand description

Lets you retrieve stack traces of a running python program

Fields§

§pid: Pid§process: Process§version: Version§interpreter_address: usize§threadstate_address: usize§python_filename: PathBuf§version_string: String§config: Config§short_filenames: HashMap<String, Option<String>>§python_thread_ids: HashMap<u64, Tid>§python_thread_names: HashMap<u64, String>§dockerized: bool

Implementations§

Source§

impl PythonSpy

Source

pub fn new(pid: Pid, config: &Config) -> Result<PythonSpy, Error>

Constructs a new PythonSpy object.

Examples found in repository?
examples/dump_traces.rs (line 9)
6fn print_python_stacks(pid: remoteprocess::Pid) -> Result<(), anyhow::Error> {
7    // Create a new PythonSpy object with the default config options
8    let config = py_spy_for_datakit::Config::default();
9    let mut process = py_spy_for_datakit::PythonSpy::new(pid, &config)?;
10
11    // get stack traces for each thread in the process
12    let traces = process.get_stack_traces()?;
13
14    // Print out the python stack for each thread
15    for trace in traces {
16        println!("Thread {:#X} ({})", trace.thread_id, trace.status_str());
17        for frame in &trace.frames {
18            println!("\t {} ({}:{})", frame.name, frame.filename, frame.line);
19        }
20    }
21    Ok(())
22}
Source

pub fn retry_new( pid: Pid, config: &Config, max_retries: u64, ) -> Result<PythonSpy, Error>

Creates a PythonSpy object, retrying up to max_retries times. Mainly useful for the case where the process is just started and symbols or the python interpreter might not be loaded yet.

Source

pub fn get_stack_traces(&mut self) -> Result<Vec<StackTrace>, Error>

Gets a StackTrace for each thread in the current process

Examples found in repository?
examples/dump_traces.rs (line 12)
6fn print_python_stacks(pid: remoteprocess::Pid) -> Result<(), anyhow::Error> {
7    // Create a new PythonSpy object with the default config options
8    let config = py_spy_for_datakit::Config::default();
9    let mut process = py_spy_for_datakit::PythonSpy::new(pid, &config)?;
10
11    // get stack traces for each thread in the process
12    let traces = process.get_stack_traces()?;
13
14    // Print out the python stack for each thread
15    for trace in traces {
16        println!("Thread {:#X} ({})", trace.thread_id, trace.status_str());
17        for frame in &trace.frames {
18            println!("\t {} ({}:{})", frame.name, frame.filename, frame.line);
19        }
20    }
21    Ok(())
22}

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V