improved SI_TIMER decoding

enh enh at google.com
Fri Mar 7 02:20:50 UTC 2014


Decode siginfo_t more clearly for si_code SI_TIMER.

The 'pid' is actually a POSIX timer id, and the 'uid' is actually the overrun.

Also factor out the si_value dumping so it's the same for every si_code.

Signed-off-by: Elliott Hughes <enh at google.com>
-------------- next part --------------
diff --git a/signal.c b/signal.c
index ce8ec0a..69fea37 100644
--- a/signal.c
+++ b/signal.c
@@ -499,6 +499,17 @@ static const struct xlat sigbus_codes[] = {
 	XLAT_END
 };
 
+static void
+printsigval(siginfo_t *sip, int verbose)
+{
+	if (!verbose)
+		tprints(", ...");
+	else
+		tprintf(", si_value={int=%u, ptr=%#lx}",
+			sip->si_int,
+			(unsigned long) sip->si_ptr);
+}
+
 void
 printsiginfo(siginfo_t *sip, int verbose)
 {
@@ -561,32 +572,35 @@ printsiginfo(siginfo_t *sip, int verbose)
 		}
 #ifdef SI_FROMUSER
 		if (SI_FROMUSER(sip)) {
-			tprintf(", si_pid=%lu, si_uid=%lu",
-				(unsigned long) sip->si_pid,
-				(unsigned long) sip->si_uid);
 			switch (sip->si_code) {
 #ifdef SI_USER
 			case SI_USER:
+				tprintf(", si_pid=%lu, si_uid=%lu",
+					(unsigned long) sip->si_pid,
+					(unsigned long) sip->si_uid);
 				break;
 #endif
 #ifdef SI_TKILL
 			case SI_TKILL:
+				tprintf(", si_pid=%lu, si_uid=%lu",
+					(unsigned long) sip->si_pid,
+					(unsigned long) sip->si_uid);
 				break;
 #endif
 #ifdef SI_TIMER
 			case SI_TIMER:
-				tprintf(", si_value=%d", sip->si_int);
+				tprintf(", si_timerid=%#x, si_overrun=%d",
+					sip->si_timerid, sip->si_overrun);
+				printsigval(sip, verbose);
 				break;
 #endif
 			default:
+			tprintf(", si_pid=%lu, si_uid=%lu",
+				(unsigned long) sip->si_pid,
+				(unsigned long) sip->si_uid);
 				if (!sip->si_ptr)
 					break;
-				if (!verbose)
-					tprints(", ...");
-				else
-					tprintf(", si_value={int=%u, ptr=%#lx}",
-						sip->si_int,
-						(unsigned long) sip->si_ptr);
+				printsigval(sip, verbose);
 				break;
 			}
 		}
@@ -628,13 +642,7 @@ printsiginfo(siginfo_t *sip, int verbose)
 						(unsigned long) sip->si_uid);
 				if (!sip->si_ptr)
 					break;
-				if (!verbose)
-					tprints(", ...");
-				else {
-					tprintf(", si_value={int=%u, ptr=%#lx}",
-						sip->si_int,
-						(unsigned long) sip->si_ptr);
-				}
+				printsigval(sip, verbose);
 
 			}
 		}


More information about the Strace-devel mailing list