[PATCH v2 4/5] Extend -Y option to decode PIDS in arguments and retvals

Masatake YAMATO yamato at redhat.com
Tue Aug 24 19:26:42 UTC 2021


From: <yamato at redhat.com>

From: Masatake YAMATO <yamato at redhat.com>

This change introduces -YY,--decode-pids=all option.  In addition to
what printed -Y option, the new options print command names for PIDS
appeared in arguments and retvals.

An example:

  getppid()                  = 3781395<strace>
  getpid()                   = 3781398<a.out>
  pidfd_open(1<systemd>, 0)  = 3<pid:1<systemd>>

* src/defs.h (maybe_printpid_comm): New function declaration.
* src/strace.c (maybe_printpid_comm): New function printing
command name for given PID.
(usage): Add help message for the -YY option.
(init): Add -YY and --decode-pids=all options.
* src/pidns.c (printpid_translation,printpid,printpid_tgid_pgid): call
`maybe_printpid_comm'.
* src/filter_qualify.c (qualify_decode_pid): Handle "all" specified in
--decode-pids=all.
* src/time.c (printclockname): Print command name for pid.
* src/util.c (printpidfd): Ditto.
* doc/strace.1.in (.SS Output format): document the -YY option.

Signed-off-by: Masatake YAMATO <yamato at redhat.com>
---
 doc/strace.1.in      |  6 ++++++
 src/defs.h           |  2 ++
 src/filter_qualify.c |  2 ++
 src/pidns.c          | 11 +++++++++--
 src/strace.c         | 24 ++++++++++++++++++++++--
 src/time.c           |  4 +++-
 src/util.c           |  1 +
 7 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/doc/strace.1.in b/doc/strace.1.in
index 99fba9076..28358f7df 100644
--- a/doc/strace.1.in
+++ b/doc/strace.1.in
@@ -1089,6 +1089,12 @@ and PIDs associated with pidfd file descriptors.
 .BR \-\-decode\-pids = prefix
 Print command names for PIDs that appear as the prefixes of trace lines.
 .TP
+.B \-YY
+.TQ
+.BR \-\-decode\-pids = all
+Print command names for PIDs that appear in arguments and return values
+in addition to what printed with \-Y option.
+.TP
 .B \-\-pidns\-translation
 If strace and tracee are in different PID namespaces, print PIDs in
 strace's namespace, too.
diff --git a/src/defs.h b/src/defs.h
index 33f44dd64..5a4d418ee 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -1909,4 +1909,6 @@ print_big_u64_addr(const uint64_t addr)
 # endif
 
 void maybe_load_task_comm(struct tcb *tcp);
+/* print the content of /proc/$pid/comm. */
+void maybe_printpid_comm(int pid);
 #endif /* !STRACE_DEFS_H */
diff --git a/src/filter_qualify.c b/src/filter_qualify.c
index 24e840c2f..b871176b1 100644
--- a/src/filter_qualify.c
+++ b/src/filter_qualify.c
@@ -468,6 +468,8 @@ qualify_decode_pid(const char *const str)
 {
 	if (strcmp(str, "prefix") == 0)
 		decode_pids_enabled = 1;
+	else if (strcmp(str, "all") == 0)
+		decode_pids_enabled = 2;
 	else
 		error_msg_and_die("invalid --decode-pids = argument: '%s'", str);
 }
diff --git a/src/pidns.c b/src/pidns.c
index d3ebd0535..57f695d22 100644
--- a/src/pidns.c
+++ b/src/pidns.c
@@ -586,6 +586,8 @@ printpid_translation(struct tcb *tcp, int pid, enum pid_type type)
 		return;
 
 	int strace_pid = translate_pid(tcp, pid, type, NULL);
+	if (strace_pid && (type == PT_TID || type == PT_TGID))
+		maybe_printpid_comm(strace_pid);
 	if (strace_pid && strace_pid != pid)
 		tprintf_comment("%d in strace's PID NS", strace_pid);
 }
@@ -594,6 +596,9 @@ void
 printpid(struct tcb *tcp, int pid, enum pid_type type)
 {
 	PRINT_VAL_D(pid);
+	if (!pidns_translation
+	    && (type == PT_TID || type == PT_TGID))
+		maybe_printpid_comm(pid);
 	printpid_translation(tcp, pid, type);
 }
 
@@ -601,8 +606,10 @@ void
 printpid_tgid_pgid(struct tcb *tcp, int pid)
 {
 	PRINT_VAL_D(pid);
-	if (pid > 0)
+	if (pid > 0) {
+		if (!pidns_translation)
+			maybe_printpid_comm(pid);
 		printpid_translation(tcp,  pid, PT_TGID);
-	else if (pid < -1)
+	} else if (pid < -1)
 		printpid_translation(tcp, -pid, PT_PGID);
 }
diff --git a/src/strace.c b/src/strace.c
index 26d11b271..da4178367 100644
--- a/src/strace.c
+++ b/src/strace.c
@@ -53,7 +53,9 @@ bool stack_trace_enabled;
 #endif
 
 /* if this is non-zero 
- * print the process names read from /proc/$pid/comm files */
+ * print the process names read from /proc/$pid/comm files
+ * 1: prefix
+ * 2: all (prefix, arguments and return values) */
 unsigned decode_pids_enabled;
 
 #define my_tkill(tid, sig) syscall(__NR_tkill, (tid), (sig))
@@ -421,6 +423,10 @@ Output format:\n\
   -Y, --decode-pids[=prefix]\n\
                  print command names associated with the pids appeared\n\
                  as prefixes of trace lines\n\
+  -YY, --decode-pids=all\n\
+                 print command names associated with the pids appeared\n\
+                 as arguments and return values in addition to what printed\n\
+                 with -Y option.\n\
 "
 #ifdef ENABLE_SECONTEXT
 "\
@@ -946,6 +952,19 @@ load_pid_comm(int pid, char *buf, size_t buf_size)
 	fclose(fp);
 }
 
+void
+maybe_printpid_comm(int pid)
+{
+	if (decode_pids_enabled < 2)
+		return;
+
+	char buf[PROC_COMM_LEN];
+	load_pid_comm(pid, buf, sizeof(buf));
+	tprints("<");
+	tprints(buf);
+	tprints(">");
+}
+
 void
 maybe_load_task_comm(struct tcb *tcp)
 {
@@ -2039,6 +2058,7 @@ init(int argc, char *argv[])
 	static const char yflag_qual[] = "path";
 	static const char yyflag_qual[] = "all";
 	static const char Yflag_qual[] = "prefix";
+	static const char YYflag_qual[] = "all";
 	static const char tflag_str[] = "format:time";
 	static const char ttflag_str[] = "precision:us,format:time";
 	static const char tttflag_str[] = "format:unix,precision:us";
@@ -2532,7 +2552,7 @@ init(int argc, char *argv[])
 					  " be provided simultaneously");
 		}
 
-		qualify_decode_pid(Yflag_qual);
+		qualify_decode_pid(Yflag_short == 1 ? Yflag_qual : YYflag_qual);
 	}
 	/* If --decode-pids option comes after -p, comm fields of tcbs
 	 * are not filled though tcbs are initialized. We must fill the
diff --git a/src/time.c b/src/time.c
index 2b0ded515..343342465 100644
--- a/src/time.c
+++ b/src/time.c
@@ -253,7 +253,9 @@ printclockname(int clockid)
 			tprints_arg_begin(CPUCLOCK_PERTHREAD(clockid) ?
 					  "MAKE_THREAD_CPUCLOCK" :
 					  "MAKE_PROCESS_CPUCLOCK");
-			PRINT_VAL_D(CPUCLOCK_PID(clockid));
+			int pid = CPUCLOCK_PID(clockid);
+			PRINT_VAL_D(pid);
+			maybe_printpid_comm(pid);
 			tprint_arg_next();
 			printxval(cpuclocknames, clockid & CLOCKFD_MASK,
 				  "CPUCLOCK_???");
diff --git a/src/util.c b/src/util.c
index a22d4095f..d40184963 100644
--- a/src/util.c
+++ b/src/util.c
@@ -642,6 +642,7 @@ printpidfd(pid_t pid_of_fd, int fd, const char *path)
 
 	tprints("pid:");
 	PRINT_VAL_D(pid);
+	maybe_printpid_comm(pid);
 	return true;
 }
 
-- 
2.31.1



More information about the Strace-devel mailing list