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: boolImplementations§
Source§impl PythonSpy
impl PythonSpy
Sourcepub fn new(pid: Pid, config: &Config) -> Result<PythonSpy, Error>
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}Sourcepub fn retry_new(
pid: Pid,
config: &Config,
max_retries: u64,
) -> Result<PythonSpy, Error>
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.
Sourcepub fn get_stack_traces(&mut self) -> Result<Vec<StackTrace>, Error>
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§
impl Freeze for PythonSpy
impl RefUnwindSafe for PythonSpy
impl Send for PythonSpy
impl Sync for PythonSpy
impl Unpin for PythonSpy
impl UnwindSafe for PythonSpy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more