diff --git a/README.md b/README.md
index ae45ce7f40434ec2be45296c3c0e2c9a27b9e275..4885cc9e3c749f6ea7213954dc0f1456e22ae150 100644
--- a/README.md
+++ b/README.md
@@ -45,8 +45,8 @@ libc = { version = "0.2", features = ["align"] }
 ```
 
 All structs implemented by the libc crate have the `Copy` and `Clone` traits
-implemented for them. The additional traits of `PartialEq` and `Eq` can be
-enabled with the *extra_traits* feature (requires Rust 1.25 or newer):
+implemented for them. The additional traits of `Debug, `Eq`, and `PartialEq`
+can be enabled with the *extra_traits* feature (requires Rust 1.25 or newer):
 
 ```toml
 [dependencies]
diff --git a/src/macros.rs b/src/macros.rs
index 175c0512592bcb109955d128b9fe7619f8a3412d..3877797ce060259b21905f35382d7ee1a887c02e 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -39,7 +39,7 @@ macro_rules! s {
         __item! {
             #[repr(C)]
             $(#[$attr])*
-            #[cfg_attr(feature = "extra_traits", derive(Eq, PartialEq))]
+            #[cfg_attr(feature = "extra_traits", derive(Debug, Eq, PartialEq))]
             pub $t $i { $($field)* }
         }
         impl ::dox::Copy for $i {}
diff --git a/src/unix/bsd/apple/b32.rs b/src/unix/bsd/apple/b32.rs
index 95dc962a1d0290e5ad6fa4b62cda0b21d11301cc..4950c1973829662456c7cec1cc75f9c3433a330f 100644
--- a/src/unix/bsd/apple/b32.rs
+++ b/src/unix/bsd/apple/b32.rs
@@ -64,6 +64,15 @@ impl PartialEq for pthread_attr_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_attr_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_attr_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_attr_t")
+            .field("__sig", &self.__sig)
+            // FIXME: .field("__opaque", &self.__opaque)
+            .finish()
+    }
+}
 
 pub const __PTHREAD_MUTEX_SIZE__: usize = 40;
 pub const __PTHREAD_COND_SIZE__: usize = 24;
diff --git a/src/unix/bsd/apple/b64.rs b/src/unix/bsd/apple/b64.rs
index 0eb2d45c6a9600891812e756c2e3059e36d10ecc..c5f00384949da5f74a03f34cd8f289ce2df9c88a 100644
--- a/src/unix/bsd/apple/b64.rs
+++ b/src/unix/bsd/apple/b64.rs
@@ -69,6 +69,15 @@ impl PartialEq for pthread_attr_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_attr_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_attr_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_attr_t")
+            .field("__sig", &self.__sig)
+            // FIXME: .field("__opaque", &self.__opaque)
+            .finish()
+    }
+}
 
 pub const __PTHREAD_MUTEX_SIZE__: usize = 56;
 pub const __PTHREAD_COND_SIZE__: usize = 40;
diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs
index 80516388f49c261b4b3078b68d400bf503e2cfc1..16ce25f03e520190fcf0995c490332004911d7fc 100644
--- a/src/unix/bsd/apple/mod.rs
+++ b/src/unix/bsd/apple/mod.rs
@@ -608,12 +608,6 @@ impl std::fmt::Debug for semun {
     }
 }
 #[cfg(feature = "extra_traits")]
-impl std::hash::Hash for semun {
-    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
-        unsafe { self.val.hash(state) };
-    }
-}
-#[cfg(feature = "extra_traits")]
 impl PartialEq for proc_threadinfo {
     fn eq(&self, other: &proc_threadinfo) -> bool {
         self.pth_user_time == other.pth_user_time
@@ -636,6 +630,24 @@ impl PartialEq for proc_threadinfo {
 #[cfg(feature = "extra_traits")]
 impl Eq for proc_threadinfo {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for proc_threadinfo {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("proc_threadinfo")
+            .field("pth_user_time", &self.pth_user_time)
+            .field("pth_system_time", &self.pth_system_time)
+            .field("pth_cpu_usage", &self.pth_cpu_usage)
+            .field("pth_policy", &self.pth_policy)
+            .field("pth_run_state", &self.pth_run_state)
+            .field("pth_flags", &self.pth_flags)
+            .field("pth_sleep_time", &self.pth_sleep_time)
+            .field("pth_curpri", &self.pth_curpri)
+            .field("pth_priority", &self.pth_priority)
+            .field("pth_maxpriority", &self.pth_maxpriority)
+            // FIXME: .field("pth_name", &self.pth_name)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for statfs {
     fn eq(&self, other: &statfs) -> bool {
         self.f_bsize == other.f_bsize
@@ -667,6 +679,29 @@ impl PartialEq for statfs {
 #[cfg(feature = "extra_traits")]
 impl Eq for statfs {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for statfs {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("statfs")
+            .field("f_bsize", &self.f_bsize)
+            .field("f_iosize", &self.f_iosize)
+            .field("f_blocks", &self.f_blocks)
+            .field("f_bfree", &self.f_bfree)
+            .field("f_bavail", &self.f_bavail)
+            .field("f_files", &self.f_files)
+            .field("f_ffree", &self.f_ffree)
+            .field("f_fsid", &self.f_fsid)
+            .field("f_owner", &self.f_owner)
+            .field("f_flags", &self.f_flags)
+            .field("f_fssubtype", &self.f_fssubtype)
+            .field("f_fstypename", &self.f_fstypename)
+            .field("f_type", &self.f_type)
+            // FIXME: .field("f_mntonname", &self.f_mntonname)
+            // FIXME: .field("f_mntfromname", &self.f_mntfromname)
+            .field("f_reserved", &self.f_reserved)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for dirent {
     fn eq(&self, other: &dirent) -> bool {
         self.d_ino == other.d_ino
@@ -684,6 +719,19 @@ impl PartialEq for dirent {
 #[cfg(feature = "extra_traits")]
 impl Eq for dirent {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for dirent {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("dirent")
+            .field("d_ino", &self.d_ino)
+            .field("d_seekoff", &self.d_seekoff)
+            .field("d_reclen", &self.d_reclen)
+            .field("d_namlen", &self.d_namlen)
+            .field("d_type", &self.d_type)
+            // FIXME: .field("d_name", &self.d_name)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_rwlock_t {
     fn eq(&self, other: &pthread_rwlock_t) -> bool {
         self.__sig == other.__sig
@@ -697,6 +745,15 @@ impl PartialEq for pthread_rwlock_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_rwlock_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_rwlock_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_rwlock_t")
+            .field("__sig", &self.__sig)
+            // FIXME: .field("__opaque", &self.__opaque)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_mutex_t {
     fn eq(&self, other: &pthread_mutex_t) -> bool {
         self.__sig == other.__sig
@@ -710,6 +767,15 @@ impl PartialEq for pthread_mutex_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_mutex_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_mutex_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_mutex_t")
+            .field("__sig", &self.__sig)
+            // FIXME: .field("__opaque", &self.__opaque)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_cond_t {
     fn eq(&self, other: &pthread_cond_t) -> bool {
         self.__sig == other.__sig
@@ -723,6 +789,15 @@ impl PartialEq for pthread_cond_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_cond_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_cond_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_cond_t")
+            .field("__sig", &self.__sig)
+            // FIXME: .field("__opaque", &self.__opaque)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for sockaddr_storage {
     fn eq(&self, other: &sockaddr_storage) -> bool {
         self.ss_len == other.ss_len
@@ -743,6 +818,18 @@ impl PartialEq for sockaddr_storage {
 #[cfg(feature = "extra_traits")]
 impl Eq for sockaddr_storage {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for sockaddr_storage {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("sockaddr_storage")
+            .field("ss_len", &self.ss_len)
+            .field("ss_family", &self.ss_family)
+            .field("__ss_pad1", &self.__ss_pad1)
+            .field("__ss_align", &self.__ss_align)
+            // FIXME: .field("__ss_pad2", &self.__ss_pad2)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for utmpx {
     fn eq(&self, other: &utmpx) -> bool {
         self.ut_user
@@ -764,6 +851,21 @@ impl PartialEq for utmpx {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for utmpx {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for utmpx {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("utmpx")
+            // FIXME: .field("ut_user", &self.ut_user)
+            .field("ut_id", &self.ut_id)
+            .field("ut_line", &self.ut_line)
+            .field("ut_pid", &self.ut_pid)
+            .field("ut_type", &self.ut_type)
+            .field("ut_tv", &self.ut_tv)
+            // FIXME: .field("ut_host", &self.ut_host)
+            .field("ut_pad", &self.ut_pad)
+            .finish()
+    }
+}
 
 pub const _UTX_USERSIZE: usize = 256;
 pub const _UTX_LINESIZE: usize = 32;
diff --git a/src/unix/bsd/mod.rs b/src/unix/bsd/mod.rs
index 63bfe9588ae4b046c13fd6dc89b524044477704b..74bbaf75e7471f0ee94ee0d82c173c282d897de0 100644
--- a/src/unix/bsd/mod.rs
+++ b/src/unix/bsd/mod.rs
@@ -152,6 +152,16 @@ impl PartialEq for sockaddr_un {
 #[cfg(feature = "extra_traits")]
 impl Eq for sockaddr_un {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for sockaddr_un {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("sockaddr_un")
+            .field("sun_len", &self.sun_len)
+            .field("sun_family", &self.sun_family)
+            // FIXME: .field("sun_path", &self.sun_path)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for utsname {
     fn eq(&self, other: &utsname) -> bool {
         self.sysname
@@ -182,6 +192,18 @@ impl PartialEq for utsname {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for utsname {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for utsname {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("utsname")
+            // FIXME: .field("sysname", &self.sysname)
+            // FIXME: .field("nodename", &self.nodename)
+            // FIXME: .field("release", &self.release)
+            // FIXME: .field("version", &self.version)
+            // FIXME: .field("machine", &self.machine)
+            .finish()
+    }
+}
 
 pub const LC_ALL: ::c_int = 0;
 pub const LC_COLLATE: ::c_int = 1;
diff --git a/src/unix/notbsd/android/b64/mod.rs b/src/unix/notbsd/android/b64/mod.rs
index b57e7bdc3e4b3d49359a2e1be5a6793e67fb72f5..c5a6a79e4484b9b316609cf7173945c29e44fd1a 100644
--- a/src/unix/notbsd/android/b64/mod.rs
+++ b/src/unix/notbsd/android/b64/mod.rs
@@ -141,6 +141,15 @@ impl PartialEq for pthread_mutex_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_mutex_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_mutex_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_mutex_t")
+            .field("value", &self.value)
+            // FIXME: .field("__reserved", &self.__reserved)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_cond_t {
     fn eq(&self, other: &pthread_cond_t) -> bool {
         self.value == other.value
@@ -154,6 +163,15 @@ impl PartialEq for pthread_cond_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_cond_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_cond_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_cond_t")
+            .field("value", &self.value)
+            // FIXME: .field("__reserved", &self.__reserved)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_rwlock_t {
     fn eq(&self, other: &pthread_rwlock_t) -> bool {
         self.numLocks == other.numLocks
@@ -170,6 +188,19 @@ impl PartialEq for pthread_rwlock_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_rwlock_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_rwlock_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_rwlock_t")
+            .field("numLocks", &self.numLocks)
+            .field("writerThreadId", &self.writerThreadId)
+            .field("pendingReaders", &self.pendingReaders)
+            .field("pendingWriters", &self.pendingWriters)
+            .field("attr", &self.attr)
+            // FIXME: .field("__reserved", &self.__reserved)
+            .finish()
+    }
+}
 
 pub const RTLD_GLOBAL: ::c_int = 0x00100;
 pub const RTLD_NOW: ::c_int = 2;
diff --git a/src/unix/notbsd/android/mod.rs b/src/unix/notbsd/android/mod.rs
index 5345be0e4cb9f4fef63e81a7a3c99318c6307667..99faaef6ba354a5160604a1588df79fa7db54a09 100644
--- a/src/unix/notbsd/android/mod.rs
+++ b/src/unix/notbsd/android/mod.rs
@@ -257,6 +257,18 @@ impl PartialEq for dirent {
 #[cfg(feature = "extra_traits")]
 impl Eq for dirent {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for dirent {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("dirent")
+            .field("d_ino", &self.d_ino)
+            .field("d_off", &self.d_off)
+            .field("d_reclen", &self.d_reclen)
+            .field("d_type", &self.d_type)
+            .field("d_name", &self.d_name)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for dirent64 {
     fn eq(&self, other: &dirent64) -> bool {
         self.d_ino == other.d_ino
@@ -273,6 +285,18 @@ impl PartialEq for dirent64 {
 #[cfg(feature = "extra_traits")]
 impl Eq for dirent64 {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for dirent64 {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("dirent64")
+            .field("d_ino", &self.d_ino)
+            .field("d_off", &self.d_off)
+            .field("d_reclen", &self.d_reclen)
+            .field("d_type", &self.d_type)
+            .field("d_name", &self.d_name)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for siginfo_t {
     fn eq(&self, other: &siginfo_t) -> bool {
         self.si_signo == other.si_signo
@@ -285,6 +309,18 @@ impl PartialEq for siginfo_t {
 #[cfg(feature = "extra_traits")]
 impl Eq for siginfo_t {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for siginfo_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("siginfo_t")
+            .field("si_signo", &self.si_signo)
+            .field("si_errno", &self.si_errno)
+            .field("si_code", &self.si_code)
+            // Ignore _pad
+            // Ignore _align
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for lastlog {
     fn eq(&self, other: &lastlog) -> bool {
         self.ll_time == other.ll_time
@@ -303,6 +339,16 @@ impl PartialEq for lastlog {
 #[cfg(feature = "extra_traits")]
 impl Eq for lastlog {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for lastlog {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("lastlog")
+            .field("ll_time", &self.ll_time)
+            .field("ll_line", &self.ll_line)
+            .field("ll_host", &self.ll_host)
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for utmp {
     fn eq(&self, other: &utmp) -> bool {
         self.ut_type == other.ut_type
@@ -332,6 +378,24 @@ impl PartialEq for utmp {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for utmp {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for utmp {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("utmp")
+            .field("ut_type", &self.ut_type)
+            .field("ut_pid", &self.ut_pid)
+            .field("ut_line", &self.ut_line)
+            .field("ut_id", &self.ut_id)
+            .field("ut_user", &self.ut_user)
+            .field("ut_host", &self.ut_host)
+            .field("ut_exit", &self.ut_exit)
+            .field("ut_session", &self.ut_session)
+            .field("ut_tv", &self.ut_tv)
+            .field("ut_addr_v6", &self.ut_addr_v6)
+            .field("unused", &self.unused)
+            .finish()
+    }
+}
 
 pub const O_TRUNC: ::c_int = 512;
 pub const O_CLOEXEC: ::c_int = 0x80000;
diff --git a/src/unix/notbsd/linux/mod.rs b/src/unix/notbsd/linux/mod.rs
index bedcef2aa4b6a4bf92fb1dfa4dac936f352cc554..b0eac45b66781e5ca3c1d6b7c82663fb1c47a2e3 100644
--- a/src/unix/notbsd/linux/mod.rs
+++ b/src/unix/notbsd/linux/mod.rs
@@ -675,6 +675,18 @@ impl PartialEq for dirent {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for dirent {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for dirent {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("dirent")
+            .field("d_ino", &self.d_ino)
+            .field("d_off", &self.d_off)
+            .field("d_reclen", &self.d_reclen)
+            .field("d_type", &self.d_type)
+            // FIXME: .field("d_name", &self.d_name)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for dirent64 {
@@ -692,6 +704,18 @@ impl PartialEq for dirent64 {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for dirent64 {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for dirent64 {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("dirent64")
+            .field("d_ino", &self.d_ino)
+            .field("d_off", &self.d_off)
+            .field("d_reclen", &self.d_reclen)
+            .field("d_type", &self.d_type)
+            // FIXME: .field("d_name", &self.d_name)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_cond_t {
@@ -701,6 +725,14 @@ impl PartialEq for pthread_cond_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_cond_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_cond_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_cond_t")
+            // FIXME: .field("size", &self.size)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_mutex_t {
@@ -710,6 +742,14 @@ impl PartialEq for pthread_mutex_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_mutex_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_mutex_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_mutex_t")
+            // FIXME: .field("size", &self.size)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for pthread_rwlock_t {
@@ -719,6 +759,14 @@ impl PartialEq for pthread_rwlock_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for pthread_rwlock_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for pthread_rwlock_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("pthread_rwlock_t")
+            // FIXME: .field("size", &self.size)
+            .finish()
+    }
+}
 
 pub const ABDAY_1: ::nl_item = 0x20000;
 pub const ABDAY_2: ::nl_item = 0x20001;
diff --git a/src/unix/notbsd/linux/musl/b32/x86.rs b/src/unix/notbsd/linux/musl/b32/x86.rs
index 222868e6dc39b58a07e239edf08803549237f8c2..9b79356f5082f5215ba18794fa2aae1640ae0a8f 100644
--- a/src/unix/notbsd/linux/musl/b32/x86.rs
+++ b/src/unix/notbsd/linux/musl/b32/x86.rs
@@ -194,6 +194,19 @@ impl PartialEq for ucontext_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for ucontext_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for ucontext_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("ucontext_t")
+            .field("uc_flags", &self.uc_flags)
+            .field("uc_link", &self.uc_link)
+            .field("uc_stack", &self.uc_stack)
+            .field("uc_mcontext", &self.uc_mcontext)
+            .field("uc_sigmask", &self.uc_sigmask)
+            // Ignore __private field
+            .finish()
+    }
+}
 
 pub const SIGSTKSZ: ::size_t = 8192;
 pub const MINSIGSTKSZ: ::size_t = 2048;
diff --git a/src/unix/notbsd/linux/musl/b64/x86_64.rs b/src/unix/notbsd/linux/musl/b64/x86_64.rs
index 1033e6c6959d4dc05d9670688eedcef1d87a7dbc..1679a3ab0228f6bf87f2d77a91e85c619399e7d0 100644
--- a/src/unix/notbsd/linux/musl/b64/x86_64.rs
+++ b/src/unix/notbsd/linux/musl/b64/x86_64.rs
@@ -92,6 +92,19 @@ impl PartialEq for ucontext_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for ucontext_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for ucontext_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("ucontext_t")
+            .field("uc_flags", &self.uc_flags)
+            .field("uc_link", &self.uc_link)
+            .field("uc_stack", &self.uc_stack)
+            .field("uc_mcontext", &self.uc_mcontext)
+            .field("uc_sigmask", &self.uc_sigmask)
+            // Ignore __private field
+            .finish()
+    }
+}
 
 // Syscall table
 
diff --git a/src/unix/notbsd/linux/musl/mod.rs b/src/unix/notbsd/linux/musl/mod.rs
index 7eb52fc23586c46b042eeed7cf9d35cfa5c1d071..6d1a0a13d6685ed463b7fdaedf9dbe813503e9de 100644
--- a/src/unix/notbsd/linux/musl/mod.rs
+++ b/src/unix/notbsd/linux/musl/mod.rs
@@ -120,6 +120,27 @@ impl PartialEq for sysinfo {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for sysinfo {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for sysinfo {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("sysinfo")
+            .field("uptime", &self.uptime)
+            .field("loads", &self.loads)
+            .field("totalram", &self.totalram)
+            .field("freeram", &self.freeram)
+            .field("sharedram", &self.sharedram)
+            .field("bufferram", &self.bufferram)
+            .field("totalswap", &self.totalswap)
+            .field("freeswap", &self.freeswap)
+            .field("procs", &self.procs)
+            .field("pad", &self.pad)
+            .field("totalhigh", &self.totalhigh)
+            .field("freehigh", &self.freehigh)
+            .field("mem_unit", &self.mem_unit)
+            // FIXME: .field("__reserved", &self.__reserved)
+            .finish()
+    }
+}
 
 pub const SFD_CLOEXEC: ::c_int = 0x080000;
 
diff --git a/src/unix/notbsd/linux/other/b32/x86.rs b/src/unix/notbsd/linux/other/b32/x86.rs
index 2d262b3b3eeeeda9d5e7c5a6d6b14b969946af7a..d3186c0fb1191341531d9ab9eb602c11193e910e 100644
--- a/src/unix/notbsd/linux/other/b32/x86.rs
+++ b/src/unix/notbsd/linux/other/b32/x86.rs
@@ -236,6 +236,26 @@ impl PartialEq for user_fpxregs_struct {
 #[cfg(feature = "extra_traits")]
 impl Eq for user_fpxregs_struct {}
 #[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for user_fpxregs_struct {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("user_fpxregs_struct")
+            .field("cwd", &self.cwd)
+            .field("swd", &self.swd)
+            .field("twd", &self.twd)
+            .field("fop", &self.fop)
+            .field("fip", &self.fip)
+            .field("fcs", &self.fcs)
+            .field("foo", &self.foo)
+            .field("fos", &self.fos)
+            .field("mxcsr", &self.mxcsr)
+            // Ignore __reserved field
+            .field("st_space", &self.st_space)
+            .field("xmm_space", &self.xmm_space)
+            // Ignore padding field
+            .finish()
+    }
+}
+#[cfg(feature = "extra_traits")]
 impl PartialEq for ucontext_t {
     fn eq(&self, other: &ucontext_t) -> bool {
         self.uc_flags == other.uc_flags
@@ -248,6 +268,19 @@ impl PartialEq for ucontext_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for ucontext_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for ucontext_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("ucontext_t")
+            .field("uc_flags", &self.uc_flags)
+            .field("uc_link", &self.uc_link)
+            .field("uc_stack", &self.uc_stack)
+            .field("uc_mcontext", &self.uc_mcontext)
+            .field("uc_sigmask", &self.uc_sigmask)
+            // Ignore __private field
+            .finish()
+    }
+}
 
 pub const O_DIRECT: ::c_int = 0x4000;
 pub const O_DIRECTORY: ::c_int = 0x10000;
diff --git a/src/unix/notbsd/linux/other/b64/x86_64.rs b/src/unix/notbsd/linux/other/b64/x86_64.rs
index 2257ea4267a0148b2ebb8139195b6fa4624404c3..02745b90564853ca5bb845ad798ec9ac7753c220 100644
--- a/src/unix/notbsd/linux/other/b64/x86_64.rs
+++ b/src/unix/notbsd/linux/other/b64/x86_64.rs
@@ -256,6 +256,23 @@ impl PartialEq for user_fpregs_struct {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for user_fpregs_struct {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for user_fpregs_struct {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("user_fpregs_struct")
+            .field("cwd", &self.cwd)
+            .field("ftw", &self.ftw)
+            .field("fop", &self.fop)
+            .field("rip", &self.rip)
+            .field("rdp", &self.rdp)
+            .field("mxcsr", &self.mxcsr)
+            .field("mxcr_mask", &self.mxcr_mask)
+            .field("st_space", &self.st_space)
+            // FIXME: .field("xmm_space", &self.xmm_space)
+            // Ignore padding field
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for ucontext_t {
@@ -270,6 +287,19 @@ impl PartialEq for ucontext_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for ucontext_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for ucontext_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("ucontext_t")
+            .field("uc_flags", &self.uc_flags)
+            .field("uc_link", &self.uc_link)
+            .field("uc_stack", &self.uc_stack)
+            .field("uc_mcontext", &self.uc_mcontext)
+            .field("uc_sigmask", &self.uc_sigmask)
+            // Ignore __private field
+            .finish()
+    }
+}
 
 pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
 pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
diff --git a/src/unix/notbsd/linux/other/mod.rs b/src/unix/notbsd/linux/other/mod.rs
index 67ddda300a0d2d67ffa31c87e97a76e766c9b1d6..fa0e39ba447bf46902ffc64c017b87b4922f0d07 100644
--- a/src/unix/notbsd/linux/other/mod.rs
+++ b/src/unix/notbsd/linux/other/mod.rs
@@ -268,6 +268,24 @@ impl PartialEq for utmpx {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for utmpx {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for utmpx {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("utmpx")
+            .field("ut_type", &self.ut_type)
+            .field("ut_pid", &self.ut_pid)
+            .field("ut_line", &self.ut_line)
+            .field("ut_id", &self.ut_id)
+            .field("ut_user", &self.ut_user)
+            // FIXME: .field("ut_host", &self.ut_host)
+            .field("ut_exit", &self.ut_exit)
+            .field("ut_session", &self.ut_session)
+            .field("ut_tv", &self.ut_tv)
+            .field("ut_addr_v6", &self.ut_addr_v6)
+            .field("__glibc_reserved", &self.__glibc_reserved)
+            .finish()
+    }
+}
 
 pub const __UT_LINESIZE: usize = 32;
 pub const __UT_NAMESIZE: usize = 32;
diff --git a/src/unix/notbsd/linux/s390x.rs b/src/unix/notbsd/linux/s390x.rs
index 6f21e94785fc7dcd0eb4608e466bb95e22a35baf..8a6b88a8180e9cfcccf3c92b7aa5c7bed6e45efb 100644
--- a/src/unix/notbsd/linux/s390x.rs
+++ b/src/unix/notbsd/linux/s390x.rs
@@ -344,6 +344,14 @@ impl PartialEq for fpreg_t {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for fpreg_t {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for fpreg_t {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("fpreg_t")
+            .field("d", &self.d)
+            .finish()
+    }
+}
 
 pub const SFD_CLOEXEC: ::c_int = 0x080000;
 
diff --git a/src/unix/notbsd/mod.rs b/src/unix/notbsd/mod.rs
index 9caa2866e53b00a828fe902c35de7e68f6ec5a63..cd613d448ca813ffd8a35ce20c2d3d81842bbbc0 100644
--- a/src/unix/notbsd/mod.rs
+++ b/src/unix/notbsd/mod.rs
@@ -245,6 +245,15 @@ impl PartialEq for sockaddr_un {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for sockaddr_un {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for sockaddr_un {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("sockaddr_un")
+            .field("sun_family", &self.sun_family)
+            // FIXME: .field("sun_path", &self.sun_path)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for sockaddr_storage {
@@ -259,6 +268,16 @@ impl PartialEq for sockaddr_storage {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for sockaddr_storage {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for sockaddr_storage {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("sockaddr_storage")
+            .field("ss_family", &self.ss_family)
+            .field("__ss_align", &self.__ss_align)
+            // FIXME: .field("__ss_pad2", &self.__ss_pad2)
+            .finish()
+    }
+}
 
 #[cfg(feature = "extra_traits")]
 impl PartialEq for utsname {
@@ -296,6 +315,20 @@ impl PartialEq for utsname {
 }
 #[cfg(feature = "extra_traits")]
 impl Eq for utsname {}
+#[cfg(feature = "extra_traits")]
+impl std::fmt::Debug for utsname {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("utsname")
+            // FIXME: .field("sysname", &self.sysname)
+            // FIXME: .field("nodename", &self.nodename)
+            // FIXME: .field("release", &self.release)
+            // FIXME: .field("version", &self.version)
+            // FIXME: .field("machine", &self.machine)
+            // FIXME: .field("domainname", &self.domainname)
+            .finish()
+    }
+}
+
 // intentionally not public, only used for fd_set
 cfg_if! {
     if #[cfg(target_pointer_width = "32")] {