diff options
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/registers.rs | 31 | ||||
| -rw-r--r-- | src/trace.rs | 11 | 
3 files changed, 36 insertions, 7 deletions
diff --git a/src/main.rs b/src/main.rs index d4347ad..9e025b7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +mod registers;  mod trace;  mod ui;  use std::{ diff --git a/src/registers.rs b/src/registers.rs new file mode 100644 index 0000000..80b4a9b --- /dev/null +++ b/src/registers.rs @@ -0,0 +1,31 @@ +use nix::libc::user_regs_struct; + +/// Struct used to manipulate registers data from https://docs.rs/libc/0.2.147/libc/struct.user_regs_struct.html +pub struct RegistersData { +    orig_rax: u64, +    rdi: u64, +    rsi: u64, +    rdx: u64, +    rax: u64, +} + +impl RegistersData { +    /// Create new `RegistersData` from an `user_regs_struct`'C structure +    pub fn new(registers: user_regs_struct) -> RegistersData { +        RegistersData { +            orig_rax: registers.orig_rax, +            rdi: registers.rdi, +            rsi: registers.rsi, +            rdx: registers.rdx, +            rax: registers.rax, +        } +    } + +    /// Returns a good string which shows the output for a line +    pub fn output(&self) -> String { +        format!( +            "{}({:x}, {:x}, {:x}, ...) = {:x}", +            self.orig_rax, self.rdi, self.rsi, self.rdx, self.rax +        ) +    } +} diff --git a/src/trace.rs b/src/trace.rs index e576320..399f1c6 100644 --- a/src/trace.rs +++ b/src/trace.rs @@ -1,3 +1,4 @@ +use crate::registers::RegistersData;  use nix::{      sys::{          ptrace, @@ -56,16 +57,12 @@ pub fn trace(pid: Pid, file_to_print: Option<String>) -> anyhow::Result<Vec<u8>>              WaitStatus::Stopped(pid, signal) => {                  match signal {                      Signal::SIGTRAP => { -                        let regs = ptrace::getregs(pid)?;                          if have_to_print { -                            let output = format!( -                                "{}({:x}, {:x}, {:x}, ...) = {:x}", -                                regs.orig_rax, regs.rdi, regs.rsi, regs.rdx, regs.rax -                            ); -                            writeln!(lines, "{output}")?; +                            let reg = RegistersData::new(ptrace::getregs(pid)?); +                            writeln!(lines, "{}", reg.output())?;                              if let Some(ref mut f) = f { -                                writeln!(f, "{output}")?; +                                writeln!(f, "{}", reg.output())?;                              }                          }                      }  |