diff --git a/src/macros.rs b/src/macros.rs
index af896e769eb83af166a5cecacc4d3af2506f0152..a161da32cf35de161135a80cb31060e7ee830804 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -67,11 +67,25 @@ pub fn trace_error() -> (isize, &'static str) {
 macro_rules! trace_expr {
     ($expr:expr, $($arg:tt)*) => ({
         trace!("{}", format_args!($($arg)*));
-        unsafe {
-            ::platform::errno = 0;
-        }
+
+        let old_errno = unsafe { ::platform::errno };
+        unsafe { ::platform::errno = 0; }
+
         let ret = $expr;
-        trace!("{} = {} {:?}", format_args!($($arg)*), ret, $crate::macros::trace_error());
+
+        let errno = unsafe { ::platform::errno } as isize;
+        if errno == 0 {
+            unsafe { ::platform::errno = old_errno; }
+        }
+
+        let strerror = if errno >= 0 && errno < ::header::errno::STR_ERROR.len() as isize {
+            ::header::errno::STR_ERROR[errno as usize]
+        } else {
+            "Unknown error"
+        };
+
+        trace!("{} = {} ({}, {})", format_args!($($arg)*), ret, errno, strerror);
+
         ret
     });
 }