use core::fmt::{self, Debug, Display}; use crate::protocol::{PacketParseError, ResponseWriterError}; use crate::util::managed_vec::CapacityError; /// An error which may occur during a GDB debugging session. #[derive(Debug)] #[non_exhaustive] pub enum GdbStubError { /// Connection Error while reading request. ConnectionRead(C), /// Connection Error while writing response. ConnectionWrite(ResponseWriterError), /// Client nack'd the last packet, but `gdbstub` doesn't implement /// re-transmission. ClientSentNack, /// GdbStub was not provided with a packet buffer in `no_std` mode /// (missing call to `with_packet_buffer`) MissingPacketBuffer, /// Packet cannot fit in the provided packet buffer. PacketBufferOverlow, /// Could not parse the packet into a valid command. PacketParse(PacketParseError), /// GDB client sent an unexpected packet. PacketUnexpected, /// GDB client sent a packet with too much data for the given target. TargetMismatch, /// Target threw a fatal error. TargetError(T), /// Target didn't report any active threads. NoActiveThreads, /// Resuming with a signal is not implemented yet. Consider opening a PR? ResumeWithSignalUnimplemented, /// Internal - A non-fatal error occurred (with errno-style error code) #[doc(hidden)] NonFatalError(u8), } impl From> for GdbStubError { fn from(e: ResponseWriterError) -> Self { GdbStubError::ConnectionWrite(e) } } impl From> for GdbStubError { fn from(_: CapacityError) -> Self { GdbStubError::PacketBufferOverlow } } impl Display for GdbStubError where C: Debug, T: Debug, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { use self::GdbStubError::*; match self { ConnectionRead(e) => write!(f, "Connection Error while reading request: {:?}", e), ConnectionWrite(e) => write!(f, "Connection Error while writing response: {:?}", e), ClientSentNack => write!(f, "Client nack'd the last packet, but `gdbstub` doesn't implement re-transmission."), MissingPacketBuffer => write!(f, "GdbStub was not provided with a packet buffer in `no_std` mode (missing call to `with_packet_buffer`)"), PacketBufferOverlow => write!(f, "Packet too big for provided buffer!"), PacketParse(e) => write!(f, "Could not parse the packet into a valid command: {:?}", e), PacketUnexpected => write!(f, "Client sent an unexpected packet."), TargetMismatch => write!(f, "GDB client sent a packet with too much data for the given target."), TargetError(e) => write!(f, "Target threw a fatal error: {:?}", e), NoActiveThreads => write!(f, "Target didn't report any active threads."), ResumeWithSignalUnimplemented => write!(f, "Resuming with a signal is not implemented yet. Consider opening a PR?"), NonFatalError(_) => write!(f, "Internal - A non-fatal error occurred (with errno-style error code)"), } } } #[cfg(feature = "std")] impl std::error::Error for GdbStubError where C: Debug, T: Debug, { }