More specific error types for functions

This commit is contained in:
Elnath 2025-05-17 17:12:20 +02:00
parent 22391a4fe9
commit b20fa4672d
1 changed files with 16 additions and 13 deletions

View File

@ -8,12 +8,16 @@ use nix::unistd::Pid;
pub struct PTraceError(#[from] nix::errno::Errno);
#[derive(thiserror::Error, Debug)]
pub enum DebugError {
#[error("Error when calling ptrace: {0}")]
PTraceError(nix::errno::Errno), // TODO: do not repeat above implem
#[error("Error when waiting on child process: {0}")]
WaitError(nix::errno::Errno),
pub struct WaitError(#[from] nix::errno::Errno);
#[derive(thiserror::Error, Debug)]
pub enum DebugError {
#[error(transparent)]
PTraceError(#[from] PTraceError),
#[error(transparent)]
WaitError(#[from] WaitError),
#[error("Child stopped with status {0:?}, but was not expecting to catch this one")]
UnexpectedWaitStatus(nix::sys::wait::WaitStatus),
@ -37,20 +41,19 @@ impl DebugState for Stopped {
}
impl DebugTarget<Stopped> {
pub fn new(pid: Pid) -> Result<Self, DebugError> {
waitid(Id::Pid(pid), WaitPidFlag::WSTOPPED).map_err(DebugError::WaitError)?;
pub fn new(pid: Pid) -> Result<Self, WaitError> {
waitid(Id::Pid(pid), WaitPidFlag::WSTOPPED).map_err(WaitError)?;
Ok(DebugTarget { state: Stopped { pid } })
}
pub fn cont(self) -> Result<DebugTarget<Running>, DebugError> {
nix::sys::ptrace::cont(self.state.pid, None).map_err(DebugError::PTraceError)?;
pub fn cont(self) -> Result<DebugTarget<Running>, PTraceError> {
nix::sys::ptrace::cont(self.state.pid, None).map_err(PTraceError)?;
Ok(DebugTarget { state: Running { pid: self.state.pid } })
}
pub fn stepi(self) -> Result<Self, DebugError> {
nix::sys::ptrace::step(self.state.pid, None).map_err(DebugError::PTraceError)?;
println!("ptrace actually fine");
match waitid(Id::Pid(self.state.pid), WaitPidFlag::WSTOPPED).map_err(DebugError::WaitError)? {
nix::sys::ptrace::step(self.state.pid, None).map_err(PTraceError)?;
match waitid(Id::Pid(self.state.pid), WaitPidFlag::WSTOPPED).map_err(WaitError)? {
WaitStatus::PtraceEvent(_pid, Signal::SIGTRAP, _c_event) => Ok(self),
status => Err(DebugError::UnexpectedWaitStatus(status)),
}
@ -72,7 +75,7 @@ impl DebugState for Running {
impl DebugTarget<Running> {
pub fn wait_for_exit(self) -> Result<i32, DebugError> {
match waitid(Id::Pid(self.state.pid), WaitPidFlag::WEXITED).map_err(DebugError::WaitError)? {
match waitid(Id::Pid(self.state.pid), WaitPidFlag::WEXITED).map_err(WaitError)? {
WaitStatus::Exited(_pid, exit_code) => Ok(exit_code),
status => Err(DebugError::UnexpectedWaitStatus(status))
}