summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@chromium.org>2019-02-12 17:51:26 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-02-20 08:20:02 -0800
commitb4bd00fdad094b16c785b8ead9f92d68264f5fb4 (patch)
tree540ad033c789aa08a1ffed17e9c161df331600d2
parent0373b9f154b5ec1894138b7c10ad495fcce7b64f (diff)
downloadcrosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar.gz
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar.bz2
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar.lz
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar.xz
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.tar.zst
crosvm-b4bd00fdad094b16c785b8ead9f92d68264f5fb4.zip
error: Print errors using Display impl
I have been running into Debug-printed error messages too often and
needing to look up in the source code each level of nested errors to
find out from the comment on the error variant what the short name of
the variant means in human terms. Worse, many errors (like the one shown
below) already had error strings written but were being printed from the
calling code in the less helpful Debug representation anyway.

Before:
    [ERROR:src/main.rs:705] The architecture failed to build the vm: NoVarEmpty

After:
    [ERROR:src/main.rs:705] The architecture failed to build the vm: /var/empty doesn't exist, can't jail devices.

TEST=cargo check --all-features
TEST=FEATURES=test emerge-amd64-generic crosvm

Change-Id: I77122c7d6861b2d610de2fff718896918ab21e10
Reviewed-on: https://chromium-review.googlesource.com/1469225
Commit-Ready: David Tolnay <dtolnay@chromium.org>
Tested-by: David Tolnay <dtolnay@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
-rw-r--r--arch/src/lib.rs26
-rw-r--r--devices/src/bus.rs11
-rw-r--r--devices/src/i8042.rs2
-rw-r--r--devices/src/pci/ac97_bus_master.rs24
-rw-r--r--devices/src/pci/pci_device.rs14
-rw-r--r--devices/src/pit.rs18
-rw-r--r--devices/src/proxy.rs12
-rw-r--r--devices/src/serial.rs2
-rw-r--r--devices/src/virtio/balloon.rs24
-rw-r--r--devices/src/virtio/block.rs108
-rw-r--r--devices/src/virtio/gpu/backend.rs16
-rw-r--r--devices/src/virtio/gpu/mod.rs22
-rw-r--r--devices/src/virtio/gpu/protocol.rs33
-rw-r--r--devices/src/virtio/input/mod.rs43
-rw-r--r--devices/src/virtio/net.rs35
-rw-r--r--devices/src/virtio/p9.rs36
-rw-r--r--devices/src/virtio/rng.rs19
-rw-r--r--devices/src/virtio/tpm.rs8
-rw-r--r--devices/src/virtio/vhost/mod.rs36
-rw-r--r--devices/src/virtio/vhost/net.rs2
-rw-r--r--devices/src/virtio/wl.rs18
-rw-r--r--gpu_buffer/src/lib.rs2
-rw-r--r--gpu_display/src/lib.rs18
-rw-r--r--io_jail/src/lib.rs54
-rw-r--r--msg_socket/src/msg_on_socket.rs18
-rw-r--r--net_util/src/lib.rs19
-rw-r--r--qcow/src/qcow.rs40
-rw-r--r--qcow/src/refcount.rs21
-rw-r--r--src/linux.rs123
-rw-r--r--src/main.rs16
-rw-r--r--src/plugin/mod.rs129
-rw-r--r--src/plugin/process.rs6
-rw-r--r--src/plugin/vcpu.rs4
-rw-r--r--sys_util/src/errno.rs2
-rw-r--r--sys_util/src/guest_address.rs7
-rw-r--r--sys_util/src/lib.rs4
-rw-r--r--sys_util/src/mmap.rs31
-rw-r--r--sys_util/src/signal.rs32
-rw-r--r--sys_util/src/signalfd.rs29
-rw-r--r--sys_util/src/syslog.rs23
-rw-r--r--tests/plugins.rs2
-rw-r--r--vhost/src/lib.rs19
-rw-r--r--vm_control/src/lib.rs17
43 files changed, 804 insertions, 321 deletions
diff --git a/arch/src/lib.rs b/arch/src/lib.rs
index 8a9c2d8..74545a5 100644
--- a/arch/src/lib.rs
+++ b/arch/src/lib.rs
@@ -120,26 +120,24 @@ impl fmt::Display for DeviceRegistrationError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
             DeviceRegistrationError::AllocateIoAddrs(e) => {
-                write!(f, "Allocating IO addresses: {:?}", e)
+                write!(f, "Allocating IO addresses: {}", e)
             }
             DeviceRegistrationError::AllocateIrq => write!(f, "Allocating IRQ number"),
             DeviceRegistrationError::CreateMmioDevice(e) => {
-                write!(f, "failed to create mmio device: {:?}", e)
+                write!(f, "failed to create mmio device: {}", e)
             }
             DeviceRegistrationError::Cmdline(e) => {
                 write!(f, "unable to add device to kernel command line: {}", e)
             }
             DeviceRegistrationError::EventFdCreate(e) => {
-                write!(f, "failed to create eventfd: {:?}", e)
-            }
-            DeviceRegistrationError::MmioInsert(e) => {
-                write!(f, "failed to add to mmio bus: {:?}", e)
+                write!(f, "failed to create eventfd: {}", e)
             }
+            DeviceRegistrationError::MmioInsert(e) => write!(f, "failed to add to mmio bus: {}", e),
             DeviceRegistrationError::RegisterIoevent(e) => {
-                write!(f, "failed to register ioevent to VM: {:?}", e)
+                write!(f, "failed to register ioevent to VM: {}", e)
             }
             DeviceRegistrationError::RegisterIrqfd(e) => {
-                write!(f, "failed to register irq eventfd to VM: {:?}", e)
+                write!(f, "failed to register irq eventfd to VM: {}", e)
             }
             DeviceRegistrationError::ProxyDeviceCreation(e) => {
                 write!(f, "failed to create proxy device: {}", e)
@@ -223,14 +221,12 @@ pub enum LoadImageError {
 
 impl fmt::Display for LoadImageError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::LoadImageError::*;
+
         match self {
-            LoadImageError::Seek(e) => write!(f, "Seek failed: {:?}", e),
-            LoadImageError::ImageSizeTooLarge(size) => {
-                write!(f, "Image size too large: {:?}", size)
-            }
-            LoadImageError::ReadToMemory(e) => {
-                write!(f, "Reading image into memory failed: {:?}", e)
-            }
+            Seek(e) => write!(f, "Seek failed: {}", e),
+            ImageSizeTooLarge(size) => write!(f, "Image size too large: {}", size),
+            ReadToMemory(e) => write!(f, "Reading image into memory failed: {}", e),
         }
     }
 }
diff --git a/devices/src/bus.rs b/devices/src/bus.rs
index 1c21661..1b3481b 100644
--- a/devices/src/bus.rs
+++ b/devices/src/bus.rs
@@ -6,6 +6,7 @@
 
 use std::cmp::{Ord, Ordering, PartialEq, PartialOrd};
 use std::collections::btree_map::BTreeMap;
+use std::fmt::{self, Display};
 use std::result;
 use std::sync::Arc;
 
@@ -42,6 +43,16 @@ pub enum Error {
     Overlap,
 }
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            Overlap => write!(f, "new device overlaps with an old device"),
+        }
+    }
+}
+
 pub type Result<T> = result::Result<T, Error>;
 
 /// Holds a base and length representing the address space occupied by a `BusDevice`.
diff --git a/devices/src/i8042.rs b/devices/src/i8042.rs
index 0d0c31d..5e35a5a 100644
--- a/devices/src/i8042.rs
+++ b/devices/src/i8042.rs
@@ -39,7 +39,7 @@ impl BusDevice for I8042Device {
     fn write(&mut self, offset: u64, data: &[u8]) {
         if data.len() == 1 && data[0] == 0xfe && offset == 3 {
             if let Err(e) = self.reset_evt.write(1) {
-                error!("failed to trigger i8042 reset event: {:?}", e);
+                error!("failed to trigger i8042 reset event: {}", e);
             }
         }
     }
diff --git a/devices/src/pci/ac97_bus_master.rs b/devices/src/pci/ac97_bus_master.rs
index 190fdce..b67450e 100644
--- a/devices/src/pci/ac97_bus_master.rs
+++ b/devices/src/pci/ac97_bus_master.rs
@@ -82,17 +82,15 @@ impl Error for PlaybackError {}
 
 impl Display for PlaybackError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::PlaybackError::*;
+
         match self {
-            PlaybackError::ReadingGuestBufferAddress(e) => {
-                write!(f, "Failed to get the address of the audio buffer: {:?}.", e)
-            }
-            PlaybackError::ReadingGuestSamples(e) => {
-                write!(f, "Failed to read samples from guest memory: {:?}.", e)
-            }
-            PlaybackError::StreamError(e) => {
-                write!(f, "Failed to get a buffer from the stream: {:?}", e)
+            ReadingGuestBufferAddress(e) => {
+                write!(f, "Failed to get the address of the audio buffer: {}.", e)
             }
-            PlaybackError::WritingOutput(e) => write!(f, "Failed to write audio output: {:?}.", e),
+            ReadingGuestSamples(e) => write!(f, "Failed to read samples from guest memory: {}.", e),
+            StreamError(e) => write!(f, "Failed to get a buffer from the stream: {}", e),
+            WritingOutput(e) => write!(f, "Failed to write audio output: {}.", e),
         }
     }
 }
@@ -151,8 +149,8 @@ impl Ac97BusMaster {
             loop {
                 if let Err(e) = irq_resample_evt.read() {
                     error!(
-                        "Failed to read the irq event from the resample thread: {:?}.",
-                        e
+                        "Failed to read the irq event from the resample thread: {}.",
+                        e,
                     );
                     break;
                 }
@@ -163,7 +161,7 @@ impl Ac97BusMaster {
                     if regs.func_regs(Ac97Function::Output).sr & int_mask != 0 {
                         if let Some(irq_evt) = regs.irq_evt.as_ref() {
                             if let Err(e) = irq_evt.write(1) {
-                                error!("Failed to set the irq from the resample thread: {:?}.", e);
+                                error!("Failed to set the irq from the resample thread: {}.", e);
                                 break;
                             }
                         }
@@ -440,7 +438,7 @@ impl Ac97BusMaster {
                     if let Err(e) =
                         audio_out_thread(thread_regs, thread_mem, &thread_run, output_stream)
                     {
-                        error!("Playback error: {:?}", e);
+                        error!("Playback error: {}", e);
                     }
                     thread_run.store(false, Ordering::Relaxed);
                 }));
diff --git a/devices/src/pci/pci_device.rs b/devices/src/pci/pci_device.rs
index 5ccdfef..b27dc47 100644
--- a/devices/src/pci/pci_device.rs
+++ b/devices/src/pci/pci_device.rs
@@ -5,6 +5,7 @@
 use byteorder::{ByteOrder, LittleEndian};
 
 use std;
+use std::fmt::{self, Display};
 use std::os::unix::io::RawFd;
 
 use kvm::Datamatch;
@@ -24,6 +25,19 @@ pub enum Error {
 }
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            IoAllocationFailed(size) => {
+                write!(f, "failed to allocate space for an IO BAR, size={}", size)
+            }
+            IoRegistrationFailed(addr) => write!(f, "failed to register an IO BAR, addr={}", addr),
+        }
+    }
+}
+
 pub trait PciDevice: Send {
     /// Returns a label suitable for debug output.
     fn debug_label(&self) -> String;
diff --git a/devices/src/pit.rs b/devices/src/pit.rs
index aa8161f..c01888c 100644
--- a/devices/src/pit.rs
+++ b/devices/src/pit.rs
@@ -161,15 +161,17 @@ pub enum PitError {
 
 impl fmt::Display for PitError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::PitError::*;
+
         match self {
-            PitError::TimerFdCreateError(e) => {
-                write!(f, "failed to create pit counter due to timer fd: {:?}", e)
+            TimerFdCreateError(e) => {
+                write!(f, "failed to create pit counter due to timer fd: {}", e)
             }
-            PitError::CreatePollContext(e) => write!(f, "failed to create poll context: {:?}", e),
-            PitError::PollError(err) => write!(f, "failed to poll events: {:?}", err),
-            PitError::SpawnThread(err) => write!(f, "failed to spawn thread: {:?}", err),
-            PitError::CreateEventFd(err) => write!(f, "failed to create event fd: {:?}", err),
-            PitError::CloneEventFd(err) => write!(f, "failed to clone event fd: {:?}", err),
+            CreatePollContext(e) => write!(f, "failed to create poll context: {}", e),
+            PollError(err) => write!(f, "failed to poll events: {}", err),
+            SpawnThread(err) => write!(f, "failed to spawn thread: {}", err),
+            CreateEventFd(err) => write!(f, "failed to create event fd: {}", err),
+            CloneEventFd(err) => write!(f, "failed to clone event fd: {}", err),
         }
     }
 }
@@ -195,7 +197,7 @@ pub struct Pit {
 impl Drop for Pit {
     fn drop(&mut self) {
         if let Err(e) = self.kill_evt.write(1) {
-            error!("failed to kill PIT worker threads: {:?}", e);
+            error!("failed to kill PIT worker threads: {}", e);
             return;
         }
         if let Some(thread) = self.worker_thread.take() {
diff --git a/devices/src/proxy.rs b/devices/src/proxy.rs
index 907f33c..4bc3405 100644
--- a/devices/src/proxy.rs
+++ b/devices/src/proxy.rs
@@ -72,7 +72,7 @@ fn child_proc(sock: UnixDatagram, device: &mut BusDevice) {
         let cmd = match sock.recv() {
             Ok(cmd) => cmd,
             Err(err) => {
-                error!("child device process failed recv: {:?}", err);
+                error!("child device process failed recv: {}", err);
                 break;
             }
         };
@@ -108,7 +108,7 @@ fn child_proc(sock: UnixDatagram, device: &mut BusDevice) {
             }
         };
         if let Err(e) = res {
-            error!("child device process failed send: {:?}", e);
+            error!("child device process failed send: {}", e);
         }
     }
 }
@@ -175,15 +175,15 @@ impl ProxyDevice {
         let res = self.sock.send(&cmd);
         if let Err(e) = res {
             error!(
-                "failed write to child device process {}: {:?}",
-                self.debug_label, e
+                "failed write to child device process {}: {}",
+                self.debug_label, e,
             );
         };
         match self.sock.recv() {
             Err(e) => {
                 error!(
-                    "failed read from child device process {}: {:?}",
-                    self.debug_label, e
+                    "failed read from child device process {}: {}",
+                    self.debug_label, e,
                 );
                 None
             }
diff --git a/devices/src/serial.rs b/devices/src/serial.rs
index b2a5651..c4c5a8b 100644
--- a/devices/src/serial.rs
+++ b/devices/src/serial.rs
@@ -195,7 +195,7 @@ impl BusDevice for Serial {
         }
 
         if let Err(e) = self.handle_write(offset as u8, data[0]) {
-            error!("serial failed write: {:?}", e);
+            error!("serial failed write: {}", e);
         }
     }
 
diff --git a/devices/src/virtio/balloon.rs b/devices/src/virtio/balloon.rs
index d67c532..1dfb72c 100644
--- a/devices/src/virtio/balloon.rs
+++ b/devices/src/virtio/balloon.rs
@@ -4,6 +4,7 @@
 
 use std;
 use std::cmp;
+use std::fmt::{self, Display};
 use std::io::Write;
 use std::mem;
 use std::os::unix::io::{AsRawFd, RawFd};
@@ -29,6 +30,17 @@ pub enum BalloonError {
 }
 pub type Result<T> = std::result::Result<T, BalloonError>;
 
+impl Display for BalloonError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::BalloonError::*;
+
+        match self {
+            NotEnoughPages => write!(f, "not enough pages"),
+            WritingConfigEvent(e) => write!(f, "failed to write config event: {}", e),
+        }
+    }
+}
+
 // Balloon has three virt IO queues: Inflate, Deflate, and Stats.
 // Stats is currently not used.
 const QUEUE_SIZE: u16 = 128;
@@ -92,7 +104,7 @@ impl Worker {
                         .remove_range(guest_address, 1 << VIRTIO_BALLOON_PFN_SHIFT)
                         .is_err()
                     {
-                        warn!("Marking pages unused failed {:?}", guest_address);
+                        warn!("Marking pages unused failed; addr={}", guest_address);
                         continue;
                     }
                 }
@@ -148,7 +160,7 @@ impl Worker {
         {
             Ok(pc) => pc,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -157,7 +169,7 @@ impl Worker {
             let events = match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -167,14 +179,14 @@ impl Worker {
                 match event.token() {
                     Token::Inflate => {
                         if let Err(e) = inflate_queue_evt.read() {
-                            error!("failed reading inflate queue EventFd: {:?}", e);
+                            error!("failed reading inflate queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |= self.process_inflate_deflate(true);
                     }
                     Token::Deflate => {
                         if let Err(e) = deflate_queue_evt.read() {
-                            error!("failed reading deflate queue EventFd: {:?}", e);
+                            error!("failed reading deflate queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |= self.process_inflate_deflate(false);
@@ -321,7 +333,7 @@ impl VirtioDevice for Balloon {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed to create kill EventFd pair: {:?}", e);
+                error!("failed to create kill EventFd pair: {}", e);
                 return;
             }
         };
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index 223fe1f..9dcf828 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 use std::cmp;
+use std::fmt::{self, Display};
 use std::io::{self, Read, Seek, SeekFrom, Write};
 use std::mem::{size_of, size_of_val};
 use std::os::unix::io::{AsRawFd, RawFd};
@@ -128,6 +129,21 @@ enum RequestType {
     Unsupported(u32),
 }
 
+impl Display for RequestType {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::RequestType::*;
+
+        match self {
+            In => write!(f, "in"),
+            Out => write!(f, "out"),
+            Flush => write!(f, "flush"),
+            Discard => write!(f, "discard"),
+            WriteZeroes => write!(f, "write zeroes"),
+            Unsupported(n) => write!(f, "unsupported({})", n),
+        }
+    }
+}
+
 #[derive(Debug)]
 enum ParseError {
     /// Guest gave us bad memory addresses
@@ -144,6 +160,21 @@ enum ParseError {
     DescriptorLengthTooSmall,
 }
 
+impl Display for ParseError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::ParseError::*;
+
+        match self {
+            GuestMemory(e) => write!(f, "bad guest memory address: {}", e),
+            CheckedOffset(addr, offset) => write!(f, "{}+{} would overflow a usize", addr, offset),
+            UnexpectedWriteOnlyDescriptor => write!(f, "unexpected write-only descriptor"),
+            UnexpectedReadOnlyDescriptor => write!(f, "unexpected read-only descriptor"),
+            DescriptorChainTooShort => write!(f, "descriptor chain too short"),
+            DescriptorLengthTooSmall => write!(f, "descriptor length too small"),
+        }
+    }
+}
+
 fn request_type(
     mem: &GuestMemory,
     desc_addr: GuestAddress,
@@ -214,6 +245,61 @@ enum ExecuteError {
     Unsupported(u32),
 }
 
+impl Display for ExecuteError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::ExecuteError::*;
+
+        match self {
+            Flush(e) => write!(f, "failed to flush: {}", e),
+            Read {
+                addr,
+                length,
+                sector,
+                guestmemerr,
+            } => write!(
+                f,
+                "failed to read {} bytes from address {} sector {}: {}",
+                length, addr, sector, guestmemerr,
+            ),
+            Seek { ioerr, sector } => write!(f, "failed to seek to sector {}: {}", sector, ioerr),
+            TimerFd(e) => write!(f, "{}", e),
+            Write {
+                addr,
+                length,
+                sector,
+                guestmemerr,
+            } => write!(
+                f,
+                "failed to write {} bytes to address {} sector {}: {}",
+                length, addr, sector, guestmemerr,
+            ),
+            DiscardWriteZeroes {
+                ioerr: Some(ioerr),
+                sector,
+                num_sectors,
+                flags,
+            } => write!(
+                f,
+                "failed to perform discard or write zeroes; sector={} num_sectors={} flags={}; {}",
+                sector, num_sectors, flags, ioerr,
+            ),
+            DiscardWriteZeroes {
+                ioerr: None,
+                sector,
+                num_sectors,
+                flags,
+            } => write!(
+                f,
+                "failed to perform discard or write zeroes; sector={} num_sectors={} flags={}",
+                sector, num_sectors, flags,
+            ),
+            ReadOnly { request_type } => write!(f, "read only; request_type={}", request_type),
+            OutOfRange => write!(f, "out of range"),
+            Unsupported(n) => write!(f, "unsupported ({})", n),
+        }
+    }
+}
+
 impl ExecuteError {
     fn status(&self) -> u8 {
         match self {
@@ -551,7 +637,7 @@ impl<T: DiskFile> Worker<T> {
                             VIRTIO_BLK_S_OK
                         }
                         Err(e) => {
-                            error!("failed executing disk request: {:?}", e);
+                            error!("failed executing disk request: {}", e);
                             len = 1; // 1 byte for the status
                             e.status()
                         }
@@ -563,7 +649,7 @@ impl<T: DiskFile> Worker<T> {
                         .unwrap();
                 }
                 Err(e) => {
-                    error!("failed processing available descriptor chain: {:?}", e);
+                    error!("failed processing available descriptor chain: {}", e);
                     len = 0;
                 }
             }
@@ -622,7 +708,7 @@ impl<T: DiskFile> Worker<T> {
         let mut flush_timer = match TimerFd::new() {
             Ok(t) => t,
             Err(e) => {
-                error!("Failed to create the flush timer: {:?}", e);
+                error!("Failed to create the flush timer: {}", e);
                 return;
             }
         };
@@ -642,7 +728,7 @@ impl<T: DiskFile> Worker<T> {
         {
             Ok(pc) => pc,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -651,7 +737,7 @@ impl<T: DiskFile> Worker<T> {
             let events = match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -662,17 +748,17 @@ impl<T: DiskFile> Worker<T> {
                 match event.token() {
                     Token::FlushTimer => {
                         if let Err(e) = self.disk_image.flush() {
-                            error!("Failed to flush the disk: {:?}", e);
+                            error!("Failed to flush the disk: {}", e);
                             break 'poll;
                         }
                         if let Err(e) = flush_timer.wait() {
-                            error!("Failed to clear flush timer: {:?}", e);
+                            error!("Failed to clear flush timer: {}", e);
                             break 'poll;
                         }
                     }
                     Token::QueueAvailable => {
                         if let Err(e) = queue_evt.read() {
-                            error!("failed reading queue EventFd: {:?}", e);
+                            error!("failed reading queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |=
@@ -682,7 +768,7 @@ impl<T: DiskFile> Worker<T> {
                         let req = match control_socket.recv() {
                             Ok(req) => req,
                             Err(e) => {
-                                error!("control socket failed recv: {:?}", e);
+                                error!("control socket failed recv: {}", e);
                                 break 'poll;
                             }
                         };
@@ -703,7 +789,7 @@ impl<T: DiskFile> Worker<T> {
                         };
 
                         if let Err(e) = control_socket.send(&resp) {
-                            error!("control socket failed send: {:?}", e);
+                            error!("control socket failed send: {}", e);
                             break 'poll;
                         }
                     }
@@ -860,7 +946,7 @@ impl<T: 'static + AsRawFd + DiskFile + Send> VirtioDevice for Block<T> {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed creating kill EventFd pair: {:?}", e);
+                error!("failed creating kill EventFd pair: {}", e);
                 return;
             }
         };
diff --git a/devices/src/virtio/gpu/backend.rs b/devices/src/virtio/gpu/backend.rs
index b8f98e4..fad8223 100644
--- a/devices/src/virtio/gpu/backend.rs
+++ b/devices/src/virtio/gpu/backend.rs
@@ -258,7 +258,7 @@ impl VirglResource for BackedBuffer {
                 Some(import_id)
             }
             Err(e) => {
-                error!("failed to import dmabuf for display: {:?}", e);
+                error!("failed to import dmabuf for display: {}", e);
                 None
             }
         }
@@ -292,13 +292,13 @@ impl VirglResource for BackedBuffer {
                 .map(|&(addr, len)| mem.get_slice(addr.offset(), len as u64).unwrap_or_default()),
         );
         if let Err(e) = res {
-            error!("failed to write to resource from guest memory: {:?}", e)
+            error!("failed to write to resource from guest memory: {}", e)
         }
     }
 
     fn read_to_volatile(&mut self, x: u32, y: u32, width: u32, height: u32, dst: VolatileSlice) {
         if let Err(e) = self.buffer.read_to_volatile(x, y, width, height, 0, dst) {
-            error!("failed to copy resource: {:?}", e);
+            error!("failed to copy resource: {}", e);
         }
     }
 }
@@ -356,7 +356,7 @@ impl Backend {
         let request = match resource_bridge.recv() {
             Ok(msg) => msg,
             Err(e) => {
-                error!("error receiving resource bridge request: {:?}", e);
+                error!("error receiving resource bridge request: {}", e);
                 return;
             }
         };
@@ -372,7 +372,7 @@ impl Backend {
         };
 
         if let Err(e) = resource_bridge.send(&response) {
-            error!("error sending resource bridge request: {:?}", e);
+            error!("error sending resource bridge request: {}", e);
         }
     }
 
@@ -442,7 +442,7 @@ impl Backend {
             if self.scanout_surface.is_none() {
                 match display.create_surface(None, DEFAULT_WIDTH, DEFAULT_HEIGHT) {
                     Ok(surface) => self.scanout_surface = Some(surface),
-                    Err(e) => error!("failed to create display surface: {:?}", e),
+                    Err(e) => error!("failed to create display surface: {}", e),
                 }
             }
             GpuResponse::OkNoData
@@ -591,7 +591,7 @@ impl Backend {
                 ) {
                     Ok(surface) => self.cursor_surface = Some(surface),
                     Err(e) => {
-                        error!("failed to create cursor surface: {:?}", e);
+                        error!("failed to create cursor surface: {}", e);
                         return GpuResponse::ErrUnspec;
                     }
                 }
@@ -613,7 +613,7 @@ impl Backend {
                     if let Err(e) =
                         buffer.read_to_volatile(0, 0, buffer.width(), buffer.height(), 0, fb)
                     {
-                        error!("failed to copy resource to cursor: {:?}", e);
+                        error!("failed to copy resource to cursor: {}", e);
                         return GpuResponse::ErrInvalidParameter;
                     }
                 }
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs
index 8da15f5..c8d4dcd 100644
--- a/devices/src/virtio/gpu/mod.rs
+++ b/devices/src/virtio/gpu/mod.rs
@@ -365,14 +365,14 @@ impl Frontend {
                                 Ok(data_mem) => {
                                     resp = self.process_gpu_command(mem, cmd, Some(data_mem))
                                 }
-                                Err(e) => debug!("ctrl queue invalid data descriptor: {:?}", e),
+                                Err(e) => debug!("ctrl queue invalid data descriptor: {}", e),
                             }
                         }
                         None => resp = self.process_gpu_command(mem, cmd, None),
                     }
                     gpu_cmd = Some(cmd);
                 }
-                Err(e) => debug!("ctrl queue decode error: {:?}", e),
+                Err(e) => debug!("ctrl queue decode error: {}", e),
             }
         }
         if resp.is_err() {
@@ -402,7 +402,7 @@ impl Frontend {
                 // fence is complete.
                 match resp.encode(flags, fence_id, ctx_id, ret_desc_mem) {
                     Ok(l) => len = l,
-                    Err(e) => debug!("ctrl queue response encode error: {:?}", e),
+                    Err(e) => debug!("ctrl queue response encode error: {}", e),
                 }
 
                 if flags & VIRTIO_GPU_FLAG_FENCE != 0 {
@@ -505,14 +505,14 @@ impl Worker {
         {
             Ok(pc) => pc,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
 
         if let Some(ref resource_bridge) = self.resource_bridge {
             if let Err(e) = poll_ctx.add(resource_bridge, Token::ResourceBridge) {
-                error!("failed to add resource bridge to PollContext: {:?}", e);
+                error!("failed to add resource bridge to PollContext: {}", e);
             }
         }
 
@@ -527,7 +527,7 @@ impl Worker {
             let events = match poll_ctx.wait_timeout(duration) {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -722,7 +722,7 @@ impl VirtioDevice for Gpu {
         let exit_evt = match self.exit_evt.try_clone() {
             Ok(e) => e,
             Err(e) => {
-                error!("error cloning exit eventfd: {:?}", e);
+                error!("error cloning exit eventfd: {}", e);
                 return;
             }
         };
@@ -730,7 +730,7 @@ impl VirtioDevice for Gpu {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("error creating kill EventFd pair: {:?}", e);
+                error!("error creating kill EventFd pair: {}", e);
                 return;
             }
         };
@@ -750,8 +750,8 @@ impl VirtioDevice for Gpu {
                     const UNDESIRED_CARDS: &[&str] = &["vgem", "pvr"];
                     let drm_card = match gpu_buffer::rendernode::open_device(UNDESIRED_CARDS) {
                         Ok(f) => f,
-                        Err(e) => {
-                            error!("failed to open card: {:?}", e);
+                        Err(()) => {
+                            error!("failed to open card");
                             return;
                         }
                     };
@@ -767,7 +767,7 @@ impl VirtioDevice for Gpu {
                     let display = match GpuDisplay::new(socket_path) {
                         Ok(c) => c,
                         Err(e) => {
-                            error!("failed to open display: {:?}", e);
+                            error!("failed to open display: {}", e);
                             return;
                         }
                     };
diff --git a/devices/src/virtio/gpu/protocol.rs b/devices/src/virtio/gpu/protocol.rs
index 8ed6b02..f0dcad8 100644
--- a/devices/src/virtio/gpu/protocol.rs
+++ b/devices/src/virtio/gpu/protocol.rs
@@ -2,7 +2,7 @@
 #![allow(non_camel_case_types)]
 
 use std::cmp::min;
-use std::fmt;
+use std::fmt::{self, Display};
 use std::marker::PhantomData;
 use std::mem::{size_of, size_of_val};
 use std::str::from_utf8;
@@ -493,6 +493,21 @@ pub enum GpuCommandDecodeError {
     InvalidType(u32),
 }
 
+impl Display for GpuCommandDecodeError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::GpuCommandDecodeError::*;
+
+        match self {
+            Memory(e) => write!(
+                f,
+                "command referenced an inaccessible area of memory: {}",
+                e,
+            ),
+            InvalidType(n) => write!(f, "invalid command type ({})", n),
+        }
+    }
+}
+
 impl From<VolatileMemoryError> for GpuCommandDecodeError {
     fn from(e: VolatileMemoryError) -> GpuCommandDecodeError {
         GpuCommandDecodeError::Memory(e)
@@ -625,6 +640,22 @@ pub enum GpuResponseEncodeError {
     TooManyPlanes(usize),
 }
 
+impl Display for GpuResponseEncodeError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::GpuResponseEncodeError::*;
+
+        match self {
+            Memory(e) => write!(
+                f,
+                "response was encoded to an inaccessible area of memory: {}",
+                e,
+            ),
+            TooManyDisplays(n) => write!(f, "{} is more displays than are valid", n),
+            TooManyPlanes(n) => write!(f, "{} is more planes than are valid", n),
+        }
+    }
+}
+
 impl From<VolatileMemoryError> for GpuResponseEncodeError {
     fn from(e: VolatileMemoryError) -> GpuResponseEncodeError {
         GpuResponseEncodeError::Memory(e)
diff --git a/devices/src/virtio/input/mod.rs b/devices/src/virtio/input/mod.rs
index 82c15c0..22ef168 100644
--- a/devices/src/virtio/input/mod.rs
+++ b/devices/src/virtio/input/mod.rs
@@ -19,6 +19,7 @@ use self::event_source::{input_event, EvdevEventSource, EventSource, SocketEvent
 use super::{Queue, VirtioDevice, INTERRUPT_STATUS_USED_RING, TYPE_INPUT};
 use std::cmp::min;
 use std::collections::BTreeMap;
+use std::fmt::{self, Display};
 use std::io::Read;
 use std::io::Write;
 use std::mem::size_of;
@@ -53,6 +54,28 @@ pub enum InputError {
 }
 pub type Result<T> = std::result::Result<T, InputError>;
 
+impl Display for InputError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::InputError::*;
+
+        match self {
+            EventsWriteError(e) => write!(f, "failed to write events to the source: {}", e),
+            EventsReadError(e) => write!(f, "failed to read events from the source: {}", e),
+            EvdevIdError(e) => write!(f, "failed to get id of event device: {}", e),
+            EvdevNameError(e) => write!(f, "failed to get name of event device: {}", e),
+            EvdevSerialError(e) => write!(f, "failed to get serial name of event device: {}", e),
+            EvdevPropertiesError(e) => write!(f, "failed to get properties of event device: {}", e),
+            EvdevEventTypesError(e) => {
+                write!(f, "failed to get event types supported by device: {}", e)
+            }
+            EvdevAbsInfoError(e) => {
+                write!(f, "failed to get axis information of event device: {}", e)
+            }
+            EvdevGrabError(e) => write!(f, "failed to grab event device: {}", e),
+        }
+    }
+}
+
 #[derive(Copy, Clone, Default, Debug)]
 #[repr(C)]
 pub struct virtio_input_device_ids {
@@ -405,7 +428,7 @@ impl<T: EventSource> Worker<T> {
                         // Read is guaranteed to succeed here, so the only possible failure would be
                         // writing outside the guest memory region, which would mean the address and
                         // length given in the queue descriptor are wrong.
-                        panic!("failed reading events into guest memory: {:?}", e);
+                        panic!("failed reading events into guest memory: {}", e);
                     }
                     used_desc_heads[used_count] = (avail_desc.index, len as u32);
                     used_count += 1;
@@ -457,7 +480,7 @@ impl<T: EventSource> Worker<T> {
         kill_evt: EventFd,
     ) {
         if let Err(e) = self.event_source.init() {
-            error!("failed initializing event source: {:?}", e);
+            error!("failed initializing event source: {}", e);
             return;
         }
 
@@ -490,7 +513,7 @@ impl<T: EventSource> Worker<T> {
         {
             Ok(poll_ctx) => poll_ctx,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -499,7 +522,7 @@ impl<T: EventSource> Worker<T> {
             let poll_events = match poll_ctx.wait() {
                 Ok(poll_events) => poll_events,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -509,23 +532,23 @@ impl<T: EventSource> Worker<T> {
                 match poll_event.token() {
                     Token::EventQAvailable => {
                         if let Err(e) = event_queue_evt_fd.read() {
-                            error!("failed reading event queue EventFd: {:?}", e);
+                            error!("failed reading event queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |= self.send_events();
                     }
                     Token::StatusQAvailable => {
                         if let Err(e) = status_queue_evt_fd.read() {
-                            error!("failed reading status queue EventFd: {:?}", e);
+                            error!("failed reading status queue EventFd: {}", e);
                             break 'poll;
                         }
                         match self.process_status_queue() {
                             Ok(b) => needs_interrupt |= b,
-                            Err(e) => error!("failed processing status events: {:?}", e),
+                            Err(e) => error!("failed processing status events: {}", e),
                         }
                     }
                     Token::InputEventsAvailable => match self.event_source.receive_events() {
-                        Err(e) => error!("error receiving events: {:?}", e),
+                        Err(e) => error!("error receiving events: {}", e),
                         Ok(_cnt) => needs_interrupt |= self.send_events(),
                     },
                     Token::InterruptResample => {
@@ -546,7 +569,7 @@ impl<T: EventSource> Worker<T> {
         }
 
         if let Err(e) = self.event_source.finalize() {
-            error!("failed finalizing event source: {:?}", e);
+            error!("failed finalizing event source: {}", e);
             return;
         }
     }
@@ -612,7 +635,7 @@ where
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed to create kill EventFd pair: {:?}", e);
+                error!("failed to create kill EventFd pair: {}", e);
                 return;
             }
         };
diff --git a/devices/src/virtio/net.rs b/devices/src/virtio/net.rs
index 84249ab..088c2b8 100644
--- a/devices/src/virtio/net.rs
+++ b/devices/src/virtio/net.rs
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 use std::cmp;
+use std::fmt::{self, Display};
 use std::mem;
 use std::net::Ipv4Addr;
 use std::os::unix::io::{AsRawFd, RawFd};
@@ -53,6 +54,26 @@ pub enum NetError {
     PollError(SysError),
 }
 
+impl Display for NetError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::NetError::*;
+
+        match self {
+            CreateKillEventFd(e) => write!(f, "failed to create kill eventfd: {}", e),
+            CreatePollContext(e) => write!(f, "failed to create poll context: {}", e),
+            CloneKillEventFd(e) => write!(f, "failed to clone kill eventfd: {}", e),
+            TapOpen(e) => write!(f, "failed to open tap device: {}", e),
+            TapSetIp(e) => write!(f, "failed to set tap IP: {}", e),
+            TapSetNetmask(e) => write!(f, "failed to set tap netmask: {}", e),
+            TapSetMacAddress(e) => write!(f, "failed to set tap mac address: {}", e),
+            TapSetOffload(e) => write!(f, "failed to set tap interface offload flags: {}", e),
+            TapSetVnetHdrSize(e) => write!(f, "failed to set vnet header size: {}", e),
+            TapEnable(e) => write!(f, "failed to enable tap interface: {}", e),
+            PollError(e) => write!(f, "error while polling for events: {}", e),
+        }
+    }
+}
+
 struct Worker<T: TapT> {
     mem: GuestMemory,
     rx_queue: Queue,
@@ -110,7 +131,7 @@ where
                             write_count += sz;
                         }
                         Err(e) => {
-                            warn!("net: rx: failed to write slice: {:?}", e);
+                            warn!("net: rx: failed to write slice: {}", e);
                             break;
                         }
                     };
@@ -156,7 +177,7 @@ where
                     // The tap device is nonblocking, so any error aside from EAGAIN is
                     // unexpected.
                     if e.raw_os_error().unwrap() != EAGAIN {
-                        warn!("net: rx: failed to read tap: {:?}", e);
+                        warn!("net: rx: failed to read tap: {}", e);
                     }
                     break;
                 }
@@ -188,7 +209,7 @@ where
                         read_count += sz;
                     }
                     Err(e) => {
-                        warn!("net: tx: failed to read slice: {:?}", e);
+                        warn!("net: tx: failed to read slice: {}", e);
                         break;
                     }
                 }
@@ -199,7 +220,7 @@ where
             match write_result {
                 Ok(_) => {}
                 Err(e) => {
-                    warn!("net: tx: error failed to write to tap: {:?}", e);
+                    warn!("net: tx: error failed to write to tap: {}", e);
                 }
             };
 
@@ -263,7 +284,7 @@ where
                     }
                     Token::RxQueue => {
                         if let Err(e) = rx_queue_evt.read() {
-                            error!("net: error reading rx queue EventFd: {:?}", e);
+                            error!("net: error reading rx queue EventFd: {}", e);
                             break 'poll;
                         }
                         // There should be a buffer available now to receive the frame into.
@@ -273,7 +294,7 @@ where
                     }
                     Token::TxQueue => {
                         if let Err(e) = tx_queue_evt.read() {
-                            error!("net: error reading tx queue EventFd: {:?}", e);
+                            error!("net: error reading tx queue EventFd: {}", e);
                             break 'poll;
                         }
                         self.process_tx();
@@ -453,7 +474,7 @@ where
                             let tx_queue_evt = queue_evts.remove(0);
                             let result = worker.run(rx_queue_evt, tx_queue_evt, kill_evt);
                             if let Err(e) = result {
-                                error!("net worker thread exited with error: {:?}", e);
+                                error!("net worker thread exited with error: {}", e);
                             }
                         });
 
diff --git a/devices/src/virtio/p9.rs b/devices/src/virtio/p9.rs
index 50ceedb..be461a0 100644
--- a/devices/src/virtio/p9.rs
+++ b/devices/src/virtio/p9.rs
@@ -60,36 +60,32 @@ impl error::Error for P9Error {
 
 impl fmt::Display for P9Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::P9Error::*;
+
         match self {
-            P9Error::TagTooLong(len) => write!(
+            TagTooLong(len) => write!(
                 f,
                 "P9 device tag is too long: len = {}, max = {}",
                 len,
                 ::std::u16::MAX
             ),
-            P9Error::RootNotAbsolute(buf) => write!(
+            RootNotAbsolute(buf) => write!(
                 f,
                 "P9 root directory is not absolute: root = {}",
                 buf.display()
             ),
-            P9Error::CreatePollContext(err) => write!(f, "failed to create PollContext: {:?}", err),
-            P9Error::PollError(err) => write!(f, "failed to poll events: {:?}", err),
-            P9Error::ReadQueueEventFd(err) => {
-                write!(f, "failed to read from virtio queue EventFd: {:?}", err)
-            }
-            P9Error::NoReadableDescriptors => {
-                write!(f, "request does not have any readable descriptors")
-            }
-            P9Error::NoWritableDescriptors => {
-                write!(f, "request does not have any writable descriptors")
-            }
-            P9Error::InvalidGuestAddress(addr, len) => write!(
+            CreatePollContext(err) => write!(f, "failed to create PollContext: {}", err),
+            PollError(err) => write!(f, "failed to poll events: {}", err),
+            ReadQueueEventFd(err) => write!(f, "failed to read from virtio queue EventFd: {}", err),
+            NoReadableDescriptors => write!(f, "request does not have any readable descriptors"),
+            NoWritableDescriptors => write!(f, "request does not have any writable descriptors"),
+            InvalidGuestAddress(addr, len) => write!(
                 f,
-                "descriptor contained invalid guest address range: address = {:?}, len = {}",
+                "descriptor contained invalid guest address range: address = {}, len = {}",
                 addr, len
             ),
-            P9Error::SignalUsedQueue(err) => write!(f, "failed to signal used queue: {:?}", err),
-            P9Error::Internal(err) => write!(f, "P9 internal server error: {}", err),
+            SignalUsedQueue(err) => write!(f, "failed to signal used queue: {}", err),
+            Internal(err) => write!(f, "P9 internal server error: {}", err),
         }
     }
 }
@@ -402,7 +398,7 @@ impl VirtioDevice for P9 {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed creating kill EventFd pair: {:?}", e);
+                error!("failed creating kill EventFd pair: {}", e);
                 return;
             }
         };
@@ -427,7 +423,7 @@ impl VirtioDevice for P9 {
 
             match worker_result {
                 Ok(worker) => self.worker = Some(worker),
-                Err(e) => error!("failed to spawn virtio_9p worker: {:?}", e),
+                Err(e) => error!("failed to spawn virtio_9p worker: {}", e),
             }
         }
     }
@@ -437,7 +433,7 @@ impl Drop for P9 {
     fn drop(&mut self) {
         if let Some(kill_evt) = self.kill_evt.take() {
             if let Err(e) = kill_evt.write(1) {
-                error!("failed to kill virtio_9p worker thread: {:?}", e);
+                error!("failed to kill virtio_9p worker thread: {}", e);
                 return;
             }
 
diff --git a/devices/src/virtio/rng.rs b/devices/src/virtio/rng.rs
index 96d0d4f..7b3d9f7 100644
--- a/devices/src/virtio/rng.rs
+++ b/devices/src/virtio/rng.rs
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 use std;
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::io;
 use std::os::unix::io::{AsRawFd, RawFd};
@@ -24,6 +25,16 @@ pub enum RngError {
 }
 pub type Result<T> = std::result::Result<T, RngError>;
 
+impl Display for RngError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::RngError::*;
+
+        match self {
+            AccessingRandomDev(e) => write!(f, "failed to access /dev/urandom: {}", e),
+        }
+    }
+}
+
 struct Worker {
     queue: Queue,
     mem: GuestMemory,
@@ -92,7 +103,7 @@ impl Worker {
         {
             Ok(pc) => pc,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -101,7 +112,7 @@ impl Worker {
             let events = match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -111,7 +122,7 @@ impl Worker {
                 match event.token() {
                     Token::QueueAvailable => {
                         if let Err(e) = queue_evt.read() {
-                            error!("failed reading queue EventFd: {:?}", e);
+                            error!("failed reading queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |= self.process_queue();
@@ -193,7 +204,7 @@ impl VirtioDevice for Rng {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed to create kill EventFd pair: {:?}", e);
+                error!("failed to create kill EventFd pair: {}", e);
                 return;
             }
         };
diff --git a/devices/src/virtio/tpm.rs b/devices/src/virtio/tpm.rs
index 66574e2..0cc2e91 100644
--- a/devices/src/virtio/tpm.rs
+++ b/devices/src/virtio/tpm.rs
@@ -133,7 +133,7 @@ impl Worker {
         {
             Ok(pc) => pc,
             Err(e) => {
-                error!("vtpm failed creating PollContext: {:?}", e);
+                error!("vtpm failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -142,7 +142,7 @@ impl Worker {
             let events = match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("vtpm failed polling for events: {:?}", e);
+                    error!("vtpm failed polling for events: {}", e);
                     break;
                 }
             };
@@ -152,7 +152,7 @@ impl Worker {
                 match event.token() {
                     Token::QueueAvailable => {
                         if let Err(e) = queue_evt.read() {
-                            error!("vtpm failed reading queue EventFd: {:?}", e);
+                            error!("vtpm failed reading queue EventFd: {}", e);
                             break 'poll;
                         }
                         needs_interrupt |= self.process_queue();
@@ -231,7 +231,7 @@ impl VirtioDevice for Tpm {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(err) => {
-                error!("vtpm failed to create kill EventFd pair: {:?}", err);
+                error!("vtpm failed to create kill EventFd pair: {}", err);
                 return;
             }
         };
diff --git a/devices/src/virtio/vhost/mod.rs b/devices/src/virtio/vhost/mod.rs
index 0fe15df..f96bebb 100644
--- a/devices/src/virtio/vhost/mod.rs
+++ b/devices/src/virtio/vhost/mod.rs
@@ -5,6 +5,7 @@
 //! Implements vhost-based virtio devices.
 
 use std;
+use std::fmt::{self, Display};
 
 use net_util::Error as TapError;
 use sys_util::Error as SysError;
@@ -74,3 +75,38 @@ pub enum Error {
 }
 
 pub type Result<T> = std::result::Result<T, Error>;
+
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            CreateKillEventFd(e) => write!(f, "failed to create kill eventfd: {}", e),
+            CreatePollContext(e) => write!(f, "failed to create poll context: {}", e),
+            CloneKillEventFd(e) => write!(f, "failed to clone kill eventfd: {}", e),
+            PollError(e) => write!(f, "failed polling for events: {}", e),
+            TapOpen(e) => write!(f, "failed to open tap device: {}", e),
+            TapSetIp(e) => write!(f, "failed to set tap IP: {}", e),
+            TapSetNetmask(e) => write!(f, "failed to set tap netmask: {}", e),
+            TapSetMacAddress(e) => write!(f, "failed to set tap mac address: {}", e),
+            TapSetOffload(e) => write!(f, "failed to set tap interface offload flags: {}", e),
+            TapSetVnetHdrSize(e) => write!(f, "failed to set vnet header size: {}", e),
+            TapEnable(e) => write!(f, "failed to enable tap interface: {}", e),
+            VhostOpen(e) => write!(f, "failed to open vhost device: {}", e),
+            VhostSetOwner(e) => write!(f, "failed to set owner: {}", e),
+            VhostGetFeatures(e) => write!(f, "failed to get features: {}", e),
+            VhostSetFeatures(e) => write!(f, "failed to set features: {}", e),
+            VhostSetMemTable(e) => write!(f, "failed to set mem table: {}", e),
+            VhostSetVringNum(e) => write!(f, "failed to set vring num: {}", e),
+            VhostSetVringAddr(e) => write!(f, "failed to set vring addr: {}", e),
+            VhostSetVringBase(e) => write!(f, "failed to set vring base: {}", e),
+            VhostSetVringCall(e) => write!(f, "failed to set vring call: {}", e),
+            VhostSetVringKick(e) => write!(f, "failed to set vring kick: {}", e),
+            VhostNetSetBackend(e) => write!(f, "net set backend failed: {}", e),
+            VhostVsockSetCid(e) => write!(f, "failed to set CID for guest: {}", e),
+            VhostVsockStart(e) => write!(f, "failed to start vhost-vsock driver: {}", e),
+            VhostIrqCreate(e) => write!(f, "failed to create vhost eventfd: {}", e),
+            VhostIrqRead(e) => write!(f, "failed to read vhost eventfd: {}", e),
+        }
+    }
+}
diff --git a/devices/src/virtio/vhost/net.rs b/devices/src/virtio/vhost/net.rs
index 4727bbc..b8e518d 100644
--- a/devices/src/virtio/vhost/net.rs
+++ b/devices/src/virtio/vhost/net.rs
@@ -202,7 +202,7 @@ where
                                 let result =
                                     worker.run(queue_evts, QUEUE_SIZES, kill_evt, activate_vqs);
                                 if let Err(e) = result {
-                                    error!("net worker thread exited with error: {:?}", e);
+                                    error!("net worker thread exited with error: {}", e);
                                 }
                             });
 
diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs
index 332f7c6..4d43825 100644
--- a/devices/src/virtio/wl.rs
+++ b/devices/src/virtio/wl.rs
@@ -1163,14 +1163,14 @@ impl WlState {
         let events = match self.poll_ctx.wait_timeout(Duration::from_secs(0)) {
             Ok(v) => v.to_owned(),
             Err(e) => {
-                error!("failed polling for vfd evens: {:?}", e);
+                error!("failed polling for vfd evens: {}", e);
                 return;
             }
         };
 
         for event in events.as_ref().iter_readable() {
             if let Err(e) = self.recv(event.token()) {
-                error!("failed to recv from vfd: {:?}", e)
+                error!("failed to recv from vfd: {}", e)
             }
         }
 
@@ -1179,7 +1179,7 @@ impl WlState {
                 let vfd_id = event.token();
                 if let Some(fd) = self.vfds.get(&vfd_id).and_then(|vfd| vfd.poll_fd()) {
                     if let Err(e) = self.poll_ctx.delete(fd) {
-                        warn!("failed to remove hungup vfd from poll context: {:?}", e);
+                        warn!("failed to remove hungup vfd from poll context: {}", e);
                     }
                 }
                 self.in_queue.push_back((vfd_id, WlRecv::Hup));
@@ -1263,7 +1263,7 @@ impl WlState {
                         .unwrap()
                         .send(&ResourceRequest::GetResource { id })
                     {
-                        error!("error sending resource bridge request: {:?}", e);
+                        error!("error sending resource bridge request: {}", e);
                         return Ok(WlResp::InvalidId);
                     }
                     match self.resource_bridge.as_ref().unwrap().recv() {
@@ -1276,7 +1276,7 @@ impl WlState {
                             return Ok(WlResp::InvalidId);
                         }
                         Err(e) => {
-                            error!("error receiving resource bridge response: {:?}", e);
+                            error!("error receiving resource bridge response: {}", e);
                             // If there was an error with the resource bridge, it can no longer be
                             // trusted to continue to function.
                             self.resource_bridge = None;
@@ -1538,7 +1538,7 @@ impl Worker {
             }) {
             Ok(pc) => pc,
             Err(e) => {
-                error!("failed creating PollContext: {:?}", e);
+                error!("failed creating PollContext: {}", e);
                 return;
             }
         };
@@ -1548,7 +1548,7 @@ impl Worker {
             let events = match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed polling for events: {:?}", e);
+                    error!("failed polling for events: {}", e);
                     break;
                 }
             };
@@ -1654,7 +1654,7 @@ impl Worker {
                             len
                         }
                         Err(e) => {
-                            error!("failed to encode response to descriptor chain: {:?}", e);
+                            error!("failed to encode response to descriptor chain: {}", e);
                             0
                         }
                     };
@@ -1756,7 +1756,7 @@ impl VirtioDevice for Wl {
         let (self_kill_evt, kill_evt) = match EventFd::new().and_then(|e| Ok((e.try_clone()?, e))) {
             Ok(v) => v,
             Err(e) => {
-                error!("failed creating kill EventFd pair: {:?}", e);
+                error!("failed creating kill EventFd pair: {}", e);
                 return;
             }
         };
diff --git a/gpu_buffer/src/lib.rs b/gpu_buffer/src/lib.rs
index be8fb72..112b086 100644
--- a/gpu_buffer/src/lib.rs
+++ b/gpu_buffer/src/lib.rs
@@ -78,7 +78,7 @@ impl fmt::Display for Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match *self {
             Error::GbmFailed => write!(f, "internal GBM failure"),
-            Error::ExportFailed(e) => write!(f, "export failed: {:?}", e),
+            Error::ExportFailed(e) => write!(f, "export failed: {}", e),
             Error::MapFailed => write!(f, "map failed"),
             Error::CheckedArithmetic {
                 field1: (label1, value1),
diff --git a/gpu_display/src/lib.rs b/gpu_display/src/lib.rs
index 6b93bbc..01cef5e 100644
--- a/gpu_display/src/lib.rs
+++ b/gpu_display/src/lib.rs
@@ -12,6 +12,7 @@ mod dwl;
 use std::cell::Cell;
 use std::collections::HashMap;
 use std::ffi::{CStr, CString};
+use std::fmt::{self, Display};
 use std::os::unix::io::{AsRawFd, RawFd};
 use std::path::Path;
 use std::ptr::null_mut;
@@ -45,6 +46,23 @@ pub enum GpuDisplayError {
     InvalidPath,
 }
 
+impl Display for GpuDisplayError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::GpuDisplayError::*;
+
+        match self {
+            Allocate => write!(f, "internal allocation failed"),
+            Connect => write!(f, "failed to connect to compositor"),
+            CreateShm(e) => write!(f, "failed to create shared memory: {}", e),
+            SetSize(e) => write!(f, "failed to set size of shared memory: {}", e),
+            CreateSurface => write!(f, "failed to crate surface on the compositor"),
+            FailedImport => write!(f, "failed to import a buffer to the compositor"),
+            InvalidSurfaceId => write!(f, "invalid surface ID"),
+            InvalidPath => write!(f, "invalid path"),
+        }
+    }
+}
+
 struct DwlContext(*mut dwl_context);
 impl Drop for DwlContext {
     fn drop(&mut self) {
diff --git a/io_jail/src/lib.rs b/io_jail/src/lib.rs
index 53c6533..b56924d 100644
--- a/io_jail/src/lib.rs
+++ b/io_jail/src/lib.rs
@@ -75,8 +75,10 @@ impl fmt::Display for Error {
         match self {
             Error::BindMount { src, dst, errno } => write!(
                 f,
-                "failed to accept bind mount {:?} -> {:?}: {}",
-                src, dst, errno
+                "failed to accept bind mount {} -> {}: {}",
+                src.display(),
+                dst.display(),
+                io::Error::from_raw_os_error(*errno),
             ),
             Error::Mount {
                 errno,
@@ -87,9 +89,14 @@ impl fmt::Display for Error {
                 data,
             } => write!(
                 f,
-                "failed to accept mount {:?} -> {:?} of type {:?} with flags 0x{:x} \
+                "failed to accept mount {} -> {} of type {:?} with flags 0x{:x} \
                  and data {:?}: {}",
-                src, dest, fstype, flags, data, errno
+                src.display(),
+                dest.display(),
+                fstype,
+                flags,
+                data,
+                io::Error::from_raw_os_error(*errno),
             ),
             Error::CheckingMultiThreaded(e) => write!(
                 f,
@@ -101,28 +108,39 @@ impl fmt::Display for Error {
             Error::ForkingWhileMultiThreaded => {
                 write!(f, "Attempt to call fork() while multithreaded")
             }
-            Error::SeccompPath(p) => write!(f, "missing seccomp policy path: {:?}", p),
-            Error::StrToCString(s) => write!(f, "failed to convert string into CString: {:?}", s),
-            Error::PathToCString(s) => write!(f, "failed to convert path into CString: {:?}", s),
+            Error::SeccompPath(p) => write!(f, "missing seccomp policy path: {}", p.display()),
+            Error::StrToCString(s) => write!(f, "failed to convert string into CString: {}", s),
+            Error::PathToCString(s) => {
+                write!(f, "failed to convert path into CString: {}", s.display())
+            }
             Error::DupDevNull(errno) => write!(
                 f,
                 "failed to call dup2 to set stdin, stdout, or stderr to /dev/null: {}",
-                errno
+                io::Error::from_raw_os_error(*errno),
             ),
             Error::OpenDevNull(e) => write!(
                 f,
                 "fail to open /dev/null for setting FDs 0, 1, or 2: {}",
-                e
+                e,
+            ),
+            Error::SetAltSyscallTable { name, errno } => write!(
+                f,
+                "failed to set alt-syscall table {}: {}",
+                name,
+                io::Error::from_raw_os_error(*errno),
+            ),
+            Error::SettingChrootDirectory(errno, p) => write!(
+                f,
+                "failed to set chroot {}: {}",
+                p.display(),
+                io::Error::from_raw_os_error(*errno),
+            ),
+            Error::SettingPivotRootDirectory(errno, p) => write!(
+                f,
+                "failed to set pivot root {}: {}",
+                p.display(),
+                io::Error::from_raw_os_error(*errno),
             ),
-            Error::SetAltSyscallTable { name, errno } => {
-                write!(f, "failed to set alt-syscall table {:?}: {}", name, errno)
-            }
-            Error::SettingChrootDirectory(errno, p) => {
-                write!(f, "failed to set chroot {:?}: {}", p, errno)
-            }
-            Error::SettingPivotRootDirectory(errno, p) => {
-                write!(f, "failed to set pivot root {:?}: {}", p, errno)
-            }
             Error::ReadFdDirEntry(e) => {
                 write!(f, "failed to read an entry in /proc/self/fd: {}", e)
             }
diff --git a/msg_socket/src/msg_on_socket.rs b/msg_socket/src/msg_on_socket.rs
index c6e4413..493c57c 100644
--- a/msg_socket/src/msg_on_socket.rs
+++ b/msg_socket/src/msg_on_socket.rs
@@ -4,6 +4,7 @@
 
 use data_model::*;
 use std;
+use std::fmt::{self, Display};
 use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
 use std::result;
 use sys_util::{Error as SysError, EventFd};
@@ -38,6 +39,23 @@ pub enum MsgError {
 
 pub type MsgResult<T> = result::Result<T, MsgError>;
 
+impl Display for MsgError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::MsgError::*;
+
+        match self {
+            Send(e) => write!(f, "failed to send request or response: {}", e),
+            Recv(e) => write!(f, "failed to receive request or response: {}", e),
+            InvalidType => write!(f, "invalid type"),
+            BadRecvSize(n) => write!(f, "wrong amount of data received; expected {} bytes", n),
+            ExpectFd => write!(f, "missing associated file descriptor for request"),
+            NotExpectFd => write!(f, "unexpected file descriptor is unused"),
+            WrongFdBufferSize => write!(f, "fd buffer size too small"),
+            WrongMsgBufferSize => write!(f, "msg buffer size too small"),
+        }
+    }
+}
+
 /// A msg that could be serialized to and deserialize from array in little endian.
 ///
 /// For structs, we always have fixed size of bytes and fixed count of fds.
diff --git a/net_util/src/lib.rs b/net_util/src/lib.rs
index 4dfcd39..790fbc3 100644
--- a/net_util/src/lib.rs
+++ b/net_util/src/lib.rs
@@ -6,7 +6,7 @@ extern crate libc;
 extern crate net_sys;
 extern crate sys_util;
 
-use std::fmt;
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::io::{Read, Result as IoResult, Write};
 use std::mem;
@@ -34,6 +34,19 @@ pub enum Error {
 }
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            CreateSocket(e) => write!(f, "failed to create a socket: {}", e),
+            OpenTun(e) => write!(f, "failed to open /dev/net/tun: {}", e),
+            CreateTap(e) => write!(f, "failed to create tap interface: {}", e),
+            IoctlError(e) => write!(f, "ioctl failed: {}", e),
+        }
+    }
+}
+
 impl Error {
     pub fn sys_error(&self) -> SysError {
         match *self {
@@ -92,7 +105,7 @@ impl fmt::Display for MacAddressError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match *self {
             MacAddressError::InvalidNumOctets(n) => write!(f, "invalid number of octets: {}", n),
-            MacAddressError::ParseOctet(ref e) => write!(f, "failed to parse octet: {:?}", e),
+            MacAddressError::ParseOctet(ref e) => write!(f, "failed to parse octet: {}", e),
         }
     }
 }
@@ -636,7 +649,7 @@ mod tests {
             // We won't have permission in test environments; allow that
             Ok(_t) => {}
             Err(Error::IoctlError(ref e)) if e.errno() == EPERM => {}
-            Err(e) => panic!("Unexpected Error:\n{:?}", e),
+            Err(e) => panic!("Unexpected Error:\n{}", e),
         }
     }
 }
diff --git a/qcow/src/qcow.rs b/qcow/src/qcow.rs
index cba4e06..23aefd6 100644
--- a/qcow/src/qcow.rs
+++ b/qcow/src/qcow.rs
@@ -19,6 +19,7 @@ use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};
 use libc::{EINVAL, ENOSPC, ENOTSUP};
 
 use std::cmp::min;
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::io::{self, Read, Seek, SeekFrom, Write};
 use std::mem::size_of;
@@ -61,6 +62,45 @@ pub enum Error {
 }
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            BackingFilesNotSupported => write!(f, "backing files not supported"),
+            CompressedBlocksNotSupported => write!(f, "compressed blocks not supported"),
+            GettingFileSize(e) => write!(f, "failed to get file size: {}", e),
+            GettingRefcount(e) => write!(f, "failed to get refcount: {}", e),
+            EvictingCache(e) => write!(f, "failed to evict cache: {}", e),
+            InvalidClusterIndex => write!(f, "invalid cluster index"),
+            InvalidClusterSize => write!(f, "invalid cluster size"),
+            InvalidIndex => write!(f, "invalid index"),
+            InvalidL1TableOffset => write!(f, "invalid L1 table offset"),
+            InvalidMagic => write!(f, "invalid magic"),
+            InvalidOffset(_) => write!(f, "invalid offset"),
+            InvalidRefcountTableOffset => write!(f, "invalid refcount table offset"),
+            InvalidRefcountTableSize => write!(f, "invalid refcount table size"),
+            NoFreeClusters => write!(f, "no free clusters"),
+            NoRefcountClusters => write!(f, "no refcount clusters"),
+            OpeningFile(e) => write!(f, "failed to open file: {}", e),
+            ReadingData(e) => write!(f, "failed to read data: {}", e),
+            ReadingHeader(e) => write!(f, "failed to read header: {}", e),
+            ReadingPointers(e) => write!(f, "failed to read pointers: {}", e),
+            ReadingRefCounts(e) => write!(f, "failed to read ref counts: {}", e),
+            ReadingRefCountBlock(e) => write!(f, "failed to read ref count block: {}", e),
+            RebuildingRefCounts(e) => write!(f, "failed to rebuild ref counts: {}", e),
+            SeekingFile(e) => write!(f, "failed to seek file: {}", e),
+            SettingFileSize(e) => write!(f, "failed to set file size: {}", e),
+            SettingRefcountRefcount(e) => write!(f, "failed to set refcount refcount: {}", e),
+            SizeTooSmallForNumberOfClusters => write!(f, "size too small for number of clusters"),
+            WritingHeader(e) => write!(f, "failed to write header: {}", e),
+            UnsupportedRefcountOrder => write!(f, "unsupported refcount order"),
+            UnsupportedVersion(v) => write!(f, "unsupported version: {}", v),
+            WritingData(e) => write!(f, "failed to write data: {}", e),
+        }
+    }
+}
+
 pub enum ImageType {
     Raw,
     Qcow2,
diff --git a/qcow/src/refcount.rs b/qcow/src/refcount.rs
index a64d218..e5b4e73 100644
--- a/qcow/src/refcount.rs
+++ b/qcow/src/refcount.rs
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 use std;
+use std::fmt::{self, Display};
 use std::io;
 
 use libc::EINVAL;
@@ -26,6 +27,26 @@ pub enum Error {
 
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            EvictingRefCounts(e) => write!(
+                f,
+                "failed to write a refblock from the cache to disk: {}",
+                e
+            ),
+            InvalidIndex => write!(f, "address requested is not within the range of the disk"),
+            NeedCluster(addr) => write!(f, "cluster with addr={} needs to be read", addr),
+            NeedNewCluster => write!(f, "new cluster needs to be allocated for refcounts"),
+            ReadingRefCounts(e) => {
+                write!(f, "failed to read the file into the refcount cache: {}", e)
+            }
+        }
+    }
+}
+
 /// Represents the refcount entries for an open qcow file.
 #[derive(Debug)]
 pub struct RefCount {
diff --git a/src/linux.rs b/src/linux.rs
index 762b882..0391f9d 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -105,39 +105,44 @@ pub enum Error {
 impl fmt::Display for Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
-            Error::BalloonDeviceNew(e) => write!(f, "failed to create balloon: {:?}", e),
-            Error::BlockDeviceNew(e) => write!(f, "failed to create block device: {:?}", e),
-            Error::BlockSignal(e) => write!(f, "failed to block signal: {:?}", e),
-            Error::BuildingVm(e) => write!(f, "The architecture failed to build the vm: {:?}", e),
-            Error::CloneEventFd(e) => write!(f, "failed to clone eventfd: {:?}", e),
-            Error::CreateEventFd(e) => write!(f, "failed to create eventfd: {:?}", e),
-            Error::CreatePollContext(e) => write!(f, "failed to create poll context: {:?}", e),
-            Error::CreateSignalFd(e) => write!(f, "failed to create signalfd: {:?}", e),
+            Error::BalloonDeviceNew(e) => write!(f, "failed to create balloon: {}", e),
+            Error::BlockDeviceNew(e) => write!(f, "failed to create block device: {}", e),
+            Error::BlockSignal(e) => write!(f, "failed to block signal: {}", e),
+            Error::BuildingVm(e) => write!(f, "The architecture failed to build the vm: {}", e),
+            Error::CloneEventFd(e) => write!(f, "failed to clone eventfd: {}", e),
+            Error::CreateEventFd(e) => write!(f, "failed to create eventfd: {}", e),
+            Error::CreatePollContext(e) => write!(f, "failed to create poll context: {}", e),
+            Error::CreateSignalFd(e) => write!(f, "failed to create signalfd: {}", e),
             Error::CreateSocket(e) => write!(f, "failed to create socket: {}", e),
-            Error::CreateTapDevice(e) => write!(f, "failed to create tap device: {:?}", e),
+            Error::CreateTapDevice(e) => write!(f, "failed to create tap device: {}", e),
             Error::CreateTimerFd(e) => write!(f, "failed to create timerfd: {}", e),
-            Error::DetectImageType(e) => write!(f, "failed to detect disk image type: {:?}", e),
+            Error::DetectImageType(e) => write!(f, "failed to detect disk image type: {}", e),
             Error::DeviceJail(e) => write!(f, "failed to jail device: {}", e),
             Error::DevicePivotRoot(e) => write!(f, "failed to pivot root device: {}", e),
             Error::Disk(e) => write!(f, "failed to load disk image: {}", e),
-            Error::DiskImageLock(e) => write!(f, "failed to lock disk image: {:?}", e),
+            Error::DiskImageLock(e) => write!(f, "failed to lock disk image: {}", e),
             Error::InvalidFdPath => write!(f, "failed parsing a /proc/self/fd/*"),
             Error::InvalidWaylandPath => {
                 write!(f, "wayland socket path has no parent or file name")
             }
-            Error::NetDeviceNew(e) => write!(f, "failed to set up virtio networking: {:?}", e),
+            Error::NetDeviceNew(e) => write!(f, "failed to set up virtio networking: {}", e),
             Error::NoVarEmpty => write!(f, "/var/empty doesn't exist, can't jail devices."),
-            Error::OpenInitrd(p, e) => write!(f, "failed to open initrd {:?}: {}", p, e),
-            Error::OpenKernel(p, e) => write!(f, "failed to open kernel image {:?}: {}", p, e),
-            Error::OpenAndroidFstab(ref p, ref e) => {
-                write!(f, "failed to open android fstab file {:?}: {}", p, e)
+            Error::OpenInitrd(p, e) => write!(f, "failed to open initrd {}: {}", p.display(), e),
+            Error::OpenKernel(p, e) => {
+                write!(f, "failed to open kernel image {}: {}", p.display(), e)
             }
+            Error::OpenAndroidFstab(ref p, ref e) => write!(
+                f,
+                "failed to open android fstab file {}: {}",
+                p.display(),
+                e
+            ),
             Error::P9DeviceNew(e) => write!(f, "failed to create 9p device: {}", e),
-            Error::PollContextAdd(e) => write!(f, "failed to add fd to poll context: {:?}", e),
+            Error::PollContextAdd(e) => write!(f, "failed to add fd to poll context: {}", e),
             Error::PollContextDelete(e) => {
-                write!(f, "failed to remove fd from poll context: {:?}", e)
+                write!(f, "failed to remove fd from poll context: {}", e)
             }
-            Error::QcowDeviceCreate(e) => write!(f, "failed to read qcow formatted file {:?}", e),
+            Error::QcowDeviceCreate(e) => write!(f, "failed to read qcow formatted file {}", e),
             Error::ReadLowmemAvailable(e) => write!(
                 f,
                 "failed to read /sys/kernel/mm/chromeos-low_mem/available: {}",
@@ -148,32 +153,30 @@ impl fmt::Display for Error {
                 "failed to read /sys/kernel/mm/chromeos-low_mem/margin: {}",
                 e
             ),
-            Error::RegisterBalloon(e) => write!(f, "error registering balloon device: {:?}", e),
-            Error::RegisterBlock(e) => write!(f, "error registering block device: {:?}", e),
-            Error::RegisterGpu(e) => write!(f, "error registering gpu device: {:?}", e),
-            Error::RegisterNet(e) => write!(f, "error registering net device: {:?}", e),
-            Error::RegisterP9(e) => write!(f, "error registering 9p device: {:?}", e),
-            Error::RegisterRng(e) => write!(f, "error registering rng device: {:?}", e),
-            Error::RegisterSignalHandler(e) => {
-                write!(f, "error registering signal handler: {:?}", e)
-            }
+            Error::RegisterBalloon(e) => write!(f, "error registering balloon device: {}", e),
+            Error::RegisterBlock(e) => write!(f, "error registering block device: {}", e),
+            Error::RegisterGpu(e) => write!(f, "error registering gpu device: {}", e),
+            Error::RegisterNet(e) => write!(f, "error registering net device: {}", e),
+            Error::RegisterP9(e) => write!(f, "error registering 9p device: {}", e),
+            Error::RegisterRng(e) => write!(f, "error registering rng device: {}", e),
+            Error::RegisterSignalHandler(e) => write!(f, "error registering signal handler: {}", e),
             Error::RegisterWayland(e) => write!(f, "error registering wayland device: {}", e),
             Error::ResetTimerFd(e) => write!(f, "failed to reset timerfd: {}", e),
-            Error::RngDeviceNew(e) => write!(f, "failed to set up rng: {:?}", e),
-            Error::InputDeviceNew(ref e) => write!(f, "failed to set up input device: {:?}", e),
-            Error::InputEventsOpen(ref e) => write!(f, "failed to open event device: {:?}", e),
+            Error::RngDeviceNew(e) => write!(f, "failed to set up rng: {}", e),
+            Error::InputDeviceNew(ref e) => write!(f, "failed to set up input device: {}", e),
+            Error::InputEventsOpen(ref e) => write!(f, "failed to open event device: {}", e),
             Error::SettingGidMap(e) => write!(f, "error setting GID map: {}", e),
             Error::SettingUidMap(e) => write!(f, "error setting UID map: {}", e),
-            Error::SignalFd(e) => write!(f, "failed to read signal fd: {:?}", e),
-            Error::SpawnVcpu(e) => write!(f, "failed to spawn VCPU thread: {:?}", e),
-            Error::TimerFd(e) => write!(f, "failed to read timer fd: {:?}", e),
-            Error::ValidateRawFd(e) => write!(f, "failed to validate raw fd: {:?}", e),
-            Error::VhostNetDeviceNew(e) => write!(f, "failed to set up vhost networking: {:?}", e),
+            Error::SignalFd(e) => write!(f, "failed to read signal fd: {}", e),
+            Error::SpawnVcpu(e) => write!(f, "failed to spawn VCPU thread: {}", e),
+            Error::TimerFd(e) => write!(f, "failed to read timer fd: {}", e),
+            Error::ValidateRawFd(e) => write!(f, "failed to validate raw fd: {}", e),
+            Error::VhostNetDeviceNew(e) => write!(f, "failed to set up vhost networking: {}", e),
             Error::VhostVsockDeviceNew(e) => {
-                write!(f, "failed to set up virtual socket device: {:?}", e)
+                write!(f, "failed to set up virtual socket device: {}", e)
             }
             Error::VirtioPciDev(e) => write!(f, "failed to create virtio pci dev: {}", e),
-            Error::WaylandDeviceNew(e) => write!(f, "failed to create wayland device: {:?}", e),
+            Error::WaylandDeviceNew(e) => write!(f, "failed to create wayland device: {}", e),
             Error::LoadKernel(e) => write!(f, "failed to load kernel: {}", e),
         }
     }
@@ -345,7 +348,7 @@ fn create_virtio_devs(
                 });
             }
             Err(e) => {
-                error!("failed configuring virtio trackpad: {:?}", e);
+                error!("failed configuring virtio trackpad: {}", e);
                 return Err(e);
             }
         }
@@ -368,7 +371,7 @@ fn create_virtio_devs(
                 });
             }
             Err(e) => {
-                error!("failed configuring virtio mouse: {:?}", e);
+                error!("failed configuring virtio mouse: {}", e);
                 return Err(e);
             }
         }
@@ -391,7 +394,7 @@ fn create_virtio_devs(
                 });
             }
             Err(e) => {
-                error!("failed configuring virtio keyboard: {:?}", e);
+                error!("failed configuring virtio keyboard: {}", e);
                 return Err(e);
             }
         }
@@ -554,14 +557,14 @@ fn create_virtio_devs(
                     let crosvm_uid = match get_user_id(&crosvm_user_group) {
                         Ok(u) => u,
                         Err(e) => {
-                            warn!("falling back to current user id for gpu: {:?}", e);
+                            warn!("falling back to current user id for gpu: {}", e);
                             geteuid()
                         }
                     };
                     let crosvm_gid = match get_group_id(&crosvm_user_group) {
                         Ok(u) => u,
                         Err(e) => {
-                            warn!("falling back to current group id for gpu: {:?}", e);
+                            warn!("falling back to current group id for gpu: {}", e);
                             getegid()
                         }
                     };
@@ -632,14 +635,14 @@ fn create_virtio_devs(
             let crosvm_uid = match get_user_id(&crosvm_user_group) {
                 Ok(u) => u,
                 Err(e) => {
-                    warn!("falling back to current user id for Wayland: {:?}", e);
+                    warn!("falling back to current user id for Wayland: {}", e);
                     geteuid()
                 }
             };
             let crosvm_gid = match get_group_id(&crosvm_user_group) {
                 Ok(u) => u,
                 Err(e) => {
-                    warn!("falling back to current group id for Wayland: {:?}", e);
+                    warn!("falling back to current group id for Wayland: {}", e);
                     getegid()
                 }
             };
@@ -680,14 +683,14 @@ fn create_virtio_devs(
     let chronos_uid = match get_user_id(&chronos_user_group) {
         Ok(u) => u,
         Err(e) => {
-            warn!("falling back to current user id for 9p: {:?}", e);
+            warn!("falling back to current user id for 9p: {}", e);
             geteuid()
         }
     };
     let chronos_gid = match get_group_id(&chronos_user_group) {
         Ok(u) => u,
         Err(e) => {
-            warn!("falling back to current group id for 9p: {:?}", e);
+            warn!("falling back to current group id for 9p: {}", e);
             getegid()
         }
     };
@@ -829,7 +832,7 @@ fn run_vcpu(
                     v.retain(|&x| x != SIGRTMIN() + 0);
                     if let Err(e) = vcpu.set_signal_mask(&v) {
                         error!(
-                            "Failed to set the KVM_SIGNAL_MASK for vcpu {} : {:?}",
+                            "Failed to set the KVM_SIGNAL_MASK for vcpu {} : {}",
                             cpu_id, e
                         );
                         sig_ok = false;
@@ -837,7 +840,7 @@ fn run_vcpu(
                 }
                 Err(e) => {
                     error!(
-                        "Failed to retrieve signal mask for vcpu {} : {:?}",
+                        "Failed to retrieve signal mask for vcpu {} : {}",
                         cpu_id, e
                     );
                     sig_ok = false;
@@ -858,7 +861,7 @@ fn run_vcpu(
                             }
                             io_bus.read(port as u64, &mut data[..size]);
                             if let Err(e) = vcpu.set_data(&data[..size]) {
-                                error!("failed to set return data for IoIn: {:?}", e);
+                                error!("failed to set return data for IoIn: {}", e);
                             }
                         }
                         Ok(VcpuExit::IoOut {
@@ -893,7 +896,7 @@ fn run_vcpu(
                             libc::EINTR => interrupted_by_signal = true,
                             libc::EAGAIN => {}
                             _ => {
-                                error!("vcpu hit unknown error: {:?}", e);
+                                error!("vcpu hit unknown error: {}", e);
                                 break;
                             }
                         },
@@ -903,7 +906,7 @@ fn run_vcpu(
                         // Try to clear the signal that we use to kick VCPU if it is pending before
                         // attempting to handle pause requests.
                         if let Err(e) = clear_signal(SIGRTMIN() + 0) {
-                            error!("failed to clear pending signal: {:?}", e);
+                            error!("failed to clear pending signal: {}", e);
                             break;
                         }
                         let mut run_mode_lock = run_mode_arc.mtx.lock();
@@ -918,7 +921,7 @@ fn run_vcpu(
                                     // VCPU resumes, which could happen days later in realtime.
                                     if requires_kvmclock_ctrl {
                                         if let Err(e) = vcpu.kvmclock_ctrl() {
-                                            error!("failed to signal to kvm that vcpu {} is being suspended: {:?}", cpu_id, e);
+                                            error!("failed to signal to kvm that vcpu {} is being suspended: {}", cpu_id, e);
                                         }
                                     }
                                 }
@@ -1091,7 +1094,7 @@ fn run_control(
         .add(&linux.exit_evt, Token::Exit)
         .map_err(Error::PollContextAdd)?;
     if let Err(e) = poll_ctx.add(&stdin_handle, Token::Stdin) {
-        warn!("failed to add stdin to poll context: {:?}", e);
+        warn!("failed to add stdin to poll context: {}", e);
     }
     poll_ctx
         .add(&sigchld_fd, Token::ChildSignal)
@@ -1157,7 +1160,7 @@ fn run_control(
             match poll_ctx.wait() {
                 Ok(v) => v,
                 Err(e) => {
-                    error!("failed to poll: {:?}", e);
+                    error!("failed to poll: {}", e);
                     break;
                 }
             }
@@ -1176,7 +1179,7 @@ fn run_control(
                             let _ = poll_ctx.delete(&stdin_handle);
                         }
                         Err(e) => {
-                            warn!("error while reading stdin: {:?}", e);
+                            warn!("error while reading stdin: {}", e);
                             let _ = poll_ctx.delete(&stdin_handle);
                         }
                         Ok(count) => {
@@ -1294,10 +1297,10 @@ fn run_control(
                                     disk_host_sockets,
                                 );
                                 if let Err(e) = socket.send(&response) {
-                                    error!("failed to send VmResponse: {:?}", e);
+                                    error!("failed to send VmResponse: {}", e);
                                 }
                                 if let Some(run_mode) = run_mode_opt {
-                                    info!("control socket changed run mode to {:?}", run_mode);
+                                    info!("control socket changed run mode to {}", run_mode);
                                     match run_mode {
                                         VmRunMode::Exiting => {
                                             break 'poll;
@@ -1311,7 +1314,7 @@ fn run_control(
                                     }
                                 }
                             }
-                            Err(e) => error!("failed to recv VmRequest: {:?}", e),
+                            Err(e) => error!("failed to recv VmRequest: {}", e),
                         }
                     }
                 }
@@ -1350,7 +1353,7 @@ fn run_control(
                     error!("failed to join vcpu thread: {:?}", e);
                 }
             }
-            Err(e) => error!("failed to kill vcpu thread: {:?}", e),
+            Err(e) => error!("failed to kill vcpu thread: {}", e),
         }
     }
 
diff --git a/src/main.rs b/src/main.rs
index 3e3afef..d0c1e7d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -174,7 +174,7 @@ fn wait_all_children() -> bool {
                 // We expect ECHILD which indicates that there were no children left.
                 Err(e) if e.errno() == libc::ECHILD => return true,
                 Err(e) => {
-                    warn!("error while waiting for children: {:?}", e);
+                    warn!("error while waiting for children: {}", e);
                     return false;
                 }
                 // We reaped one child, so continue reaping.
@@ -724,7 +724,7 @@ fn vms_request(
                 let sender = Sender::<VmRequest>::new(s);
                 if let Err(e) = sender.send(request) {
                     error!(
-                        "failed to send request to socket at '{}': {:?}",
+                        "failed to send request to socket at '{}': {}",
                         socket_path, e
                     );
                 }
@@ -789,7 +789,7 @@ fn balloon_vms(mut args: std::env::Args) -> std::result::Result<(), ()> {
                 let sender = Sender::<VmRequest>::new(s);
                 if let Err(e) = sender.send(&VmRequest::BalloonAdjust(num_bytes)) {
                     error!(
-                        "failed to send balloon request to socket at '{}': {:?}",
+                        "failed to send balloon request to socket at '{}': {}",
                         socket_path, e
                     );
                 }
@@ -824,11 +824,11 @@ fn create_qcow2(mut args: std::env::Args) -> std::result::Result<(), ()> {
         .write(true)
         .open(&file_path)
         .map_err(|e| {
-            error!("Failed opening qcow file at '{}': {:?}", file_path, e);
+            error!("Failed opening qcow file at '{}': {}", file_path, e);
         })?;
 
     QcowFile::new(file, size).map_err(|e| {
-        error!("Failed to create qcow file at '{}': {:?}", file_path, e);
+        error!("Failed to create qcow file at '{}': {}", file_path, e);
     })?;
 
     Ok(())
@@ -882,7 +882,7 @@ fn disk_cmd(mut args: std::env::Args) -> std::result::Result<(), ()> {
                 let sender = Sender::<VmRequest>::new(s);
                 if let Err(e) = sender.send(&request) {
                     error!(
-                        "failed to send disk request to socket at '{}': {:?}",
+                        "failed to send disk request to socket at '{}': {}",
                         socket_path, e
                     );
                 }
@@ -908,7 +908,7 @@ fn print_usage() {
 
 fn crosvm_main() -> std::result::Result<(), ()> {
     if let Err(e) = syslog::init() {
-        println!("failed to initialize syslog: {:?}", e);
+        println!("failed to initialize syslog: {}", e);
         return Err(());
     }
 
@@ -948,7 +948,7 @@ fn crosvm_main() -> std::result::Result<(), ()> {
         warn!("not all child processes have exited; sending SIGKILL");
         if let Err(e) = kill_process_group() {
             // We're now at the mercy of the OS to clean up after us.
-            warn!("unable to kill all child processes: {:?}", e);
+            warn!("unable to kill all child processes: {}", e);
         }
     }
 
diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs
index d886f0d..9ad0fd7 100644
--- a/src/plugin/mod.rs
+++ b/src/plugin/mod.rs
@@ -105,66 +105,49 @@ pub enum Error {
 
 impl fmt::Display for Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            Error::CloneEventFd(ref e) => write!(f, "failed to clone eventfd: {:?}", e),
-            Error::CloneVcpuSocket(ref e) => write!(f, "failed to clone vcpu socket: {:?}", e),
-            Error::CreateEventFd(ref e) => write!(f, "failed to create eventfd: {:?}", e),
-            Error::CreateIrqChip(ref e) => write!(f, "failed to create kvm irqchip: {:?}", e),
-            Error::CreateJail(ref e) => write!(f, "failed to create jail: {}", e),
-            Error::CreateKvm(ref e) => write!(f, "error creating Kvm: {:?}", e),
-            Error::CreateMainSocket(ref e) => {
-                write!(f, "error creating main request socket: {:?}", e)
-            }
-            Error::CreatePIT(ref e) => write!(f, "failed to create kvm PIT: {:?}", e),
-            Error::CreatePollContext(ref e) => write!(f, "failed to create poll context: {:?}", e),
-            Error::CreateSignalFd(ref e) => write!(f, "failed to create signalfd: {:?}", e),
-            Error::CreateSocketPair(ref e) => write!(f, "failed to create socket pair: {}", e),
-            Error::CreateTapFd(ref e) => {
-                write!(f, "failed to create tap device from raw fd: {:?}", e)
-            }
-            Error::CreateVcpu(ref e) => write!(f, "error creating vcpu: {:?}", e),
-            Error::CreateVcpuSocket(ref e) => {
-                write!(f, "error creating vcpu request socket: {:?}", e)
-            }
-            Error::CreateVm(ref e) => write!(f, "error creating vm: {:?}", e),
-            Error::DecodeRequest(ref e) => write!(f, "failed to decode plugin request: {}", e),
-            Error::EncodeResponse(ref e) => write!(f, "failed to encode plugin response: {}", e),
-            Error::Mount(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountDev(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountLib(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountLib64(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountPlugin(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountPluginLib(ref e) => write!(f, "failed to mount: {}", e),
-            Error::MountRoot(ref e) => write!(f, "failed to mount: {}", e),
-            Error::NoRootDir => {
-                write!(f, "no root directory for jailed process to pivot root into")
-            }
-            Error::ParsePivotRoot(ref e) => write!(f, "failed to set jail pivot root: {}", e),
-            Error::ParseSeccomp(ref e) => write!(f, "failed to parse jail seccomp filter: {}", e),
-            Error::PluginFailed(ref e) => write!(f, "plugin exited with error: {}", e),
-            Error::PluginKill(ref e) => write!(f, "error sending kill signal to plugin: {:?}", e),
-            Error::PluginKilled(ref e) => write!(f, "plugin exited with signal {}", e),
-            Error::PluginRunJail(ref e) => write!(f, "failed to run jail: {}", e),
-            Error::PluginSocketHup => write!(f, "plugin request socket has been hung up"),
-            Error::PluginSocketPoll(ref e) => {
-                write!(f, "failed to poll plugin request sockets: {:?}", e)
-            }
-            Error::PluginSocketRecv(ref e) => {
-                write!(f, "failed to recv from plugin request socket: {:?}", e)
-            }
-            Error::PluginSocketSend(ref e) => {
-                write!(f, "failed to send to plugin request socket: {:?}", e)
-            }
-            Error::PluginSpawn(ref e) => write!(f, "failed to spawn plugin: {}", e),
-            Error::PluginTimeout => write!(f, "plugin did not exit within timeout"),
-            Error::PluginWait(ref e) => write!(f, "error waiting for plugin to exit: {:?}", e),
-            Error::Poll(ref e) => write!(f, "failed to poll all FDs: {:?}", e),
-            Error::PollContextAdd(ref e) => write!(f, "failed to add fd to poll context: {:?}", e),
-            Error::RootNotAbsolute => write!(f, "path to the root directory must be absolute"),
-            Error::RootNotDir => write!(f, "specified root directory is not a directory"),
-            Error::SetGidMap(ref e) => write!(f, "failed to set gidmap for jail: {}", e),
-            Error::SetUidMap(ref e) => write!(f, "failed to set uidmap for jail: {}", e),
-            Error::SigChild {
+        use self::Error::*;
+
+        match self {
+            CloneEventFd(e) => write!(f, "failed to clone eventfd: {}", e),
+            CloneVcpuSocket(e) => write!(f, "failed to clone vcpu socket: {}", e),
+            CreateEventFd(e) => write!(f, "failed to create eventfd: {}", e),
+            CreateIrqChip(e) => write!(f, "failed to create kvm irqchip: {}", e),
+            CreateJail(e) => write!(f, "failed to create jail: {}", e),
+            CreateKvm(e) => write!(f, "error creating Kvm: {}", e),
+            CreateMainSocket(e) => write!(f, "error creating main request socket: {}", e),
+            CreatePIT(e) => write!(f, "failed to create kvm PIT: {}", e),
+            CreatePollContext(e) => write!(f, "failed to create poll context: {}", e),
+            CreateSignalFd(e) => write!(f, "failed to create signalfd: {}", e),
+            CreateSocketPair(e) => write!(f, "failed to create socket pair: {}", e),
+            CreateTapFd(e) => write!(f, "failed to create tap device from raw fd: {}", e),
+            CreateVcpu(e) => write!(f, "error creating vcpu: {}", e),
+            CreateVcpuSocket(e) => write!(f, "error creating vcpu request socket: {}", e),
+            CreateVm(e) => write!(f, "error creating vm: {}", e),
+            DecodeRequest(e) => write!(f, "failed to decode plugin request: {}", e),
+            EncodeResponse(e) => write!(f, "failed to encode plugin response: {}", e),
+            Mount(e) | MountDev(e) | MountLib(e) | MountLib64(e) | MountPlugin(e)
+            | MountPluginLib(e) | MountRoot(e) => write!(f, "failed to mount: {}", e),
+            NoRootDir => write!(f, "no root directory for jailed process to pivot root into"),
+            ParsePivotRoot(e) => write!(f, "failed to set jail pivot root: {}", e),
+            ParseSeccomp(e) => write!(f, "failed to parse jail seccomp filter: {}", e),
+            PluginFailed(e) => write!(f, "plugin exited with error: {}", e),
+            PluginKill(e) => write!(f, "error sending kill signal to plugin: {}", e),
+            PluginKilled(e) => write!(f, "plugin exited with signal {}", e),
+            PluginRunJail(e) => write!(f, "failed to run jail: {}", e),
+            PluginSocketHup => write!(f, "plugin request socket has been hung up"),
+            PluginSocketPoll(e) => write!(f, "failed to poll plugin request sockets: {}", e),
+            PluginSocketRecv(e) => write!(f, "failed to recv from plugin request socket: {}", e),
+            PluginSocketSend(e) => write!(f, "failed to send to plugin request socket: {}", e),
+            PluginSpawn(e) => write!(f, "failed to spawn plugin: {}", e),
+            PluginTimeout => write!(f, "plugin did not exit within timeout"),
+            PluginWait(e) => write!(f, "error waiting for plugin to exit: {}", e),
+            Poll(e) => write!(f, "failed to poll all FDs: {}", e),
+            PollContextAdd(e) => write!(f, "failed to add fd to poll context: {}", e),
+            RootNotAbsolute => write!(f, "path to the root directory must be absolute"),
+            RootNotDir => write!(f, "specified root directory is not a directory"),
+            SetGidMap(e) => write!(f, "failed to set gidmap for jail: {}", e),
+            SetUidMap(e) => write!(f, "failed to set uidmap for jail: {}", e),
+            SigChild {
                 pid,
                 signo,
                 status,
@@ -174,14 +157,14 @@ impl fmt::Display for Error {
                 "process {} died with signal {}, status {}, and code {}",
                 pid, signo, status, code
             ),
-            Error::SignalFd(ref e) => write!(f, "failed to read signal fd: {:?}", e),
-            Error::SpawnVcpu(ref e) => write!(f, "error spawning vcpu thread: {}", e),
-            Error::TapOpen(ref e) => write!(f, "error opening tap device: {:?}", e),
-            Error::TapSetIp(ref e) => write!(f, "error setting tap ip: {:?}", e),
-            Error::TapSetNetmask(ref e) => write!(f, "error setting tap netmask: {:?}", e),
-            Error::TapSetMacAddress(ref e) => write!(f, "error setting tap mac address: {:?}", e),
-            Error::TapEnable(ref e) => write!(f, "error enabling tap device: {:?}", e),
-            Error::ValidateTapFd(ref e) => write!(f, "failed to validate raw tap fd: {:?}", e),
+            SignalFd(e) => write!(f, "failed to read signal fd: {}", e),
+            SpawnVcpu(e) => write!(f, "error spawning vcpu thread: {}", e),
+            TapOpen(e) => write!(f, "error opening tap device: {}", e),
+            TapSetIp(e) => write!(f, "error setting tap ip: {}", e),
+            TapSetNetmask(e) => write!(f, "error setting tap netmask: {}", e),
+            TapSetMacAddress(e) => write!(f, "error setting tap mac address: {}", e),
+            TapEnable(e) => write!(f, "error enabling tap device: {}", e),
+            ValidateTapFd(e) => write!(f, "failed to validate raw tap fd: {}", e),
         }
     }
 }
@@ -368,7 +351,7 @@ pub fn run_vcpus(
                     let res = vcpu_plugin.init(&vcpu);
                     vcpu_thread_barrier.wait();
                     if let Err(e) = res {
-                        error!("failed to initialize vcpu {}: {:?}", cpu_id, e);
+                        error!("failed to initialize vcpu {}: {}", cpu_id, e);
                     } else {
                         loop {
                             let run_res = vcpu.run();
@@ -382,7 +365,7 @@ pub fn run_vcpus(
                                         }
                                         vcpu_plugin.io_read(port as u64, &mut data[..size], &vcpu);
                                         if let Err(e) = vcpu.set_data(&data[..size]) {
-                                            error!("failed to set return data for IoIn: {:?}", e);
+                                            error!("failed to set return data for IoIn: {}", e);
                                         }
                                     }
                                     VcpuExit::IoOut {
@@ -428,7 +411,7 @@ pub fn run_vcpus(
                                 Err(e) => match e.errno() {
                                     EAGAIN | EINTR => {}
                                     _ => {
-                                        error!("vcpu hit unknown error: {:?}", e);
+                                        error!("vcpu hit unknown error: {}", e);
                                         break;
                                     }
                                 },
@@ -442,7 +425,7 @@ pub fn run_vcpus(
                             clear_signal(SIGRTMIN() + 0).expect("failed to clear pending signal");
 
                             if let Err(e) = vcpu_plugin.pre_run(&vcpu) {
-                                error!("failed to process pause on vcpu {}: {:?}", cpu_id, e);
+                                error!("failed to process pause on vcpu {}: {}", cpu_id, e);
                                 break;
                             }
                         }
@@ -723,7 +706,7 @@ pub fn run_config(cfg: Config) -> Result<()> {
                     error!("failed to join vcpu thread: {:?}", e);
                 }
             }
-            Err(e) => error!("failed to kill vcpu thread: {:?}", e),
+            Err(e) => error!("failed to kill vcpu thread: {}", e),
         }
     }
 
diff --git a/src/plugin/process.rs b/src/plugin/process.rs
index 2f3560d..2df9284 100644
--- a/src/plugin/process.rs
+++ b/src/plugin/process.rs
@@ -412,7 +412,7 @@ impl Process {
             if cpu_mask & (1 << cpu_id) != 0 {
                 per_cpu_state.lock().request_pause(user_data);
                 if let Err(e) = handle.kill(SIGRTMIN() + 0) {
-                    error!("failed to interrupt vcpu {}: {:?}", cpu_id, e);
+                    error!("failed to interrupt vcpu {}: {}", cpu_id, e);
                 }
             }
         }
@@ -425,7 +425,7 @@ impl Process {
         // Log any NetError so that the cause can be found later, but extract and return the
         // underlying errno for the client as well.
         fn map_net_error(s: &str, e: NetError) -> SysError {
-            error!("failed to get {}: {:?}", s, e);
+            error!("failed to get {}: {}", s, e);
             e.sys_error()
         }
 
@@ -683,7 +683,7 @@ impl Drop for Process {
     fn drop(&mut self) {
         // Ignore the result because there is nothing we can do about it.
         if let Err(e) = self.signal_kill() {
-            error!("failed to signal kill event for plugin: {:?}", e);
+            error!("failed to signal kill event for plugin: {}", e);
         }
     }
 }
diff --git a/src/plugin/vcpu.rs b/src/plugin/vcpu.rs
index 70cf914..c2350a6 100644
--- a/src/plugin/vcpu.rs
+++ b/src/plugin/vcpu.rs
@@ -329,7 +329,7 @@ impl PluginVcpu {
         let vcpu_state_lock = match self.shared_vcpu_state.read() {
             Ok(l) => l,
             Err(e) => {
-                error!("error read locking shared cpu state: {:?}", e);
+                error!("error read locking shared cpu state: {}", e);
                 return false;
             }
         };
@@ -360,7 +360,7 @@ impl PluginVcpu {
                 match self.handle_until_resume(vcpu) {
                     Ok(resume_data) => data.copy_from_slice(&resume_data),
                     Err(e) if e.errno() == EPIPE => {}
-                    Err(e) => error!("failed to process vcpu requests: {:?}", e),
+                    Err(e) => error!("failed to process vcpu requests: {}", e),
                 }
                 true
             }
diff --git a/sys_util/src/errno.rs b/sys_util/src/errno.rs
index 0f9b5f2..023b162 100644
--- a/sys_util/src/errno.rs
+++ b/sys_util/src/errno.rs
@@ -49,7 +49,7 @@ impl error::Error for Error {
 
 impl Display for Error {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "Error: {}", self.errno())
+        io::Error::from_raw_os_error(self.0).fmt(f)
     }
 }
 
diff --git a/sys_util/src/guest_address.rs b/sys_util/src/guest_address.rs
index 1048c6d..3e521ff 100644
--- a/sys_util/src/guest_address.rs
+++ b/sys_util/src/guest_address.rs
@@ -5,6 +5,7 @@
 //! Represents an address in the guest's memory space.
 
 use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
+use std::fmt::{self, Display};
 use std::ops::{BitAnd, BitOr};
 
 /// Represents an Address in the guest's memory.
@@ -89,6 +90,12 @@ impl PartialOrd for GuestAddress {
     }
 }
 
+impl Display for GuestAddress {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        write!(f, "{:#x}", self.0)
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use super::*;
diff --git a/sys_util/src/lib.rs b/sys_util/src/lib.rs
index cb0374b..29aa489 100644
--- a/sys_util/src/lib.rs
+++ b/sys_util/src/lib.rs
@@ -233,7 +233,7 @@ pub fn fallocate(
 ///                 continue
 ///             },
 ///             Err(e) if e.errno() == libc::ECHILD => println!("no children left"),
-///             Err(e) => println!("error reaping children: {:?}", e),
+///             Err(e) => println!("error reaping children: {}", e),
 ///         }
 ///         break
 ///     }
@@ -298,7 +298,7 @@ impl Drop for UnlinkUnixDatagram {
         if let Ok(addr) = self.0.local_addr() {
             if let Some(path) = addr.as_pathname() {
                 if let Err(e) = remove_file(path) {
-                    warn!("failed to remove control socket file: {:?}", e);
+                    warn!("failed to remove control socket file: {}", e);
                 }
             }
         }
diff --git a/sys_util/src/mmap.rs b/sys_util/src/mmap.rs
index 5de433c..07815ca 100644
--- a/sys_util/src/mmap.rs
+++ b/sys_util/src/mmap.rs
@@ -6,6 +6,7 @@
 //! mmap object leaves scope.
 
 use std;
+use std::fmt::{self, Display};
 use std::io::{Read, Write};
 use std::os::unix::io::AsRawFd;
 use std::ptr::null_mut;
@@ -36,6 +37,26 @@ pub enum Error {
 }
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            InvalidAddress => write!(f, "requested memory out of range"),
+            InvalidOffset => write!(f, "requested offset is out of range of off_t"),
+            InvalidRange(offset, count) => write!(
+                f,
+                "requested memory range spans past the end of the region: offset={} count={}",
+                offset, count,
+            ),
+            ReadFromSource(e) => write!(f, "failed to read from the given source: {}", e),
+            SystemCallFailed(e) => write!(f, "mmap system call failed: {}", e),
+            WriteToMemory(e) => write!(f, "failed to write to memory: {}", e),
+            ReadFromMemory(e) => write!(f, "failed to read from memory: {}", e),
+        }
+    }
+}
+
 /// Wraps an anonymous shared memory mapping in the current process.
 #[derive(Debug)]
 pub struct MemoryMapping {
@@ -75,7 +96,7 @@ impl MemoryMapping {
         // return value. We only warn about an error because failure here is not fatal to the mmap.
         if unsafe { libc::madvise(addr, size, libc::MADV_DONTDUMP) } == -1 {
             warn!(
-                "failed madvise(MADV_DONTDUMP) on mmap: {:?}",
+                "failed madvise(MADV_DONTDUMP) on mmap: {}",
                 errno::Error::last()
             );
         }
@@ -123,7 +144,7 @@ impl MemoryMapping {
         // return value. We only warn about an error because failure here is not fatal to the mmap.
         if unsafe { libc::madvise(addr, size, libc::MADV_DONTDUMP) } == -1 {
             warn!(
-                "failed madvise(MADV_DONTDUMP) on mmap: {:?}",
+                "failed madvise(MADV_DONTDUMP) on mmap: {}",
                 errno::Error::last()
             );
         }
@@ -414,7 +435,7 @@ mod tests {
         if let Error::SystemCallFailed(e) = res {
             assert_eq!(e.errno(), libc::EINVAL);
         } else {
-            panic!("unexpected error: {:?}", res);
+            panic!("unexpected error: {}", res);
         }
     }
 
@@ -425,7 +446,7 @@ mod tests {
         if let Error::SystemCallFailed(e) = res {
             assert_eq!(e.errno(), libc::EBADF);
         } else {
-            panic!("unexpected error: {:?}", res);
+            panic!("unexpected error: {}", res);
         }
     }
 
@@ -485,7 +506,7 @@ mod tests {
             .unwrap_err();
         match res {
             Error::InvalidOffset => {}
-            e => panic!("unexpected error: {:?}", e),
+            e => panic!("unexpected error: {}", e),
         }
     }
 }
diff --git a/sys_util/src/signal.rs b/sys_util/src/signal.rs
index fe01dcf..737d7f5 100644
--- a/sys_util/src/signal.rs
+++ b/sys_util/src/signal.rs
@@ -8,6 +8,8 @@ use libc::{
     SIG_BLOCK, SIG_UNBLOCK,
 };
 
+use std::fmt::{self, Display};
+use std::io;
 use std::mem;
 use std::os::unix::thread::JoinHandleExt;
 use std::ptr::{null, null_mut};
@@ -38,6 +40,36 @@ pub enum Error {
     ClearCheckPending(errno::Error),
 }
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            CreateSigset(e) => write!(f, "couldn't create a sigset: {}", e),
+            SignalAlreadyBlocked(num) => write!(f, "signal {} already blocked", num),
+            CompareBlockedSignals(e) => write!(
+                f,
+                "failed to check whether requested signal is in the blocked set: {}",
+                e,
+            ),
+            BlockSignal(e) => write!(f, "signal could not be blocked: {}", e),
+            RetrieveSignalMask(errno) => write!(
+                f,
+                "failed to retrieve signal mask: {}",
+                io::Error::from_raw_os_error(*errno),
+            ),
+            UnblockSignal(e) => write!(f, "signal could not be unblocked: {}", e),
+            ClearWaitPending(e) => write!(f, "failed to wait for given signal: {}", e),
+            ClearGetPending(e) => write!(f, "failed to get pending signals: {}", e),
+            ClearCheckPending(e) => write!(
+                f,
+                "failed to check whether given signal is in the pending set: {}",
+                e,
+            ),
+        }
+    }
+}
+
 pub type SignalResult<T> = result::Result<T, Error>;
 
 #[link(name = "c")]
diff --git a/sys_util/src/signalfd.rs b/sys_util/src/signalfd.rs
index c4fd92d..479972e 100644
--- a/sys_util/src/signalfd.rs
+++ b/sys_util/src/signalfd.rs
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::mem;
 use std::os::raw::c_int;
@@ -29,6 +30,32 @@ pub enum Error {
     SignalFdPartialRead(usize),
 }
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            CreateSigset(e) => write!(
+                f,
+                "failed to construct sigset when creating signalfd: {}",
+                e,
+            ),
+            CreateSignalFd(e) => write!(f, "failed to create a new signalfd: {}", e),
+            CreateBlockSignal(e) => write!(
+                f,
+                "failed to block the signal when creating signalfd: {}",
+                e,
+            ),
+            SignalFdRead(e) => write!(f, "unable to read from signalfd: {}", e),
+            SignalFdPartialRead(read) => write!(
+                f,
+                "signalfd failed to return a full siginfo struct, read only {} bytes",
+                read,
+            ),
+        }
+    }
+}
+
 pub type Result<T> = result::Result<T, Error>;
 
 /// A safe wrapper around a Linux signalfd (man 2 signalfd).
@@ -114,7 +141,7 @@ impl Drop for SignalFd {
         // was promised - unmasking the signal when we go out of scope.
         let res = signal::unblock_signal(self.signal);
         if let Err(e) = res {
-            error!("signalfd failed to unblock signal {}: {:?}", self.signal, e);
+            error!("signalfd failed to unblock signal {}: {}", self.signal, e);
         }
     }
 }
diff --git a/sys_util/src/syslog.rs b/sys_util/src/syslog.rs
index afe6828..f31ff11 100644
--- a/sys_util/src/syslog.rs
+++ b/sys_util/src/syslog.rs
@@ -16,17 +16,17 @@
 //!
 //! fn main() {
 //!     if let Err(e) = syslog::init() {
-//!         println!("failed to initiailize syslog: {:?}", e);
+//!         println!("failed to initiailize syslog: {}", e);
 //!         return;
 //!     }
 //!     warn!("this is your {} warning", "final");
-//!     error!("something went horribly wrong: {:?}", "out of RAMs");
+//!     error!("something went horribly wrong: {}", "out of RAMs");
 //! }
 //! ```
 
 use std::env;
 use std::ffi::{OsStr, OsString};
-use std::fmt;
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::io;
 use std::io::{stderr, Cursor, ErrorKind, Write};
@@ -119,6 +119,21 @@ pub enum Error {
     InvalidFd,
 }
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            NeverInitialized => write!(f, "initialization was never attempted"),
+            Poisoned => write!(f, "initialization previously failed and cannot be retried"),
+            Socket(e) => write!(f, "failed to create socket: {}", e),
+            Connect(e) => write!(f, "failed to connect socket: {}", e),
+            GetLowestFd(e) => write!(f, "failed to get lowest file descriptor: {}", e),
+            InvalidFd => write!(f, "guess of fd for syslog connection was invalid"),
+        }
+    }
+}
+
 fn get_hostname() -> Result<String, ()> {
     let mut hostname: [u8; 256] = [b'\0'; 256];
     // Safe because we give a valid pointer to a buffer of the indicated length and check for the
@@ -409,7 +424,7 @@ fn get_localtime() -> tm {
 /// # use sys_util::syslog;
 /// # fn main() {
 /// #   if let Err(e) = syslog::init() {
-/// #       println!("failed to initiailize syslog: {:?}", e);
+/// #       println!("failed to initiailize syslog: {}", e);
 /// #       return;
 /// #   }
 /// syslog::log(syslog::Priority::Error,
diff --git a/tests/plugins.rs b/tests/plugins.rs
index 6176a32..e95cc07 100644
--- a/tests/plugins.rs
+++ b/tests/plugins.rs
@@ -24,7 +24,7 @@ struct RemovePath(PathBuf);
 impl Drop for RemovePath {
     fn drop(&mut self) {
         if let Err(e) = remove_file(&self.0) {
-            eprintln!("failed to remove path: {:?}", e);
+            eprintln!("failed to remove path: {}", e);
         }
     }
 }
diff --git a/vhost/src/lib.rs b/vhost/src/lib.rs
index 552f546..f980bd9 100644
--- a/vhost/src/lib.rs
+++ b/vhost/src/lib.rs
@@ -14,6 +14,7 @@ pub use net::Net;
 pub use net::NetT;
 pub use vsock::Vsock;
 
+use std::fmt::{self, Display};
 use std::io::Error as IoError;
 use std::mem;
 use std::os::unix::io::AsRawFd;
@@ -41,6 +42,22 @@ pub enum Error {
 }
 pub type Result<T> = std::result::Result<T, Error>;
 
+impl Display for Error {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::Error::*;
+
+        match self {
+            VhostOpen(e) => write!(f, "failed to open vhost device: {}", e),
+            IoctlError(e) => write!(f, "failed to run ioctl: {}", e),
+            InvalidQueue => write!(f, "invalid queue"),
+            DescriptorTableAddress(e) => write!(f, "invalid descriptor table address: {}", e),
+            UsedAddress(e) => write!(f, "invalid used address: {}", e),
+            AvailAddress(e) => write!(f, "invalid available address: {}", e),
+            LogAddress(e) => write!(f, "invalid log address: {}", e),
+        }
+    }
+}
+
 fn ioctl_result<T>() -> Result<T> {
     Err(Error::IoctlError(IoError::last_os_error()))
 }
@@ -331,7 +348,7 @@ mod tests {
             // FakeNet won't respond to ioctl's
             Ok(_t) => {}
             Err(Error::IoctlError(ref ioe)) if ioe.raw_os_error().unwrap() == 25 => {}
-            Err(e) => panic!("Unexpected Error:\n{:?}", e),
+            Err(e) => panic!("Unexpected Error:\n{}", e),
         }
     }
 
diff --git a/vm_control/src/lib.rs b/vm_control/src/lib.rs
index 09e1ea2..514a964 100644
--- a/vm_control/src/lib.rs
+++ b/vm_control/src/lib.rs
@@ -18,6 +18,7 @@ extern crate resources;
 #[macro_use]
 extern crate sys_util;
 
+use std::fmt::{self, Display};
 use std::fs::File;
 use std::io::{Seek, SeekFrom};
 use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
@@ -78,6 +79,18 @@ pub enum VmRunMode {
     Exiting,
 }
 
+impl Display for VmRunMode {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use self::VmRunMode::*;
+
+        match self {
+            Running => write!(f, "running"),
+            Suspending => write!(f, "suspending"),
+            Exiting => write!(f, "exiting"),
+        }
+    }
+}
+
 impl Default for VmRunMode {
     fn default() -> Self {
         VmRunMode::Running
@@ -239,13 +252,13 @@ impl VmRequest {
                 // Forward the request to the block device process via its control socket.
                 if let Some(sock) = disk_host_sockets.get(disk_index) {
                     if let Err(e) = sock.send(self) {
-                        error!("disk socket send failed: {:?}", e);
+                        error!("disk socket send failed: {}", e);
                         VmResponse::Err(SysError::new(EINVAL))
                     } else {
                         match sock.recv() {
                             Ok(result) => result,
                             Err(e) => {
-                                error!("disk socket recv failed: {:?}", e);
+                                error!("disk socket recv failed: {}", e);
                                 VmResponse::Err(SysError::new(EINVAL))
                             }
                         }